// components/rfq/request-revision-dialog.tsx "use client"; import { useState, useTransition } from "react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Textarea } from "@/components/ui/textarea"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import * as z from "zod"; import { AlertTriangle, Loader2 } from "lucide-react"; import { useToast } from "@/hooks/use-toast"; import { requestRevision } from "../service"; const revisionFormSchema = z.object({ revisionReason: z .string() .min(10, "수정 요청 사유를 최소 10자 이상 입력해주세요") .max(500, "수정 요청 사유는 500자를 초과할 수 없습니다"), }); type RevisionFormData = z.infer; interface RequestRevisionDialogProps { responseId: number; attachmentType: string; serialNo: string; vendorName?: string; currentRevision: string; trigger?: React.ReactNode; onSuccess?: () => void; } export function RequestRevisionDialog({ responseId, attachmentType, serialNo, vendorName, currentRevision, trigger, onSuccess, }: RequestRevisionDialogProps) { const [open, setOpen] = useState(false); const [isPending, startTransition] = useTransition(); const { toast } = useToast(); const form = useForm({ resolver: zodResolver(revisionFormSchema), defaultValues: { revisionReason: "", }, }); const handleOpenChange = (newOpen: boolean) => { setOpen(newOpen); // 다이얼로그가 닫힐 때 form 리셋 if (!newOpen) { form.reset(); } }; const handleCancel = () => { form.reset(); setOpen(false); }; const onSubmit = async (data: RevisionFormData) => { startTransition(async () => { try { const result = await requestRevision(responseId, data.revisionReason); if (!result.success) { throw new Error(result.message); } toast({ title: "수정 요청 완료", description: result.message, }); setOpen(false); form.reset(); onSuccess?.(); } catch (error) { console.error("Request revision error:", error); toast({ title: "수정 요청 실패", description: error instanceof Error ? error.message : "알 수 없는 오류가 발생했습니다.", variant: "destructive", }); } }); }; return ( {trigger || ( )} 수정 요청
{serialNo} {attachmentType} {currentRevision} {vendorName && ( <> {vendorName} )}

수정 요청 안내

벤더에게 현재 제출된 응답에 대한 수정을 요청합니다. 수정 요청 후 벤더는 새로운 파일을 다시 제출할 수 있습니다.

( 수정 요청 사유 *