import React from 'react'; import { Professional } from '../types'; import { Button } from './Button'; import { X, Mail, Phone, MapPin, Building, Star, Camera, DollarSign, Award, User, Car, CreditCard, AlertTriangle, Calendar, Clock, Edit2 } from 'lucide-react'; import { getAgendas } from '../services/apiService'; interface ProfessionalDetailsModalProps { professional: Professional; isOpen: boolean; onClose: () => void; onEdit?: () => void; } import { useAuth } from '../contexts/AuthContext'; import { UserRole } from '../types'; // ... (imports remain) export const ProfessionalDetailsModal: React.FC = ({ professional, isOpen, onClose, onEdit }) => { const { user, token } = useAuth(); const [assignedEvents, setAssignedEvents] = React.useState([]); const [loadingEvents, setLoadingEvents] = React.useState(false); React.useEffect(() => { if (isOpen && user && token && (user.role === UserRole.SUPERADMIN || user.role === UserRole.BUSINESS_OWNER || user.id === professional.usuarioId)) { fetchAssignments(); } }, [isOpen, user, token, professional.id]); const fetchAssignments = async () => { setLoadingEvents(true); const res = await getAgendas(token!); if (res.data) { // Filter events where professional is assigned const filtered = res.data.filter((evt: any) => evt.assigned_professionals?.some((ap: any) => ap.professional_id === professional.id) ); // Sort by date desc filtered.sort((a: any, b: any) => new Date(b.data_evento).getTime() - new Date(a.data_evento).getTime()); setAssignedEvents(filtered); } setLoadingEvents(false); }; if (!isOpen) return null; const canViewDetails = user?.role === UserRole.SUPERADMIN || user?.role === UserRole.BUSINESS_OWNER || (user?.id && professional.usuarioId && user.id === professional.usuarioId); // Also check legacy/fallback logic if needed, but primary is role or ownership const isAdminOrOwner = canViewDetails; // Keeping variable name for now or refactoring below -> refactoring below to use canViewDetails for clarity is better but to minimize diff noise we can keep it or rename it. Let's rename it to avoid confusion. const isMaster = user?.role === UserRole.SUPERADMIN || user?.role === UserRole.BUSINESS_OWNER; return (
{/* Header... (remains same) */}
{/* Avatar... (remains same) */}

{professional.name || professional.nome}

{professional.role || "Profissional"} {/* Performance Rating - Only for Master (Admin/Owner), NOT for the professional themselves */} {isMaster && professional.media !== undefined && professional.media !== null && ( {typeof professional.media === 'number' ? professional.media.toFixed(1) : parseFloat(String(professional.media)).toFixed(1)} )}
{/* Dados Pessoais - Protected */}

Dados Pessoais

{isAdminOrOwner ? (
{professional.email && (
{professional.email}
)} {professional.whatsapp && (
{professional.whatsapp}
)} {(professional.cidade || professional.uf) && (
{professional.cidade}{professional.cidade && professional.uf ? ", " : ""}{professional.uf}
)} {professional.endereco && (
{professional.endereco}
)}
) : (

Informações de contato restritas.

)}
{/* Equipamentos - Public */}

Equipamentos

{professional.equipamentos || "Nenhum equipamento listado."}
{professional.carro_disponivel && ( Carro Próprio )} {professional.tem_estudio && ( Estúdio ({professional.qtd_estudio}) )} {professional.extra_por_equipamento && ( Extra p/ Equip. )}
{/* Dados Financeiros & Performance - Protected */} {isAdminOrOwner && ( <>

Dados Financeiros

CPF/CNPJ Titular {professional.cpf_cnpj_titular || "-"}
Chave Pix {professional.conta_pix || "-"}
Banco / Agência {professional.banco || "-"}{professional.agencia ? ` / ${professional.agencia}` : ""}
Tabela Free R$ {professional.tabela_free || "0,00"}
Tipo de Cartão {professional.tipo_cartao || "-"}
)} {/* Performance / Observations - Protected */} {isMaster && (

Performance & Avaliação

Técnica
{professional.qual_tec || 0}
Simpatia
{professional.educacao_simpatia || 0}
Desempenho
{professional.desempenho_evento || 0}
Horário
{professional.disp_horario || 0}

Média Geral: {professional.media ? (typeof professional.media === 'number' ? professional.media.toFixed(1) : parseFloat(String(professional.media)).toFixed(1)) : "N/A"}

{professional.observacao && (
"{professional.observacao}"
)}
)} {/* Assignments - Protected */} {canViewDetails && (

Eventos Atribuídos

{loadingEvents ? (

Carregando agenda...

) : assignedEvents.length === 0 ? (

Nenhum evento atribuído.

) : (
{assignedEvents.map((evt: any) => (

{evt.empresa_nome || "Empresa"} - {evt.tipo_evento_nome || "Evento"}

{new Date(evt.data_evento).toLocaleDateString()} {evt.horario} {evt.local_evento && {evt.local_evento}}
{evt.status || "Agendado"}
))}
)}
)}
{onEdit && ( )}
); };