import { useState } from "react"; import { Plus, RefreshCw, Search, Trash2 } from "lucide-react"; // Tipo estendido para incluir campos adicionais interface ConsultaExtended { id: string; dataHora?: string; pacienteNome?: string; medicoNome?: string; tipo?: string; status?: string; } interface ConsultasSectionProps { consultas: ConsultaExtended[]; loading: boolean; onRefresh: () => void; onNovaConsulta: () => void; onDeleteConsulta: (id: string) => void; onAlterarStatus: (id: string, status: string) => void; } export default function ConsultasSection({ consultas, loading, onRefresh, onNovaConsulta, onDeleteConsulta, onAlterarStatus, }: ConsultasSectionProps) { const [searchTerm, setSearchTerm] = useState(""); const [filtroDataDe, setFiltroDataDe] = useState(""); const [filtroDataAte, setFiltroDataAte] = useState(""); const [filtroStatus, setFiltroStatus] = useState(""); const [filtroPaciente, setFiltroPaciente] = useState(""); const [filtroMedico, setFiltroMedico] = useState(""); const formatDateTimeLocal = (dateStr: string | undefined) => { if (!dateStr) return "-"; try { const date = new Date(dateStr); return date.toLocaleString("pt-BR", { day: "2-digit", month: "2-digit", year: "numeric", hour: "2-digit", minute: "2-digit", }); } catch { return dateStr; } }; // Filtrar consultas const consultasFiltradas = consultas.filter((c) => { // Filtro de busca rápida if (searchTerm) { const search = searchTerm.toLowerCase(); const matchPaciente = c.pacienteNome?.toLowerCase().includes(search); const matchMedico = c.medicoNome?.toLowerCase().includes(search); const matchTipo = c.tipo?.toLowerCase().includes(search); if (!matchPaciente && !matchMedico && !matchTipo) return false; } // Filtro por data de if (filtroDataDe && c.dataHora) { const consultaDate = new Date(c.dataHora).toISOString().split("T")[0]; if (consultaDate < filtroDataDe) return false; } // Filtro por data até if (filtroDataAte && c.dataHora) { const consultaDate = new Date(c.dataHora).toISOString().split("T")[0]; if (consultaDate > filtroDataAte) return false; } // Filtro por status if (filtroStatus && c.status !== filtroStatus) return false; // Filtro por paciente if ( filtroPaciente && !c.pacienteNome?.toLowerCase().includes(filtroPaciente.toLowerCase()) ) { return false; } // Filtro por médico if ( filtroMedico && !c.medicoNome?.toLowerCase().includes(filtroMedico.toLowerCase()) ) { return false; } return true; }); return (
{/* Header */}

Consultas

Gerencie todas as consultas agendadas

{/* Search and Filters */}
setSearchTerm(e.target.value)} className="pl-10 w-full h-10 px-3 rounded-md border border-input bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-ring" />
setFiltroDataDe(e.target.value)} className="w-full h-9 px-3 rounded-md border border-input bg-background text-foreground text-sm focus:outline-none focus:ring-2 focus:ring-ring" />
setFiltroDataAte(e.target.value)} className="w-full h-9 px-3 rounded-md border border-input bg-background text-foreground text-sm focus:outline-none focus:ring-2 focus:ring-ring" />
setFiltroPaciente(e.target.value)} className="w-full h-9 px-3 rounded-md border border-input bg-background text-foreground text-sm focus:outline-none focus:ring-2 focus:ring-ring" placeholder="Filtrar paciente" />
setFiltroMedico(e.target.value)} className="w-full h-9 px-3 rounded-md border border-input bg-background text-foreground text-sm focus:outline-none focus:ring-2 focus:ring-ring" placeholder="Filtrar médico" />
{/* Appointments Table */}
{loading ? (
) : consultasFiltradas.length === 0 ? (

Nenhum agendamento encontrado. Use a aba "Agenda" para gerenciar horários dos médicos.

) : ( {consultasFiltradas.map((consulta) => ( ))}
Data/Hora Paciente Médico Tipo Status Ações
{formatDateTimeLocal(consulta.dataHora)} {consulta.pacienteNome} {consulta.medicoNome} {consulta.tipo}
)}
); }