import React from "react"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { format } from "date-fns"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Leave, LeaveStatus, LeaveStatusUpdateRequest } from "@/types"; import { toast } from "sonner"; const statusUpdateSchema = z.object({ comments: z.string().min(3, { message: "Comments must be at least 3 characters", }).optional(), }); type StatusUpdateFormValues = z.infer; interface LeaveStatusUpdateProps { leave: Leave | null; action: "approve" | "reject"; isOpen: boolean; onOpenChange: (open: boolean) => void; onSubmit: (data: LeaveStatusUpdateRequest) => Promise; approverId: number; isSubmitting: boolean; } const LeaveStatusUpdate: React.FC = ({ leave, action, isOpen, onOpenChange, onSubmit, approverId, isSubmitting, }) => { const form = useForm({ resolver: zodResolver(statusUpdateSchema), defaultValues: { comments: "", }, }); if (!leave) return null; const handleSubmit = async (values: StatusUpdateFormValues) => { try { const updateData: LeaveStatusUpdateRequest = { id: leave.id, status: action === "approve" ? "Approved" : "Rejected", approvedById: approverId, actionDate: format(new Date(), "yyyy-MM-dd'T'HH:mm:ss"), comments: values.comments, }; await onSubmit(updateData); form.reset(); toast.success(`Leave request ${action === "approve" ? "approved" : "rejected"} successfully`); onOpenChange(false); } catch (error) { console.error(`Error ${action} leave request:`, error); toast.error(`Failed to ${action} leave request`); } }; return ( {action === "approve" ? "Approve" : "Reject"} Leave Request {action === "approve" ? "Approve the leave request and provide any optional comments." : "Reject the leave request and provide a reason for rejection."}
Employee:
ID: {leave.employeeId}
Date:
{format(new Date(leave.startDate), "PPP")} to{" "} {format(new Date(leave.endDate), "PPP")}
Type:
{leave.type}
Reason:
{leave.reason}
( Comments