Staff Multi-Booking
Staff can book multiple tokens at once. All tokens will be assigned for the same date.
"use client"; import { useState, useEffect } from "react"; import { databases, ID, Query } from "../../lib/appwrite"; import { DATABASE_ID, COLLECTION_ID } from "../../lib/api"; import Header from "../../components/partials/header"; import { useTheme } from "../../context/ThemeContext"; export default function MultiBooked() { const { darkMode } = useTheme(); const [appointmentDate, setAppointmentDate] = useState(new Date().toISOString().split('T')[0]); const [bookings, setBookings] = useState([ { id: 1, name: "", tokenNumber: "" }, { id: 2, name: "", tokenNumber: "" }, { id: 3, name: "", tokenNumber: "" }, { id: 4, name: "", tokenNumber: "" }, { id: 5, name: "", tokenNumber: "" } ]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { const bookingData = sessionStorage.getItem('multiBookingData'); if (bookingData) { const { date, patients } = JSON.parse(bookingData); setAppointmentDate(date); setBookings(patients.map(p => ({ ...p, tokenNumber: "" }))); sessionStorage.removeItem('multiBookingData'); } }, []); // ------------------create entries-------------------------------- const createEntries = async () => { setLoading(true); setError(null); try { const validBookings = bookings.filter(b => b.name.trim() !== ""); if (validBookings.length === 0) { throw new Error("Please enter at least one patient name"); } // Step 1: Get the highest token number const response = await databases.listDocuments( DATABASE_ID, COLLECTION_ID, [Query.orderDesc('tokenNumber'), Query.limit(1)] ); let lastTokenNum = response.documents[0] ? parseInt(response.documents[0].tokenNumber) : 0; // Step 2: Prepare all token numbers first const tokenAssignments = validBookings.map((_, index) => { return (lastTokenNum + index + 1).toString().padStart(3, '0'); }); // Step 3: Create documents and update state const updatedBookings = [...bookings]; let bookingIndex = 0; for (let i = 0; i < bookings.length; i++) { if (bookings[i].name.trim() !== "") { await databases.createDocument( DATABASE_ID, COLLECTION_ID, ID.unique(), { tokenNumber: tokenAssignments[bookingIndex], patientName: bookings[i].name, date: appointmentDate, bookedBy: "staff", status: "booked", patientId: ID.unique(), } ); updatedBookings[i].tokenNumber = tokenAssignments[bookingIndex]; bookingIndex++; } } setBookings(updatedBookings); alert(`${validBookings.length} tokens created successfully!`); } catch (error) { console.error("Creation error:", error); setError(error.message); } finally { setLoading(false); } }; const handleNameChange = (id, value) => { setBookings(bookings.map(b => b.id === id ? { ...b, name: value } : b )); }; return (
Staff can book multiple tokens at once. All tokens will be assigned for the same date.