"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 { 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"; 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"), title: z.string().min(5, "Title must be at least 5 characters"), description: 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, title: "", description: "", toOrganizationId: 0, dueDate: "", shopDrawingRevisionIds: [], items: [{ itemNo: "1", description: "", quantity: 0, unit: "" }], }, }); const selectedContractId = watch("contractId"); const { data: disciplines, isLoading: isLoadingDisciplines } = useDisciplines(selectedContractId); 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 (
{/* Basic Info */}

RFA Information

{errors.title && (

{errors.title.message}

)}
{errors.contractId && (

{errors.contractId.message}

)}
{errors.disciplineId && (

{errors.disciplineId.message}

)}
{/* RFA Items */}

RFA Items

{fields.map((field, index) => (

Item #{index + 1}

{fields.length > 1 && ( )}
{errors.items?.[index]?.itemNo && (

{errors.items[index]?.itemNo?.message}

)}
{errors.items?.[index]?.description && (

{errors.items[index]?.description?.message}

)}
{errors.items?.[index]?.quantity && (

{errors.items[index]?.quantity?.message}

)}
{errors.items?.[index]?.unit && (

{errors.items[index]?.unit?.message}

)}
))}
{errors.items?.root && (

{errors.items.root.message}

)}
{/* Actions */}
); }