"use client"; import { useForm, useFieldArray } 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 { Card } from "@/components/ui/card"; import { Plus, Trash2, Loader2 } from "lucide-react"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { useRouter } from "next/navigation"; import { useCreateRFA } from "@/hooks/use-rfa"; import { useDisciplines, useContracts } from "@/hooks/use-master-data"; import { CreateRFADto } from "@/types/rfa"; import { useState, useEffect } from "react"; import { correspondenceService } from "@/lib/services/correspondence.service"; const rfaItemSchema = z.object({ itemNo: z.string().min(1, "Item No is required"), description: z.string().min(3, "Description is required"), quantity: z.number().min(0, "Quantity must be positive"), unit: z.string().min(1, "Unit is required"), }); const rfaSchema = z.object({ contractId: z.number().min(1, "Contract is required"), disciplineId: z.number().min(1, "Discipline is required"), rfaTypeId: z.number().min(1, "Type is required"), subject: z.string().min(5, "Subject must be at least 5 characters"), description: z.string().optional(), body: z.string().optional(), remarks: z.string().optional(), toOrganizationId: z.number().min(1, "Please select To Organization"), dueDate: z.string().optional(), shopDrawingRevisionIds: z.array(z.number()).optional(), items: z.array(rfaItemSchema).min(1, "At least one item is required"), }); type RFAFormData = z.infer; export function RFAForm() { const router = useRouter(); const createMutation = useCreateRFA(); // Dynamic Contract Loading (Default Project Context: 1) const currentProjectId = 1; const { data: contracts, isLoading: isLoadingContracts } = useContracts(currentProjectId); const { register, control, handleSubmit, setValue, watch, formState: { errors }, } = useForm({ resolver: zodResolver(rfaSchema), defaultValues: { contractId: 0, disciplineId: 0, rfaTypeId: 0, subject: "", description: "", body: "", remarks: "", toOrganizationId: 0, dueDate: "", shopDrawingRevisionIds: [], items: [{ itemNo: "1", description: "", quantity: 0, unit: "" }], }, }); const selectedContractId = watch("contractId"); const { data: disciplines, isLoading: isLoadingDisciplines } = useDisciplines(selectedContractId); // Watch fields for preview const rfaTypeId = watch("rfaTypeId"); const disciplineId = watch("disciplineId"); const toOrganizationId = watch("toOrganizationId"); // -- Preview Logic -- const [preview, setPreview] = useState<{ number: string; isDefaultTemplate: boolean } | null>(null); useEffect(() => { if (!rfaTypeId || !disciplineId || !toOrganizationId) { setPreview(null); return; } const fetchPreview = async () => { try { const res = await correspondenceService.previewNumber({ projectId: currentProjectId, typeId: rfaTypeId, // RfaTypeId acts as TypeId disciplineId, // RFA uses 'TO' organization as recipient recipients: [{ organizationId: toOrganizationId, type: 'TO' }], dueDate: new Date().toISOString() }); setPreview(res); } catch (err) { setPreview(null); } }; const timer = setTimeout(fetchPreview, 500); return () => clearTimeout(timer); }, [rfaTypeId, disciplineId, toOrganizationId, currentProjectId]); const { fields, append, remove } = useFieldArray({ control, name: "items", }); const onSubmit = (data: RFAFormData) => { const payload: CreateRFADto = { ...data, projectId: currentProjectId, }; createMutation.mutate(payload as any, { onSuccess: () => { router.push("/rfas"); }, }); }; return (
{/* Preview Section */} {preview && (

Document Number Preview

{preview.number} {preview.isDefaultTemplate && ( Default Template )}
)} {/* Basic Info */}

RFA Information

{errors.subject && (

{errors.subject.message}

)}