"use client" import * as React from "react" import { useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import { z } from "zod" import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from "@/components/ui/dialog" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" // react-hook-form + shadcn/ui Form import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { createShipbuildingItemSchema, } from "../validations" import { createShipbuildingItem } from "../service" import { Plus } from "lucide-react" import { toast } from "sonner" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" const workTypes = [ { value: "기장", label: "기장" }, { value: "전장", label: "전장" }, { value: "선실", label: "선실" }, { value: "배관", label: "배관" }, { value: "철의", label: "철의" }, ] as const export function AddItemDialog() { const [open, setOpen] = React.useState(false) const [isSubmitting, setIsSubmitting] = React.useState(false) // 아이템 타입에 따라 다른 폼과 스키마 사용 const getFormAndSchema = () => { return { schema: createShipbuildingItemSchema, defaultValues: { itemCode: "", itemName: "", description: "", workType: "", shipTypes: "", } }; }; const { schema, defaultValues } = getFormAndSchema(); // 타입 안전성을 위해 구체적인 타입 사용 type ItemFormSchema = | z.infer const form = useForm({ resolver: zodResolver(schema), defaultValues, }); async function onSubmit(values: ItemFormSchema) { try { setIsSubmitting(true) // 타입에 따라 다른 로직 추가 가능 const result = await createShipbuildingItem(values) if (result.success) { toast.success("아이템이 추가되었습니다.") form.reset() setOpen(false) } else { toast.error(result.message || "아이템 추가 실패") } } catch (error) { toast.error("오류가 발생했습니다.") console.error(error) } finally { setIsSubmitting(false) } } return ( 아이템 추가 {'조선 아이템을 추가합니다. 아이템 코드, 이름, 설명을 입력하세요.'}
( 아이템 코드 )} /> ( 아이템 이름 )} /> ( 설명