"use client"; import { DEPARTMENTS } from "@/lib/constants"; import { useShift } from "@/lib/shift-context"; import { useEffect, useState } from "react"; import type { ShiftCreateModalProps } from "./ShiftSchedule.types"; export default function ShiftCreateModal({ isOpen, onClose, defaultDate }: ShiftCreateModalProps) { const { createShift } = useShift(); const [date, setDate] = useState(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(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("Vui lòng điền đầy đủ thông tin."); 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("Giờ kết thúc phải sau giờ bắt đầu."); return; } const durationHours = (endMinutes - startMinutes) / 60; createShift({ date, startTime, endTime, durationHours, wage, department, maxStaff, registeredStaff: [], status: "available", }); onClose(); }; return (
{/* Backdrop */}
{/* Modal */}
{/* Header */}

Tạo ca làm mới

Thêm khung giờ ca làm cho nhân viên

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