"use client"; import { useState } from "react"; import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, } from "@/components/ui/sheet"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Loader2 } from "lucide-react"; import { applyLeave, daysBetween, isWeekend, LeaveRequest } from "@/lib/leavesStore"; import { toast } from "sonner"; interface LeaveSheetProps { open: boolean; onOpenChange: (open: boolean) => void; userId: number; leaveBalance: number; onSuccess: () => void; } const LEAVE_TYPES = ["Sick", "Casual", "Annual", "Unpaid"] as const; export function LeaveSheet({ open, onOpenChange, userId, leaveBalance, onSuccess }: LeaveSheetProps) { const [type, setType] = useState("Casual"); const [fromDate, setFromDate] = useState(""); const [toDate, setToDate] = useState(""); const [reason, setReason] = useState(""); const [loading, setLoading] = useState(false); const today = new Date().toISOString().split("T")[0]; const daysCount = fromDate && toDate && toDate >= fromDate ? daysBetween(fromDate, toDate) : 0; const reset = () => { setType("Casual"); setFromDate(""); setToDate(""); setReason(""); }; const handleClose = () => { reset(); onOpenChange(false); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!fromDate || !toDate || !reason.trim()) { toast.error("All fields are required"); return; } if (toDate < fromDate) { toast.error("End date must be after start date"); return; } setLoading(true); const result = await applyLeave(userId, { type, fromDate, toDate, reason }); setLoading(false); if (!result.ok) { toast.error(result.error ?? "Failed to apply"); return; } toast.success("Leave applied! Your request is pending approval."); handleClose(); onSuccess(); }; return ( Apply for Leave You have{" "} {leaveBalance} days {" "} remaining
{ const val = e.target.value; if (isWeekend(val)) { toast.error("Start date cannot be a Saturday or Sunday"); return; } setFromDate(val); if (toDate && val > toDate) setToDate(""); }} style={{ borderColor: "var(--surface-border)", borderRadius: "var(--radius-sm)" }} />
{ const val = e.target.value; if (isWeekend(val)) { toast.error("End date cannot be a Saturday or Sunday"); return; } setToDate(val); }} style={{ borderColor: "var(--surface-border)", borderRadius: "var(--radius-sm)" }} />
{daysCount > 0 && (
{daysCount} day{daysCount > 1 ? "s" : ""} selected
)}