"use client"; 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 { disponibilidadeApi, Availability } from "@/services/disponibilidadeApi"; import { excecoesApi, Exception } from "@/services/excecoesApi"; import { toast } from "@/hooks/use-toast"; export default function PatientDashboard() { const [availability, setAvailability] = useState([]); const [exceptions, setExceptions] = useState([]); const [schedule, setSchedule] = useState>({}); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [exceptionToDelete, setExceptionToDelete] = useState(null); const formatTime = (time: string) => time.split(":").slice(0, 2).join(":"); const weekdaysPT: Record = { sunday: "Domingo", monday: "Segunda", tuesday: "Terça", wednesday: "Quarta", thursday: "Quinta", friday: "Sexta", saturday: "Sábado", }; useEffect(() => { const fetchData = async () => { const doctorId = JSON.parse(localStorage.getItem("user_info") || "{}")?.id;; setIsLoading(true); setError(null); try { const [availabilityResponse, exceptionsResponse] = await Promise.all([ disponibilidadeApi.list(), excecoesApi.list(), ]); const filteredAvailability = availabilityResponse.filter( (disp) => disp.doctor_id === doctorId ); setAvailability(filteredAvailability); const filteredExceptions = exceptionsResponse.filter( (exc) => exc.doctor_id === doctorId ); setExceptions(filteredExceptions); } catch (e: any) { setError("Não foi possível carregar os dados do dashboard."); console.error(e); } finally { setIsLoading(false); } }; fetchData(); }, []); const openDeleteDialog = (exceptionId: string) => { setExceptionToDelete(exceptionId); setDeleteDialogOpen(true); }; const handleDeleteException = async (exceptionId: string) => { try { await excecoesApi.delete(exceptionId); toast({ title: "Sucesso", description: "Exceção deletada com sucesso.", }); setExceptions((prev) => prev.filter((ex) => ex.id !== exceptionId)); } catch (e: any) { toast({ title: "Erro", description: e?.message || "Não foi possível deletar a exceção.", }); } finally { setDeleteDialogOpen(false); setExceptionToDelete(null); } }; function formatAvailability(data: Availability[]) { const schedule = data.reduce( (acc: any, item) => { const { weekday, start_time, end_time } = item; if (!acc[weekday]) { acc[weekday] = []; } 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]); if (isLoading) { return
Carregando...
; } if (error) { return
Erro: {error}
; } 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 {Object.keys(schedule).length > 0 ? ( ["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

)}
); }) ) : (

Nenhum horário de disponibilidade encontrado.

)}
Exceções Bloqueios e liberações eventuais de agenda {exceptions.length > 0 ? ( exceptions.map((ex) => { 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 esta exceção? Esta ação não pode ser desfeita. Cancelar exceptionToDelete && handleDeleteException(exceptionToDelete)} className="bg-red-600 hover:bg-red-700"> Excluir
); }