// 폐찰하기 다이얼로그 "use client" import { useState } from "react" import { useSession } from "next-auth/react" import { toast } from "sonner" import { requestBiddingClosureWithApproval } from "@/lib/bidding/approval-actions" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" import { FileXIcon } from "lucide-react" interface BiddingsClosureDialogProps { open: boolean; onOpenChange: (open: boolean) => void; bidding: { id: number; title: string; biddingNumber: string; } | null; onSuccess?: () => void; } export function BiddingsClosureDialog({ open, onOpenChange, bidding, onSuccess }: BiddingsClosureDialogProps) { const { data: session } = useSession() const [description, setDescription] = useState('') const [files, setFiles] = useState([]) const [isSubmitting, setIsSubmitting] = useState(false) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!bidding || !description.trim()) { toast.error('폐찰 사유를 입력해주세요.') return } setIsSubmitting(true) try { const result = await requestBiddingClosureWithApproval({ biddingId: bidding.id, description: description.trim(), files, currentUser: { id: session?.user?.id ? Number(session.user.id) : 0, epId: session?.user?.epId || null, email: session?.user?.email || undefined, }, }) if (result.status === 'pending_approval') { toast.success('폐찰 결재가 상신되었습니다.') onOpenChange(false) // 폼 초기화 setDescription('') setFiles([]) if (onSuccess) { onSuccess() } } else { toast.error('결재 상신에 실패했습니다.') } } catch (error) { console.error('폐찰 결재 상신 실패:', error) toast.error(error instanceof Error ? error.message : '결재 상신 중 오류가 발생했습니다.') } finally { setIsSubmitting(false) } } const handleFileChange = (e: React.ChangeEvent) => { if (e.target.files) { setFiles(Array.from(e.target.files)) } } if (!bidding) return null return ( 폐찰하기 {bidding.title} ({bidding.biddingNumber})를 폐찰합니다.