"use client"; import DoctorLayout from "@/components/doctor-layout"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Calendar, Clock, User, Trash2 } from "lucide-react"; import Link from "next/link"; import { useEffect, useState } from "react"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog"; import { AvailabilityService } from "@/services/availabilityApi.mjs"; import { exceptionsService } from "@/services/exceptionApi.mjs"; import { toast } from "@/hooks/use-toast"; type Availability = { id: string; doctor_id: string; weekday: string; start_time: string; end_time: string; slot_minutes: number; appointment_type: string; active: boolean; created_at: string; updated_at: string; created_by: string; updated_by: string | null; }; type Schedule = { weekday: object; }; export default function PatientDashboard() { var userInfo; const doctorId = "3bb9ee4a-cfdd-4d81-b628-383907dfa225"; //userInfo.id; const [availability, setAvailability] = useState(null); const [exceptions, setExceptions] = useState(null); const [schedule, setSchedule] = useState>({}); const formatTime = (time: string) => time.split(":").slice(0, 2).join(":"); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [patientToDelete, setPatientToDelete] = useState(null); const [error, setError] = useState(null); // Mapa de tradução const weekdaysPT: Record = { sunday: "Domingo", monday: "Segunda", tuesday: "Terça", wednesday: "Quarta", thursday: "Quinta", friday: "Sexta", saturday: "Sábado", }; useEffect(() => { userInfo = JSON.parse(localStorage.getItem("user_info") || "{}") const fetchData = async () => { try { // fetch para disponibilidade const response = await AvailabilityService.list(); const filteredResponse = response.filter((disp: { doctor_id: any }) => disp.doctor_id == doctorId); setAvailability(filteredResponse); // fetch para exceções const res = await exceptionsService.list(); const filteredRes = res.filter((disp: { doctor_id: any }) => disp.doctor_id == doctorId); setExceptions(filteredRes); } catch (e: any) { alert(`${e?.error} ${e?.message}`); } }; fetchData(); }, []); const openDeleteDialog = (patientId: string) => { setPatientToDelete(patientId); setDeleteDialogOpen(true); }; const handleDeletePatient = async (patientId: string) => { // Remove from current list (client-side deletion) try { const res = await exceptionsService.delete(patientId); let message = "Exceção deletada com sucesso"; try { if (res) { throw new Error(`${res.error} ${res.message}` || "A API retornou erro"); } else { console.log(message); } } catch {} toast({ title: "Sucesso", description: message, }); setExceptions((prev: any[]) => prev.filter((p) => String(p.id) !== String(patientId))); } catch (e: any) { toast({ title: "Erro", description: e?.message || "Não foi possível deletar a exceção", }); } setDeleteDialogOpen(false); setPatientToDelete(null); }; function formatAvailability(data: Availability[]) { // Agrupar os horários por dia da semana const schedule = data.reduce((acc: any, item) => { const { weekday, start_time, end_time } = item; // Se o dia ainda não existe, cria o array if (!acc[weekday]) { acc[weekday] = []; } // Adiciona o horário do dia acc[weekday].push({ start: start_time, end: end_time, }); return acc; }, {} as Record); return schedule; } useEffect(() => { if (availability) { const formatted = formatAvailability(availability); setSchedule(formatted); } }, [availability]); return (

Dashboard

Bem-vindo ao seu portal de consultas médicas

Próxima Consulta
02 out

Dr. Silva - 14:30

Consultas Este Mês
4

4 agendadas

Perfil
100%

Dados completos

Ações Rápidas Acesse rapidamente as principais funcionalidades Próximas Consultas Suas consultas agendadas

Dr. João Santos

Cardiologia

02 out

14:30

Horário Semanal Confira rapidamente a sua disponibilidade da semana {["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"].map((day) => { const times = schedule[day] || []; return (

{weekdaysPT[day]}

{times.length > 0 ? ( times.map((t, i) => (

{formatTime(t.start)}
{formatTime(t.end)}

)) ) : (

Sem horário

)}
); })}
Exceções Bloqueios e liberações eventuais de agenda {exceptions && exceptions.length > 0 ? ( exceptions.map((ex: any) => { // Formata data e hora const date = new Date(ex.date).toLocaleDateString("pt-BR", { weekday: "long", day: "2-digit", month: "long", }); const startTime = formatTime(ex.start_time); const endTime = formatTime(ex.end_time); return (

{date}

{startTime} - {endTime}
-

{ex.kind === "bloqueio" ? "Bloqueio" : "Liberação"}

{ex.reason || "Sem motivo especificado"}

); }) ) : (

Nenhuma exceção registrada.

)}
Confirmar exclusão Tem certeza que deseja excluir este paciente? Esta ação não pode ser desfeita. Cancelar patientToDelete && handleDeletePatient(patientToDelete)} className="bg-red-600 hover:bg-red-700"> Excluir
); }