"use client"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import Sidebar from "@/components/Sidebar"; import WeeklyScheduleCard from "@/components/ui/WeeklyScheduleCard"; import { useEffect, useState, useMemo } from "react"; import { AvailabilityService } from "@/services/availabilityApi.mjs"; import { doctorsService } from "@/services/doctorsApi.mjs"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Button } from "@/components/ui/button"; import { Filter } from "lucide-react"; type Doctor = { id: string; full_name: string; specialty: string; active: boolean; }; type Availability = { id: string; doctor_id: string; weekday: string; start_time: string; end_time: string; }; export default function AllAvailabilities() { const [availabilities, setAvailabilities] = useState(null); const [doctors, setDoctors] = useState(null); // 🔎 Filtros const [search, setSearch] = useState(""); const [specialty, setSpecialty] = useState("all"); // 🔄 Paginação const ITEMS_PER_PAGE = 6; const [page, setPage] = useState(1); const [loading, setLoading] = useState(true); useEffect(() => { const fetchData = async () => { try { const doctorsList = await doctorsService.list(); setDoctors(doctorsList); const availabilityList = await AvailabilityService.list(); setAvailabilities(availabilityList); } catch (e: any) { alert(`${e?.error} ${e?.message}`); } finally { setLoading(false); } }; fetchData(); }, []); // 🎯 Obter todas as especialidades existentes const specialties = useMemo(() => { if (!doctors) return []; const unique = Array.from(new Set(doctors.map((d) => d.specialty))); return unique; }, [doctors]); // 🔍 Filtrar médicos por especialidade + nome const filteredDoctors = useMemo(() => { if (!doctors) return []; return doctors.filter((doctor) => (specialty === "all" ? true : doctor.specialty === specialty)).filter((doctor) => doctor.full_name.toLowerCase().includes(search.toLowerCase())); }, [doctors, search, specialty]); // 📄 Paginação (após filtros!) const totalPages = Math.ceil(filteredDoctors.length / ITEMS_PER_PAGE); const paginatedDoctors = filteredDoctors.slice((page - 1) * ITEMS_PER_PAGE, page * ITEMS_PER_PAGE); const goNext = () => setPage((p) => Math.min(p + 1, totalPages)); const goPrev = () => setPage((p) => Math.max(p - 1, 1)); if (loading) { return (
Carregando dados...
); } if (!doctors || !availabilities) { return (
Não foi possível carregar médicos ou disponibilidades.
); } return (

Disponibilidade dos Médicos

Visualize a agenda semanal individual de cada médico.

{/* 🔎 Filtros */}
{/* Filtro por nome */} { setSearch(e.target.value); setPage(1); }} className="w-full md:w-1/3" /> {/* Filtro por especialidade */}
{/* GRID de cards */}
{paginatedDoctors.map((doctor) => { const doctorAvailabilities = availabilities.filter((a) => a.doctor_id === doctor.id); return ( {doctor.full_name} ); })}
{/* 📄 Paginação */} {totalPages > 1 && (
Página {page} de {totalPages}
)}
); }