"use client"; import { useState, useEffect } from "react"; import PatientLayout from "@/components/patient-layout"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Calendar, Clock, CalendarDays, X } from "lucide-react"; import { toast } from "sonner"; import { appointmentsService } from "@/services/appointmentsApi.mjs"; import { usersService } from "@/services/usersApi.mjs"; // Tipagem correta para o usuário interface UserProfile { id: string; full_name: string; email: string; phone?: string; avatar_url?: string; } interface User { user: { id: string; email: string; }; profile: UserProfile; roles: string[]; permissions?: any; } interface Appointment { id: string; doctor_id: string; scheduled_at: string; status: string; doctorName?: string; } export default function PatientAppointmentsPage() { const [appointments, setAppointments] = useState([]); const [isLoading, setIsLoading] = useState(true); const [userData, setUserData] = useState(null); // --- Busca o usuário logado --- const fetchUser = async () => { try { const user: User = await usersService.getMe(); if (!user.roles.includes("patient") && !user.roles.includes("user")) { toast.error("Apenas pacientes podem visualizar suas consultas."); setIsLoading(false); return null; } setUserData(user); return user; } catch (err) { console.error("Erro ao buscar usuário logado:", err); toast.error("Não foi possível identificar o usuário logado."); setIsLoading(false); return null; } }; // --- Busca consultas do paciente --- const fetchAppointments = async (patientId: string) => { setIsLoading(true); try { const queryParams = `patient_id=eq.${patientId}&order=scheduled_at.desc`; const appointmentsList: Appointment[] = await appointmentsService.search_appointment(queryParams); // Buscar nome do médico para cada consulta const appointmentsWithDoctor = await Promise.all( appointmentsList.map(async (apt) => { let doctorName = apt.doctor_id; if (apt.doctor_id) { try { const doctorInfo = await usersService.full_data(apt.doctor_id); doctorName = doctorInfo?.profile?.full_name || apt.doctor_id; } catch (err) { console.error("Erro ao buscar nome do médico:", err); } } return { ...apt, doctorName }; }) ); setAppointments(appointmentsWithDoctor); } catch (err) { console.error("Erro ao carregar consultas:", err); toast.error("Não foi possível carregar suas consultas."); } finally { setIsLoading(false); } }; useEffect(() => { (async () => { const user = await fetchUser(); if (user?.user.id) { await fetchAppointments(user.user.id); } })(); }, []); 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; default: return {status}; } }; const handleReschedule = (apt: Appointment) => { toast.info(`Funcionalidade de reagendamento da consulta ${apt.id} ainda não implementada`); }; const handleCancel = (apt: Appointment) => { toast.info(`Funcionalidade de cancelamento da consulta ${apt.id} ainda não implementada`); }; return (

Minhas Consultas

Veja, reagende ou cancele suas consultas

{isLoading ? (

Carregando consultas...

) : appointments.length === 0 ? (

Você ainda não possui consultas agendadas.

) : ( appointments.map((apt) => (
{apt.doctorName} Especialidade: N/A
{getStatusBadge(apt.status)}
{new Date(apt.scheduled_at).toLocaleDateString("pt-BR")}
{new Date(apt.scheduled_at).toLocaleTimeString("pt-BR", { hour: "2-digit", minute: "2-digit", })}
{apt.status !== "cancelled" && ( <> )}
)) )}
); }