"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 { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Card } from "@/components/ui/card"; import { useRouter } from "next/navigation"; import { useCreateDrawing } from "@/hooks/use-drawing"; import { useContractDrawingCategories, useShopMainCategories, useShopSubCategories } from "@/hooks/use-master-data"; import { useState, useEffect } from "react"; import { Loader2 } from "lucide-react"; import { Textarea } from "@/components/ui/textarea"; // Base Schema const baseSchema = z.object({ drawingType: z.enum(["CONTRACT", "SHOP", "AS_BUILT"]), projectId: z.number().default(1), // Hardcoded for now file: z.instanceof(File, { message: "File is required" }), }); // Contract Schema const contractSchema = baseSchema.extend({ drawingType: z.literal("CONTRACT"), contractDrawingNo: z.string().min(1, "Drawing Number is required"), title: z.string().min(3, "Title is required"), volumeId: z.string().optional(), // Select input returns string usually (changed to string for input compatibility) volumePage: z.string().transform(val => parseInt(val, 10)).optional(), // Input type number returns string mapCatId: z.string().min(1, "Category is required"), }); // Shop Schema const shopSchema = baseSchema.extend({ drawingType: z.literal("SHOP"), drawingNumber: z.string().min(1, "Drawing Number is required"), mainCategoryId: z.string().min(1, "Main Category is required"), subCategoryId: z.string().min(1, "Sub Category is required"), // Revision Fields revisionLabel: z.string().default("0"), title: z.string().min(3, "Revision Title is required"), legacyDrawingNumber: z.string().optional(), description: z.string().optional(), }); // As Built Schema const asBuiltSchema = baseSchema.extend({ drawingType: z.literal("AS_BUILT"), drawingNumber: z.string().min(1, "Drawing Number is required"), mainCategoryId: z.string().min(1, "Main Category is required"), subCategoryId: z.string().min(1, "Sub Category is required"), // Revision Fields revisionLabel: z.string().default("0"), title: z.string().min(1, "Title is required"), legacyDrawingNumber: z.string().optional(), description: z.string().optional(), }); const formSchema = z.discriminatedUnion("drawingType", [ contractSchema, shopSchema, asBuiltSchema, ]); type DrawingFormData = z.infer; interface DrawingUploadFormProps { projectId?: number; } export function DrawingUploadForm({ projectId = 1 }: DrawingUploadFormProps) { const router = useRouter(); // Hooks const { data: contractCategories } = useContractDrawingCategories(); const { data: shopMainCats } = useShopMainCategories(projectId); const [selectedShopMainCat, setSelectedShopMainCat] = useState(); const { data: shopSubCats } = useShopSubCategories(projectId, selectedShopMainCat); const { register, handleSubmit, setValue, watch, formState: { errors }, } = useForm({ resolver: zodResolver(formSchema) as any, defaultValues: { projectId, drawingType: "CONTRACT", } }); const drawingType = watch("drawingType"); const createMutation = useCreateDrawing(drawingType); // Reset logic when type changes useEffect(() => { // Optional: clear fields or set defaults }, [drawingType]); const onSubmit = (data: DrawingFormData) => { const formData = new FormData(); // Common fields formData.append('projectId', String(data.projectId)); formData.append('file', data.file); if (data.drawingType === 'CONTRACT') { formData.append('contractDrawingNo', data.contractDrawingNo); formData.append('title', data.title); formData.append('mapCatId', data.mapCatId); if (data.volumeId) formData.append('volumeId', data.volumeId); if (data.volumePage) formData.append('volumePage', String(data.volumePage)); } else if (data.drawingType === 'SHOP') { formData.append('drawingNumber', data.drawingNumber); formData.append('mainCategoryId', data.mainCategoryId); formData.append('subCategoryId', data.subCategoryId); formData.append('revisionLabel', data.revisionLabel || '0'); formData.append('title', data.title); // Revision Title if (data.legacyDrawingNumber) formData.append('legacyDrawingNumber', data.legacyDrawingNumber); if (data.description) formData.append('description', data.description); // Date default to now } else if (data.drawingType === 'AS_BUILT') { formData.append('drawingNumber', data.drawingNumber); formData.append('mainCategoryId', data.mainCategoryId); formData.append('subCategoryId', data.subCategoryId); formData.append('revisionLabel', data.revisionLabel || '0'); formData.append('title', data.title); if (data.legacyDrawingNumber) formData.append('legacyDrawingNumber', data.legacyDrawingNumber); if (data.description) formData.append('description', data.description); } createMutation.mutate(formData as any, { onSuccess: () => { router.push("/drawings"); } }); }; return (

Drawing Information

{/* CONTRACT FIELDS */} {drawingType === 'CONTRACT' && ( <>
{(errors as any).contractDrawingNo && (

{(errors as any).contractDrawingNo.message}

)}
{(errors as any).title && (

{(errors as any).title.message}

)}
{(errors as any).mapCatId && (

{(errors as any).mapCatId.message}

)}
)} {/* SHOP FIELDS */} {drawingType === 'SHOP' && ( <>
{(errors as any).drawingNumber && (

{(errors as any).drawingNumber.message}

)}
{(errors as any).mainCategoryId && (

{(errors as any).mainCategoryId.message}

)}
{(errors as any).subCategoryId && (

{(errors as any).subCategoryId.message}

)}
{(errors as any).title && (

{(errors as any).title.message}

)}