"use client"; import { useState } from "react"; import Link from "next/link"; import { toast } from "sonner"; import { useAppointments, Appointment } from "../../context/AppointmentsContext"; // Componentes de UI e Ícones import PatientLayout from "@/components/patient-layout"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogClose } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Calendar, Clock, MapPin, Phone, CalendarDays, X, Trash2 } from "lucide-react"; export default function PatientAppointmentsPage() { const { appointments, updateAppointment, deleteAppointment } = useAppointments(); // Estados para controlar os modais e os dados do formulário const [isRescheduleModalOpen, setRescheduleModalOpen] = useState(false); const [isCancelModalOpen, setCancelModalOpen] = useState(false); const [selectedAppointment, setSelectedAppointment] = useState(null); const [rescheduleData, setRescheduleData] = useState({ date: "", time: "", reason: "" }); const [cancelReason, setCancelReason] = useState(""); // --- MANIPULADORES DE EVENTOS --- const handleRescheduleClick = (appointment: Appointment) => { setSelectedAppointment(appointment); // Preenche o formulário com os dados atuais da consulta setRescheduleData({ date: appointment.date, time: appointment.time, reason: appointment.observations || "" }); setRescheduleModalOpen(true); }; const handleCancelClick = (appointment: Appointment) => { setSelectedAppointment(appointment); setCancelReason(""); // Limpa o motivo ao abrir setCancelModalOpen(true); }; const confirmReschedule = () => { if (!rescheduleData.date || !rescheduleData.time) { toast.error("Por favor, selecione uma nova data e horário"); return; } if (selectedAppointment) { updateAppointment(selectedAppointment.id, { date: rescheduleData.date, time: rescheduleData.time, observations: rescheduleData.reason, // Atualiza as observações com o motivo }); toast.success("Consulta reagendada com sucesso!"); setRescheduleModalOpen(false); } }; const confirmCancel = () => { if (cancelReason.trim().length < 10) { toast.error("Por favor, forneça um motivo com pelo menos 10 caracteres."); return; } if (selectedAppointment) { // Apenas atualiza o status e adiciona o motivo do cancelamento nas observações updateAppointment(selectedAppointment.id, { status: "Cancelada", observations: `Motivo do cancelamento: ${cancelReason}` }); toast.success("Consulta cancelada com sucesso!"); setCancelModalOpen(false); } }; const handleDeleteClick = (appointmentId: string) => { if (window.confirm("Tem certeza que deseja excluir permanentemente esta consulta? Esta ação não pode ser desfeita.")) { deleteAppointment(appointmentId); toast.success("Consulta excluída do histórico."); } }; // --- LÓGICA AUXILIAR --- const getStatusBadge = (status: Appointment['status']) => { switch (status) { case "Agendada": return Agendada; case "Realizada": return Realizada; case "Cancelada": return Cancelada; } }; const timeSlots = ["08:00", "08:30", "09:00", "09:30", "10:00", "10:30", "14:00", "14:30", "15:00", "15:30"]; const today = new Date(); today.setHours(0, 0, 0, 0); // Zera o horário para comparar apenas o dia // ETAPA 1: ORDENAÇÃO DAS CONSULTAS // Cria uma cópia do array e o ordena const sortedAppointments = [...appointments].sort((a, b) => { const statusWeight = { 'Agendada': 1, 'Realizada': 2, 'Cancelada': 3 }; // Primeiro, ordena por status (Agendada vem primeiro) if (statusWeight[a.status] !== statusWeight[b.status]) { return statusWeight[a.status] - statusWeight[b.status]; } // Se o status for o mesmo, ordena por data (mais recente/futura no topo) return new Date(b.date).getTime() - new Date(a.date).getTime(); }); return (

Minhas Consultas

Histórico e consultas agendadas

{/* Utiliza o array ORDENADO para a renderização */} {sortedAppointments.map((appointment) => { const appointmentDate = new Date(appointment.date); let displayStatus = appointment.status; if (appointment.status === 'Agendada' && appointmentDate < today) { displayStatus = 'Realizada'; } return (
{appointment.doctorName} {appointment.specialty}
{getStatusBadge(displayStatus)}
{new Date(appointment.date).toLocaleDateString("pt-BR", { timeZone: 'UTC' })}
{appointment.time}
{appointment.location || 'Local não informado'}
{appointment.phone || 'Telefone não informado'}
{/* Container ÚNICO para todas as ações */}
{(displayStatus === "Agendada") && ( <> )} {(displayStatus === "Realizada" || displayStatus === "Cancelada") && ( )}
); })}
{/* ETAPA 2: CONSTRUÇÃO DOS MODAIS */} {/* Modal de Reagendamento */} Reagendar Consulta Reagendar consulta com {selectedAppointment?.doctorName}.
setRescheduleData({...rescheduleData, date: e.target.value})} className="col-span-3" />