"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 { Alert, AlertDescription } from "@/components/ui/alert"; import { AlertCircle, CheckCircle2, Loader2 } from "lucide-react"; import { applyLeave } from "@/lib/leavesStore"; 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 [error, setError] = useState(""); const [success, setSuccess] = useState(false); const [loading, setLoading] = useState(false); const today = new Date().toISOString().split("T")[0]; const daysCount = fromDate && toDate && toDate >= fromDate ? Math.ceil((new Date(toDate).getTime() - new Date(fromDate).getTime()) / 86400000) + 1 : 0; const reset = () => { setType("Casual"); setFromDate(""); setToDate(""); setReason(""); setError(""); setSuccess(false); }; const handleClose = () => { reset(); onOpenChange(false); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(""); if (!fromDate || !toDate || !reason.trim()) { setError("All fields are required"); return; } if (toDate < fromDate) { setError("End date must be after start date"); return; } setLoading(true); const result = await applyLeave(userId, { type, fromDate, toDate, reason }); setLoading(false); if (!result.ok) { setError(result.error ?? "Failed to apply"); return; } setSuccess(true); setTimeout(() => { handleClose(); onSuccess(); }, 1500); }; return ( Apply for Leave You have{" "} {leaveBalance} days {" "} remaining {success ? (

Leave Applied!

Your request is pending approval

) : (
{/* Leave Type */}
{/* Date range */}
{ setFromDate(e.target.value); if (toDate && e.target.value > toDate) setToDate(""); }} style={{ borderColor: "var(--surface-border)", borderRadius: "var(--radius-sm)" }} />
setToDate(e.target.value)} style={{ borderColor: "var(--surface-border)", borderRadius: "var(--radius-sm)" }} />
{daysCount > 0 && (
{daysCount} day{daysCount > 1 ? "s" : ""} selected
)} {/* Reason */}