"use client" import { useRef, useState } from "react" import { useMutation } from "@tanstack/react-query" import { toast } from "sonner" import { useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import { z } from "zod" import { UploadIcon } from "lucide-react" import { Button } from "@/shared/components/ui/button" import { Input } from "@/shared/components/ui/input" import { Textarea } from "@/shared/components/ui/textarea" import { Field, FieldLabel, FieldError } from "@/shared/components/ui/field" import { useAuthApi } from "@/shared/useApi" const schema = z.object({ name: z.string().trim().min(1, "Name is required").max(150), issuer: z.string().trim().max(150).optional(), certificate_number: z.string().trim().max(100).optional(), issued_date: z.string().optional(), expiry_date: z.string().optional(), notes: z.string().max(2000).optional(), }) type FormValues = z.infer export type EmployeeCertificationFormProps = { employeeId: string onSuccess?: () => void onCancel?: () => void } export function EmployeeCertificationForm({ employeeId, onSuccess, onCancel }: EmployeeCertificationFormProps) { const api = useAuthApi() const fileRef = useRef(null) const [file, setFile] = useState(null) const { register, handleSubmit, formState: { errors }, reset, } = useForm({ resolver: zodResolver(schema), defaultValues: { name: "", issuer: "", certificate_number: "", issued_date: "", expiry_date: "", notes: "", }, }) const mutation = useMutation({ mutationFn: (values: FormValues) => { const promise = api.employees.createCertification(employeeId, { name: values.name, issuer: values.issuer || undefined, certificate_number: values.certificate_number || undefined, issued_date: values.issued_date || undefined, expiry_date: values.expiry_date || undefined, notes: values.notes || undefined, file: file ?? undefined, }) toast.promise(promise, { loading: "Saving certification...", success: "Certification added", error: (err: any) => err?.message ?? "Failed to save", }) return promise }, onSuccess: () => { reset() setFile(null) onSuccess?.() }, }) return (
mutation.mutate(v))}> Name {errors.name && {errors.name.message}}
Issuer Certificate Number
Issued Date Expiry Date
Attachment (optional)
{file ? file.name : "No file selected"} setFile(e.target.files?.[0] ?? null)} />
Notes