"use client"; import { DEPARTMENTS } from "@/lib/constants"; import { useShift } from "@/lib/shift-context"; import { useEffect, useState } from "react"; import { formatDateISO } from "./MonthlyCalendar"; import type { ShiftCreateModalProps } from "./ShiftSchedule.types"; export default function ShiftCreateModal({ isOpen, onClose, defaultDate, }: ShiftCreateModalProps) { const { createShift } = useShift(); const [date, setDate] = useState(new Date(defaultDate ?? "2026-04-10")); const [startTime, setStartTime] = useState("08:00"); const [endTime, setEndTime] = useState("12:00"); const [department, setDepartment] = useState("bar"); const [maxStaff, setMaxStaff] = useState(2); const [wage, setWage] = useState(120000); const [error, setError] = useState(null); useEffect(() => { if (isOpen) { setDate(new Date(defaultDate ?? "2026-04-10")); } }, [defaultDate, isOpen]); if (!isOpen) return null; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); setError(null); // Validate if (!date || !startTime || !endTime) { setError("Please fill in all required fields."); return; } const [sh, sm] = startTime.split(":").map(Number); const [eh, em] = endTime.split(":").map(Number); const startMinutes = sh * 60 + sm; const endMinutes = eh * 60 + em; if (endMinutes <= startMinutes) { setError("End time must be after start time."); return; } createShift({ date, startTime, endTime, wage, maxStaff, }); onClose(); }; return (
{/* Backdrop */}
{/* Modal */}
{/* Header */}

Create New Shift

Add a shift time slot for staff

{/* Form */}
{/* Date */}
setDate(new Date(e.target.value))} className="text-foreground w-full rounded-xl border border-(--color-border-light) px-3 py-2.5 text-sm transition outline-none focus:border-(--color-primary) focus:ring-1 focus:ring-(--color-primary)" />
{/* Time range */}
setStartTime(e.target.value)} className="text-foreground w-full rounded-xl border border-(--color-border-light) px-3 py-2.5 text-sm transition outline-none focus:border-(--color-primary) focus:ring-1 focus:ring-(--color-primary)" />
setEndTime(e.target.value)} className="text-foreground w-full rounded-xl border border-(--color-border-light) px-3 py-2.5 text-sm transition outline-none focus:border-(--color-primary) focus:ring-1 focus:ring-(--color-primary)" />
{/* Department */}
{/* Max staff & Wage */}
setMaxStaff(Number(e.target.value))} className="text-foreground w-full rounded-xl border border-(--color-border-light) px-3 py-2.5 text-sm transition outline-none focus:border-(--color-primary) focus:ring-1 focus:ring-(--color-primary)" />
setWage(Number(e.target.value))} className="text-foreground w-full rounded-xl border border-(--color-border-light) px-3 py-2.5 text-sm transition outline-none focus:border-(--color-primary) focus:ring-1 focus:ring-(--color-primary)" />
{/* Error */} {error && (
{error}
)} {/* Actions */}
); }