import { useEffect, useState } from "react"; import toast from "react-hot-toast"; import { ArrowRight, PlusCircle, RefreshCcw, Search, UserRound, Wrench } from "lucide-react"; import { createReservation, getEquipment, searchRooms } from "../api.js"; export default function CreateReservationPage({ activeUser }) { const [equipment, setEquipment] = useState([]); const [rooms, setRooms] = useState([]); const [form, setForm] = useState({ reservationDate: "2026-07-20", startTime: "09:00", endTime: "10:00", minimumCapacity: 1, roomType: "", requiredEquipmentName: "", }); const [selectedRoomId, setSelectedRoomId] = useState(""); const [equipmentId, setEquipmentId] = useState(""); const [quantity, setQuantity] = useState(1); const [selectedEquipment, setSelectedEquipment] = useState([]); const [created, setCreated] = useState(null); const [loading, setLoading] = useState(false); useEffect(() => { getEquipment() .then(setEquipment) .catch((err) => toast.error(err.message)); }, []); function updateField(field, value) { setForm((prev) => ({ ...prev, [field]: value })); } async function loadAvailableRooms(e) { e.preventDefault(); setCreated(null); if (!form.reservationDate || !form.startTime || !form.endTime) { toast.error("Reservation date, start time and end time are required."); return; } if (form.endTime <= form.startTime) { toast.error("End time must be after start time."); return; } if (Number(form.minimumCapacity) < 1) { toast.error("Minimum capacity must be greater than 0."); return; } try { const result = await searchRooms({ ...form, minimumCapacity: Number(form.minimumCapacity), }); setRooms(result); setSelectedRoomId(""); toast.success(`${result.length} rooms loaded`); } catch (err) { setRooms([]); toast.error(err.message); } } function addEquipment() { if (!equipmentId) { toast.error("Select equipment first."); return; } if (Number(quantity) <= 0) { toast.error("Quantity must be greater than 0."); return; } const selected = equipment.find((item) => item.equipmentId === Number(equipmentId)); setSelectedEquipment((prev) => { const existingItem = prev.find((item) => item.equipmentId === Number(equipmentId)); if (existingItem) { return prev.map((item) => item.equipmentId === Number(equipmentId) ? { ...item, requestedQuantity: item.requestedQuantity + Number(quantity), } : item ); } return [ ...prev, { equipmentId: Number(equipmentId), requestedQuantity: Number(quantity), name: selected?.name || `Equipment ${equipmentId}`, }, ]; }); setEquipmentId(""); setQuantity(1); toast.success("Equipment added"); } function removeEquipment(index) { setSelectedEquipment((prev) => prev.filter((_, i) => i !== index)); } async function submitReservation(e) { e.preventDefault(); setCreated(null); if (!activeUser?.userId) { toast.error("Logged-in requester is missing."); return; } if (!form.reservationDate || !form.startTime || !form.endTime) { toast.error("Reservation date, start time and end time are required."); return; } if (form.endTime <= form.startTime) { toast.error("End time must be after start time."); return; } const hasRoom = Boolean(selectedRoomId); const hasEquipment = selectedEquipment.length > 0; if (!hasRoom && !hasEquipment) { toast.error("Please select a room or add equipment before creating a reservation."); return; } setLoading(true); try { const result = await createReservation({ userId: activeUser.userId, reservationDate: form.reservationDate, startTime: form.startTime, endTime: form.endTime, roomId: selectedRoomId ? Number(selectedRoomId) : null, equipment: selectedEquipment.map((item) => ({ equipmentId: item.equipmentId, requestedQuantity: item.requestedQuantity, })), }); setCreated(result); toast.success(`Reservation #${result.reservationId} created`); } catch (err) { toast.error(err.message); } finally { setLoading(false); } } return (
updateField("reservationDate", v)} /> updateField("startTime", v)} /> updateField("endTime", v)} /> updateField("minimumCapacity", v)} />
{getInitials(activeUser.fullName)}
Requester {activeUser.fullName}

Optional equipment

{selectedEquipment.length > 0 && (
    {selectedEquipment.map((item, index) => (
  • {item.name} x{item.requestedQuantity}
  • ))}
)}
{created && (

Reservation created successfully

{JSON.stringify(created, null, 2)}
)}
); } function Hero({ eyebrow, title, subtitle }) { return (
{eyebrow}

{title}

{subtitle}

); } function SectionTitle({ icon: Icon, title, subtitle }) { return (

{title}

{subtitle}

); } function Step({ number, title }) { return (
{number} {title}
); } function Input({ label, type = "text", value, onChange }) { return ( ); } function Badge({ value }) { return {value}; } function getInitials(name) { return String(name || "U") .split(" ") .map((part) => part[0]) .slice(0, 2) .join("") .toUpperCase(); }