"use client"; import { useState, useEffect } from "react"; import { useForm } from "react-hook-form"; import { X, CalendarIcon, Clock } from "lucide-react"; import toast from "react-hot-toast"; interface Station { id: number; bosCallsign: string; bosCallsignShort: string; locationState: string; operator: string; aircraft: string; } interface NewBookingFormData { type: "STATION" | "LST_01" | "LST_02" | "LST_03" | "LST_04"; stationId?: number; startTime: string; endTime: string; title?: string; description?: string; } interface NewBookingModalProps { isOpen: boolean; onClose: () => void; onBookingCreated: () => void; userPermissions: string[]; } export const NewBookingModal = ({ isOpen, onClose, onBookingCreated, userPermissions, }: NewBookingModalProps) => { const [stations, setStations] = useState([]); const [loading, setLoading] = useState(false); const [submitting, setSubmitting] = useState(false); const { register, handleSubmit, watch, setValue, reset, formState: { errors }, } = useForm(); const selectedType = watch("type"); const hasDISPOPermission = userPermissions.includes("DISPO"); // Fetch stations for selection useEffect(() => { const fetchStations = async () => { setLoading(true); try { const response = await fetch("/api/station"); if (!response.ok) { throw new Error("Failed to fetch stations"); } const data = await response.json(); setStations(data.stations || []); } catch (error) { console.error("Error fetching stations:", error); toast.error("Fehler beim Laden der Stationen"); } finally { setLoading(false); } }; if (isOpen) { fetchStations(); } }, [isOpen]); // Reset form when modal opens useEffect(() => { if (isOpen) { reset(); // Set default datetime to current hour const now = new Date(); const currentHour = new Date( now.getFullYear(), now.getMonth(), now.getDate(), now.getHours(), 0, 0, ); const nextHour = new Date(currentHour.getTime() + 60 * 60 * 1000); setValue("startTime", currentHour.toISOString().slice(0, 16)); setValue("endTime", nextHour.toISOString().slice(0, 16)); } }, [isOpen, reset, setValue]); const onSubmit = async (data: NewBookingFormData) => { setSubmitting(true); try { // Validate that end time is after start time if (new Date(data.endTime) <= new Date(data.startTime)) { toast.error("Endzeit muss nach der Startzeit liegen"); return; } const response = await fetch("/api/booking", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(data), }); const result = await response.json(); if (!response.ok) { if (response.status === 409) { toast.error(result.error || "Konflikt: Zeitraum bereits gebucht"); } else { toast.error(result.error || "Fehler beim Erstellen der Buchung"); } return; } toast.success("Buchung erfolgreich erstellt!"); onBookingCreated(); onClose(); } catch (error) { console.error("Error creating booking:", error); toast.error("Fehler beim Erstellen der Buchung"); } finally { setSubmitting(false); } }; if (!isOpen) return null; return (
{/* Header */}

Neue Buchung erstellen

{/* Form */}
{/* Resource Type Selection */}
{errors.type && ( )}
{/* Station Selection (only if STATION type is selected) */} {selectedType === "STATION" && (
{loading ? (
) : ( )} {errors.stationId && ( )}
)} {/* Time Selection */}
{errors.startTime && ( )}
{errors.endTime && ( )}
{/* Actions */}
); };