"use client"; import { useState, useEffect } from "react"; import { databases, Query } from "../lib/appwrite"; import { DATABASE_ID, COLLECTION_ID } from "../lib/api"; import { useTheme } from "../context/ThemeContext"; export default function TokenTable({ statusFilter }) { const { darkMode } = useTheme(); const [entries, setEntries] = useState([]); const [filteredEntries, setFilteredEntries] = useState([]); const [searchQuery, setSearchQuery] = useState(""); const [currentPage, setCurrentPage] = useState(1); const entriesPerPage = 20; const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const getEntries = async () => { try { const today = new Date().toISOString().split('T')[0]; const response = await databases.listDocuments( DATABASE_ID, COLLECTION_ID, [ Query.equal('date', today), Query.orderAsc('tokenNumber') ], 100 ); return response.documents; } catch (error) { console.error("Fetch error:", error); throw error; } }; const updateStatus = async (entryId, newStatus) => { try { setLoading(true); await databases.updateDocument( DATABASE_ID, COLLECTION_ID, entryId, { status: newStatus } ); const data = await getEntries(); setEntries(data); applyFilters(data, searchQuery); } catch (error) { console.error("Update error:", error); setError(error.message); } finally { setLoading(false); } }; const applyFilters = (data, search) => { let filtered = data.filter((entry) => { const matchesSearch = entry.patientName.toLowerCase().includes(search.toLowerCase()) || entry.tokenNumber.toString().includes(search); const matchesFilter = statusFilter === "all" || entry.status === statusFilter || (statusFilter === "booked" && entry.status === "booked"); return matchesSearch && matchesFilter; }); setFilteredEntries(filtered); }; useEffect(() => { const loadData = async () => { try { const data = await getEntries(); setEntries(data); applyFilters(data, searchQuery); } catch (err) { setError(err.message); } finally { setLoading(false); } }; loadData(); }, []); useEffect(() => { applyFilters(entries, searchQuery); setCurrentPage(1); }, [searchQuery, statusFilter, entries]); const indexOfLastEntry = currentPage * entriesPerPage; const indexOfFirstEntry = indexOfLastEntry - entriesPerPage; const currentEntries = filteredEntries.slice(indexOfFirstEntry, indexOfLastEntry); const totalPages = Math.ceil(filteredEntries.length / entriesPerPage); // Handle theme loading state if (darkMode === undefined) { return (
Loading...
Loading...
Token | Name | Status | Actions |
---|---|---|---|
{entry.tokenNumber} | {entry.patientName} | {entry.status === "booked" ? "In-Queue" : entry.status} | {entry.status === "booked" && ( <> > )} |