"use client"; import * as React from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { ScrollArea } from "@/components/ui/scroll-area"; import { formatDate } from "@/lib/utils"; import { toast } from "sonner"; import { cn } from "@/lib/utils"; import { BasicContractSignViewer } from "@/lib/basic-contract/viewer/basic-contract-sign-viewer"; import type { WebViewerInstance } from "@pdftron/webviewer"; import type { BasicContractView } from "@/db/schema"; import { Upload, FileSignature, CheckCircle2, Search, Clock, FileText, User, AlertCircle, Calendar } from "lucide-react"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; import { useRouter } from "next/navigation" // 수정된 props 인터페이스 interface BasicContractSignDialogProps { contracts: BasicContractView[]; onSuccess?: () => void; } export function BasicContractSignDialog({ contracts, onSuccess }: BasicContractSignDialogProps) { const [open, setOpen] = React.useState(false); const [selectedContract, setSelectedContract] = React.useState(null); const [instance, setInstance] = React.useState(null); const [searchTerm, setSearchTerm] = React.useState(""); const [isSubmitting, setIsSubmitting] = React.useState(false); const router = useRouter() // 다이얼로그 열기/닫기 핸들러 const handleOpenChange = (isOpen: boolean) => { setOpen(isOpen); // 다이얼로그가 열릴 때 첫 번째 계약서 자동 선택 if (isOpen && contracts.length > 0 && !selectedContract) { setSelectedContract(contracts[0]); } if (!isOpen) { setSelectedContract(null); setSearchTerm(""); } }; // 계약서 선택 핸들러 const handleSelectContract = (contract: BasicContractView) => { setSelectedContract(contract); }; // 검색된 계약서 필터링 const filteredContracts = React.useMemo(() => { if (!searchTerm.trim()) return contracts; const term = searchTerm.toLowerCase(); return contracts.filter(contract => (contract.templateName || '').toLowerCase().includes(term) || (contract.userName || '').toLowerCase().includes(term) ); }, [contracts, searchTerm]); // 다이얼로그가 열릴 때 첫 번째 계약서 자동 선택 React.useEffect(() => { if (open && contracts.length > 0 && !selectedContract) { setSelectedContract(contracts[0]); } }, [open, contracts, selectedContract]); // 서명 완료 핸들러 const completeSign = async () => { if (!instance || !selectedContract) return; setIsSubmitting(true); try { const { documentViewer, annotationManager } = instance.Core; const doc = documentViewer.getDocument(); const xfdfString = await annotationManager.exportAnnotations(); const data = await doc.getFileData({ xfdfString, downloadType: "pdf", }); // FormData 생성 및 파일 추가 const formData = new FormData(); formData.append('file', new Blob([data], { type: 'application/pdf' })); formData.append('tableRowId', selectedContract.id.toString()); formData.append('templateName', selectedContract.fileName || ''); // API 호출 const response = await fetch('/api/upload/signed-contract', { method: 'POST', body: formData, next: { tags: ["basicContractView-vendor"] }, }); const result = await response.json(); if (result.result) { toast.success("서명이 성공적으로 완료되었습니다.", { description: "문서가 성공적으로 처리되었습니다.", icon: }); router.refresh(); setOpen(false); if (onSuccess) { onSuccess(); } } else { toast.error("서명 처리 중 오류가 발생했습니다.", { description: result.error, icon: }); } } catch (error) { console.error("서명 완료 중 오류:", error); toast.error("서명 처리 중 오류가 발생했습니다."); } finally { setIsSubmitting(false); } }; // 서명 대기중(PENDING) 계약서가 있는지 확인 const hasPendingContracts = contracts.length > 0; return ( <> {/* 서명 버튼 */} {/* 서명 다이얼로그 - 고정 높이 유지 */} 기본계약서 및 관련문서 서명
{/* 왼쪽 영역 - 계약서 목록 */}
setSearchTerm(e.target.value)} />
전체 ({contracts.length}) 계약서 관련문서
{filteredContracts.length === 0 ? (

서명 요청된 문서가 없습니다.

나중에 다시 확인해주세요.

) : (
{filteredContracts.map((contract) => ( ))}
)}
{/* 오른쪽 영역 - 문서 뷰어 */}
{selectedContract ? ( <>

{selectedContract.templateName || '문서'}

요청자: {selectedContract.userName || '알 수 없음'} {formatDate(selectedContract.createdAt)}

서명 후에는 변경할 수 없습니다.

) : (

문서를 선택해주세요

왼쪽 목록에서 서명할 문서를 선택하면 여기에 문서 내용이 표시됩니다.

)}
); }