import { useState, useEffect, useCallback } from "react"; import { getAppointmentsApi, deleteAppointmentApi } from "@/api/appointment"; import { exportToExcel } from "@/utils/exportToExcel"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Loader2, Trash, RefreshCw, Download, ChevronLeft, ChevronRight, } from "lucide-react"; export default function AppointmentPage() { const [appointments, setAppointments] = useState([]); const [loading, setLoading] = useState(true); const [searchText, setSearchText] = useState(""); const [filterDoctor, setFilterDoctor] = useState(""); const [filterDepartment, setFilterDepartment] = useState(""); const [filterDate, setFilterDate] = useState(""); const [currentPage, setCurrentPage] = useState(1); const [itemsPerPage, setItemsPerPage] = useState(10); const [meta, setMeta] = useState({}); const fetchAll = useCallback(async () => { setLoading(true); try { const res = await getAppointmentsApi( currentPage, itemsPerPage, searchText, filterDoctor, filterDepartment, filterDate, ); setAppointments(res?.data || []); setMeta(res?.meta || {}); } catch (err) { console.error(err); } finally { setLoading(false); } }, [ currentPage, itemsPerPage, searchText, filterDoctor, filterDepartment, filterDate, ]); useEffect(() => { fetchAll(); }, [fetchAll]); async function handleDelete(id: number) { if (!confirm("Delete appointment?")) return; await deleteAppointmentApi(id); fetchAll(); } const handleExport = async () => { try { const res = await getAppointmentsApi(); let data = res?.data || []; data = data.filter((item: any) => { const matchesSearch = item.name?.toLowerCase().includes(searchText.toLowerCase()) || item.mobileNumber?.includes(searchText) || item.email?.toLowerCase().includes(searchText.toLowerCase()); const matchesDoctor = filterDoctor ? item.doctor?.name ?.toLowerCase() .includes(filterDoctor.toLowerCase()) : true; const matchesDepartment = filterDepartment ? item.department?.name ?.toLowerCase() .includes(filterDepartment.toLowerCase()) : true; const matchesDate = filterDate ? new Date(item.date).toISOString().split("T")[0] === filterDate : true; return ( matchesSearch && matchesDoctor && matchesDepartment && matchesDate ); }); const exportData = data.map((item: any) => ({ ID: item.id, Name: item.name, Phone: item.mobileNumber, Email: item.email, Doctor: item.doctor?.name, Department: item.department?.name, Date: new Date(item.date).toLocaleDateString(), Message: item.message, })); exportToExcel(exportData, "appointments"); } catch (err) { console.error(err); } }; return (

Appointments

{ setSearchText(e.target.value); setCurrentPage(1); }} className="w-[200px]" /> setFilterDoctor(e.target.value)} className="w-[160px]" /> setFilterDepartment(e.target.value)} className="w-[160px]" /> setFilterDate(e.target.value)} className="w-[160px]" />
Appointment List ID Name Phone Doctor Department Date Actions {loading ? ( ) : appointments.length === 0 ? ( No appointments found ) : ( appointments.map((item) => ( {item.id} {item.name} {item.mobileNumber} {item.doctor?.name} {item.department?.name} {new Date(item.date).toLocaleDateString()} )) )}

Page {meta.page || 1} of {meta.totalPages || 1}

); }