"use client"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { FileUpload } from "@/components/common/file-upload"; import { useRouter } from "next/navigation"; import { Loader2 } from "lucide-react"; import { useCreateCorrespondence } from "@/hooks/use-correspondence"; import { Organization } from "@/types/organization"; import { useOrganizations } from "@/hooks/use-master-data"; import { CreateCorrespondenceDto } from "@/types/dto/correspondence/create-correspondence.dto"; const correspondenceSchema = z.object({ subject: z.string().min(5, "Subject must be at least 5 characters"), description: z.string().optional(), documentTypeId: z.number(), fromOrganizationId: z.number().min(1, "Please select From Organization"), toOrganizationId: z.number().min(1, "Please select To Organization"), importance: z.enum(["NORMAL", "HIGH", "URGENT"]), attachments: z.array(z.instanceof(File)).optional(), }); type FormData = z.infer; export function CorrespondenceForm() { const router = useRouter(); const createMutation = useCreateCorrespondence(); const { data: organizations, isLoading: isLoadingOrgs } = useOrganizations(); const { register, handleSubmit, setValue, formState: { errors }, } = useForm({ resolver: zodResolver(correspondenceSchema), defaultValues: { importance: "NORMAL", documentTypeId: 1, } as any, // Cast to any to handle partial defaults for required fields }); const onSubmit = (data: FormData) => { // Map FormData to CreateCorrespondenceDto // Note: projectId is hardcoded to 1 for now as per requirements/context const payload: CreateCorrespondenceDto = { projectId: 1, typeId: data.documentTypeId, title: data.subject, description: data.description, originatorId: data.fromOrganizationId, // Mapping From -> Originator (Impersonation) details: { to_organization_id: data.toOrganizationId, importance: data.importance }, // create-correspondence DTO does not have 'attachments' field at root usually, often handled separate or via multipart // If useCreateCorrespondence handles multipart, we might need to pass FormData object or specific structure // For now, aligning with DTO interface. }; // If the hook expects the DTO directly: createMutation.mutate(payload, { onSuccess: () => { router.push("/correspondences"); }, }); }; return (
{errors.subject && (

{errors.subject.message}

)}