'use client' import * as React from 'react' import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { FileText, Download, User, Calendar } from 'lucide-react' import { useToast } from '@/hooks/use-toast' import { useTransition } from 'react' import { getPreQuoteDocuments, getPreQuoteDocumentForDownload } from '../service' import { downloadFile } from '@/lib/file-download' interface UploadedDocument { id: number fileName: string originalFileName: string fileSize: number | null filePath: string title: string | null description: string | null uploadedAt: string uploadedBy: string } interface BiddingPreQuoteAttachmentsDialogProps { open: boolean onOpenChange: (open: boolean) => void biddingId: number companyId: number companyName: string } export function BiddingPreQuoteAttachmentsDialog({ open, onOpenChange, biddingId, companyId, companyName }: BiddingPreQuoteAttachmentsDialogProps) { const { toast } = useToast() const [isPending, startTransition] = useTransition() const [documents, setDocuments] = React.useState([]) const [isLoading, setIsLoading] = React.useState(false) // 다이얼로그가 열릴 때 첨부파일 목록 로드 React.useEffect(() => { if (open) { loadDocuments() } }, [open, biddingId, companyId]) const loadDocuments = async () => { setIsLoading(true) try { const docs = await getPreQuoteDocuments(biddingId, companyId) // Date를 string으로 변환 const mappedDocs = docs.map(doc => ({ ...doc, uploadedAt: doc.uploadedAt.toString(), uploadedBy: doc.uploadedBy || '' })) setDocuments(mappedDocs) } catch (error) { console.error('Failed to load documents:', error) toast({ title: '오류', description: '첨부파일 목록을 불러오는데 실패했습니다.', variant: 'destructive', }) } finally { setIsLoading(false) } } // 파일 다운로드 const handleDownload = (document: UploadedDocument) => { startTransition(async () => { const result = await getPreQuoteDocumentForDownload(document.id, biddingId, companyId) if (result.success) { try { await downloadFile(result.document?.filePath, result.document?.originalFileName, { showToast: true }) } catch (error) { toast({ title: '다운로드 실패', description: '파일 다운로드에 실패했습니다.', variant: 'destructive', }) } } else { toast({ title: '다운로드 실패', description: result.error, variant: 'destructive', }) } }) } // 파일 크기 포맷팅 const formatFileSize = (bytes: number | null) => { if (!bytes) return '-' if (bytes === 0) return '0 Bytes' const k = 1024 const sizes = ['Bytes', 'KB', 'MB', 'GB'] const i = Math.floor(Math.log(bytes) / Math.log(k)) return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i] } return ( 협력업체 첨부파일 - {companyName} 협력업체가 제출한 견적 관련 첨부파일 목록입니다. {isLoading ? (

첨부파일 목록을 불러오는 중...

) : documents.length > 0 ? (
총 {documents.length}개 파일
파일명 크기 업로드일 작성자 작업 {documents.map((doc) => (
{doc.originalFileName}
{formatFileSize(doc.fileSize)}
{new Date(doc.uploadedAt).toLocaleDateString('ko-KR')}
{doc.uploadedBy}
))}
) : (

첨부파일이 없습니다

협력업체가 아직 첨부파일을 업로드하지 않았습니다.

)}
) }