// components/rfq/waive-response-dialog.tsx "use client"; import { useState } 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 { FileX, Loader2, AlertTriangle } from "lucide-react"; import { useToast } from "@/hooks/use-toast"; import { useRouter } from "next/navigation"; const waiveFormSchema = z.object({ responseComment: z.string().min(1, "포기 사유를 입력해주세요"), vendorComment: z.string().optional(), }); type WaiveFormData = z.infer; interface WaiveResponseDialogProps { responseId: number; attachmentType: string; serialNo: string; trigger?: React.ReactNode; onSuccess?: () => void; } export function WaiveResponseDialog({ responseId, attachmentType, serialNo, trigger, onSuccess, }: WaiveResponseDialogProps) { const [open, setOpen] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const { toast } = useToast(); const router = useRouter(); const form = useForm({ resolver: zodResolver(waiveFormSchema), defaultValues: { responseComment: "", vendorComment: "", }, }); const onSubmit = async (data: WaiveFormData) => { setIsSubmitting(true); try { const response = await fetch("/api/vendor-responses/waive", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ responseId, responseComment: data.responseComment, vendorComment: data.vendorComment, }), }); if (!response.ok) { const error = await response.json(); throw new Error(error.message || "응답 포기 처리 실패"); } toast({ title: "응답 포기 완료", description: "해당 항목에 대한 응답이 포기 처리되었습니다.", }); setOpen(false); form.reset(); router.refresh(); onSuccess?.(); } catch (error) { console.error("Waive error:", error); toast({ title: "처리 실패", description: error instanceof Error ? error.message : "알 수 없는 오류가 발생했습니다.", variant: "destructive", }); } finally { setIsSubmitting(false); } }; return ( {trigger || ( )} 응답 포기
{serialNo} {attachmentType}
주의사항

응답을 포기하면 해당 항목에 대한 입찰 참여가 불가능합니다. 포기 사유를 명확히 기입해 주세요.

{/* 포기 사유 (필수) */} ( 포기 사유 *