"use client"; import { useState, useEffect, useCallback } from "react"; import { ArrowLeft, Loader2, Info } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { fetchLeaveTypes, fetchEmployeeLeaveBalance, fetchEmployees, createLeaveRequest, } from "@/lib/supabase/leave-actions"; import { calculateWorkingDays, formatDate, type LeaveType, type LeaveBalance, } from "@/lib/supabase/leave-types"; export default function LeaveNewPage({ onBack, onSuccess, }: { onBack: () => void; onSuccess: () => void; }) { const [saving, setSaving] = useState(false); const [error, setError] = useState(null); const [leaveTypes, setLeaveTypes] = useState([]); const [employees, setEmployees] = useState<{ id: string; first_name: string; last_name: string; email: string; job_title: string | null }[]>([]); const [balances, setBalances] = useState([]); const [employeeId, setEmployeeId] = useState(""); const [leaveTypeId, setLeaveTypeId] = useState(""); const [startDate, setStartDate] = useState(""); const [endDate, setEndDate] = useState(""); const [reason, setReason] = useState(""); // Auto-calculate working days const workingDays = startDate && endDate ? calculateWorkingDays(startDate, endDate) : 0; // Get the selected leave type's remaining balance const selectedBalance = balances.find((b) => b.leave_type_id === leaveTypeId); const hasInsufficientBalance = selectedBalance && selectedBalance.remaining_days < workingDays; useEffect(() => { let cancelled = false; Promise.all([fetchLeaveTypes(), fetchEmployees()]) .then(([types, emps]) => { if (!cancelled) { setLeaveTypes(types); setEmployees(emps); } }) .catch(() => {}); return () => { cancelled = true; }; }, []); // Fetch balances when employee changes useEffect(() => { if (!employeeId) return; let cancelled = false; fetchEmployeeLeaveBalance(employeeId) .then((b) => { if (!cancelled) setBalances(b); }) .catch(() => {}); return () => { cancelled = true; }; }, [employeeId]); const handleSubmit = async () => { setError(null); if (!employeeId) { setError("Please select an employee"); return; } if (!leaveTypeId) { setError("Please select a leave type"); return; } if (!startDate) { setError("Please select a start date"); return; } if (!endDate) { setError("Please select an end date"); return; } if (endDate < startDate) { setError("End date must be after start date"); return; } if (workingDays <= 0) { setError("No working days in selected range"); return; } setSaving(true); try { const result = await createLeaveRequest({ employee_id: employeeId, leave_type_id: leaveTypeId, start_date: startDate, end_date: endDate, days_count: workingDays, reason: reason.trim() || undefined, }); if (!result.success) { setError(result.error || "Failed to create leave request"); return; } // Reset form setEmployeeId(""); setLeaveTypeId(""); setStartDate(""); setEndDate(""); setReason(""); onSuccess(); } catch (e: any) { setError(e.message || "An unexpected error occurred"); } finally { setSaving(false); } }; return (
{/* Header */}

Request Leave

Submit a new time-off request

{error && (
{error}
)}
{/* Employee */}
{/* Leave Type */}
{/* Start Date */}
setStartDate(e.target.value)} className="mt-1" />
{/* End Date */}
setEndDate(e.target.value)} min={startDate} className="mt-1" />
{/* Reason */}