"use client" import * as React from "react" import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import { toast } from "sonner" import * as z from "zod" import { Loader2 } from "lucide-react" import { Button } from "@/components/ui/button" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, } from "@/components/ui/sheet" import { Input } from "@/components/ui/input" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Textarea } from "@/components/ui/textarea" import { updateIntegration } from "../service" import { integrations } from "@/db/schema/integration" const updateIntegrationSchema = z.object({ code: z.string().min(1, "코드는 필수입니다."), name: z.string().min(1, "이름은 필수입니다."), type: z.enum(["rest_api", "soap", "db_to_db"], { required_error: "타입은 필수입니다." }), description: z.string().optional(), sourceSystem: z.string().min(1, "소스 시스템은 필수입니다."), targetSystem: z.string().min(1, "타겟 시스템은 필수입니다."), status: z.enum(["active", "inactive", "deprecated"]), metadata: z.any().optional(), }) type UpdateIntegrationFormValues = z.infer interface IntegrationEditSheetProps { data: typeof integrations.$inferSelect | null open?: boolean onOpenChange?: (open: boolean) => void onSuccess?: () => void } export function IntegrationEditSheet({ data, open, onOpenChange, onSuccess }: IntegrationEditSheetProps) { const [isLoading, setIsLoading] = React.useState(false) const form = useForm({ resolver: zodResolver(updateIntegrationSchema), defaultValues: { code: data?.code || "", name: data?.name || "", type: data?.type || "rest_api", description: data?.description || "", sourceSystem: data?.sourceSystem || "", targetSystem: data?.targetSystem || "", status: data?.status || "active", metadata: data?.metadata || {}, }, }) React.useEffect(() => { if (data) { form.reset({ code: data.code || "", name: data.name || "", type: data.type || "rest_api", description: data.description || "", sourceSystem: data.sourceSystem || "", targetSystem: data.targetSystem || "", status: data.status || "active", metadata: data.metadata || {}, }) } }, [data, form]) const handleCancel = () => { form.reset() onOpenChange?.(false) } const onSubmit = async (formData: UpdateIntegrationFormValues) => { if (!data) return setIsLoading(true) try { const result = await updateIntegration(data.id, formData) if (result.data) { toast.success("인터페이스가 성공적으로 수정되었습니다.") form.reset() onOpenChange?.(false) if (onSuccess) { onSuccess() } } else { toast.error(result.error || "수정 중 오류가 발생했습니다.") } } catch (error) { console.error("인터페이스 수정 오류:", error) toast.error("인터페이스 수정에 실패했습니다.") } finally { setIsLoading(false) } } return ( 인터페이스 수정 인터페이스 정보를 수정합니다. 필수 정보를 입력해주세요. * 표시된 항목은 필수 입력사항입니다.
( 코드 * )} /> ( 이름 * )} /> ( 타입 * )} /> ( 소스 시스템 * )} /> ( 타겟 시스템 * )} /> ( 상태 * )} /> ( 설명