"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 { drawingApi } from "@/lib/api/drawings"; import { useState } from "react"; import { Loader2 } from "lucide-react"; const drawingSchema = z.object({ drawing_type: z.enum(["CONTRACT", "SHOP"], { required_error: "Type is required" }), drawing_number: z.string().min(1, "Drawing Number is required"), title: z.string().min(5, "Title must be at least 5 characters"), discipline_id: z.number({ required_error: "Discipline is required" }), sheet_number: z.string().min(1, "Sheet Number is required"), scale: z.string().optional(), file: z.instanceof(File, { message: "File is required" }), }); type DrawingFormData = z.infer; export function DrawingUploadForm() { const router = useRouter(); const [isSubmitting, setIsSubmitting] = useState(false); const { register, handleSubmit, setValue, formState: { errors }, } = useForm({ resolver: zodResolver(drawingSchema), }); const onSubmit = async (data: DrawingFormData) => { setIsSubmitting(true); try { await drawingApi.create(data as any); router.push("/drawings"); router.refresh(); } catch (error) { console.error(error); alert("Failed to upload drawing"); } finally { setIsSubmitting(false); } }; return (

Drawing Information

{errors.drawing_type && (

{errors.drawing_type.message}

)}
{errors.drawing_number && (

{errors.drawing_number.message}

)}
{errors.sheet_number && (

{errors.sheet_number.message}

)}
{errors.title && (

{errors.title.message}

)}
{errors.discipline_id && (

{errors.discipline_id.message}

)}
{ const file = e.target.files?.[0]; if (file) setValue("file", file); }} />

Accepted: PDF, DWG (Max 50MB)

{errors.file && (

{errors.file.message}

)}
); }