"use client"; import { useState, useEffect } from "react"; 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, } from "@/components/ui/dialog"; import { Calendar, Clock, MapPin, Phone, User, X, AlertCircle, } from "lucide-react"; import { toast } from "sonner"; import { appointmentsService } from "@/services/appointmentsApi.mjs"; import { usersService } from "@/services/usersApi.mjs"; import { doctorsService } from "@/services/doctorsApi.mjs"; import Sidebar from "@/components/Sidebar"; export default function PatientAppointmentsPage() { const [appointments, setAppointments] = useState([]); const [isLoading, setIsLoading] = useState(true); // Estados para cancelamento const [cancelModal, setCancelModal] = useState(false); const [selectedAppointment, setSelectedAppointment] = useState(null); const fetchData = async () => { setIsLoading(true); try { // 1. Obter usuário logado const user = await usersService.getMe(); if (!user || !user.user?.id) { toast.error("Usuário não identificado."); return; } // 2. Buscar médicos e agendamentos em paralelo // Filtra apenas agendamentos deste paciente const queryParams = `patient_id=eq.${"user.user.id"}&order=scheduled_at.desc`; console.log("id do paciente:", user.profile.id); const [appointmentList, doctorList] = await Promise.all([ appointmentsService.search_appointment(queryParams), doctorsService.list(), ]); console.log("Agendamentos obtidos:", appointmentList); console.log("Médicos obtidos:", doctorList); // 3. Mapear médicos para acesso rápido const doctorMap = new Map(doctorList.map((d: any) => [d.id, d])); // 4. Enriquecer os agendamentos com dados do médico const enrichedAppointments = appointmentList.map((apt: any) => ({ ...apt, doctor: doctorMap.get(apt.doctor_id) || { full_name: "Médico não encontrado", specialty: "Clínico Geral", location: "Consultório", phone: "N/A" }, })); console.log("Agendamentos enriquecidos:", enrichedAppointments); setAppointments(enrichedAppointments); } catch (error) { console.error("Erro ao buscar dados:", error); toast.error("Não foi possível carregar suas consultas."); } finally { setIsLoading(false); } }; useEffect(() => { fetchData(); }, []); // --- LÓGICA DE CANCELAMENTO --- const handleCancelClick = (appointment: any) => { setSelectedAppointment(appointment); setCancelModal(true); }; const confirmCancel = async () => { if (!selectedAppointment) return; try { // Opção A: Deletar o registro (como no código da secretária) await appointmentsService.delete(selectedAppointment.id); // Opção B: Se preferir apenas mudar o status, descomente abaixo e comente a linha acima: // await appointmentsService.update(selectedAppointment.id, { status: 'cancelled' }); setAppointments((prev) => prev.filter((apt) => apt.id !== selectedAppointment.id) ); setCancelModal(false); toast.success("Consulta cancelada com sucesso."); } catch (error) { console.error("Erro ao cancelar consulta:", error); toast.error("Não foi possível cancelar a consulta."); } }; return (

Minhas Consultas

Acompanhe seu histórico e próximos agendamentos

{isLoading ? (

Carregando consultas...

) : appointments.length > 0 ? ( appointments.map((appointment) => (
{appointment.doctor.full_name} {appointment.doctor.specialty}
{getStatusBadge(appointment.status)}
{/* Coluna 1: Data e Hora */}
Dr(a). {appointment.doctor.full_name.split(' ')[0]}
{new Date(appointment.scheduled_at).toLocaleDateString( "pt-BR", { timeZone: "UTC" } )}
{new Date(appointment.scheduled_at).toLocaleTimeString( "pt-BR", { hour: "2-digit", minute: "2-digit", timeZone: "UTC", } )}
{/* Coluna 2: Localização e Contato */}
{appointment.doctor.location || "Local a definir"}
{appointment.doctor.phone || "Contato não disponível"}
{/* Ações */} {["requested", "confirmed"].includes(appointment.status) && (
)}
)) ) : (

Você ainda não possui consultas agendadas.

)}
{/* Modal de Confirmação de Cancelamento */} Cancelar Consulta Tem certeza que deseja cancelar sua consulta com{" "} {selectedAppointment?.doctor?.full_name} no dia{" "} {selectedAppointment && new Date(selectedAppointment.scheduled_at).toLocaleDateString( "pt-BR", { timeZone: "UTC" } )} ? Esta ação não pode ser desfeita.
); } // Helper para Badges (Mantido consistente com o código da secretária) const getStatusBadge = (status: string) => { switch (status) { case "requested": return ( Solicitada ); case "confirmed": return Confirmada; case "checked_in": return ( Check-in ); case "completed": return Realizada; case "cancelled": return Cancelada; case "no_show": return ( Não Compareceu ); default: return {status}; } };