"use client" import * as React from "react" import { Download, FileText, Calendar, HardDrive } from "lucide-react" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Badge } from "@/components/ui/badge" import { format } from "date-fns" import { ko } from "date-fns/locale" import type { ProjectGtcView } from "@/db/schema" interface ViewGtcFileDialogProps { project: ProjectGtcView | null open: boolean onOpenChange: (open: boolean) => void } // 파일 크기 포맷팅 함수 function formatBytes(bytes: number | null): string { if (!bytes) return "0 B" const k = 1024 const sizes = ['B', 'KB', 'MB', 'GB'] const i = Math.floor(Math.log(bytes) / Math.log(k)) return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i] } export function ViewGtcFileDialog({ project, open, onOpenChange, }: ViewGtcFileDialogProps) { if (!project || !project.gtcFileId) return null const handleDownload = async () => { try { // API를 통해 파일 다운로드 const response = await fetch(`/api/project-gtc?action=download&projectId=${project.id}`, { method: 'GET', }); if (!response.ok) { throw new Error('파일 다운로드에 실패했습니다.'); } // 파일 blob 생성 const blob = await response.blob(); // 다운로드 링크 생성 const url = window.URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = project.originalFileName || 'gtc-file'; document.body.appendChild(link); link.click(); document.body.removeChild(link); // 메모리 정리 window.URL.revokeObjectURL(url); } catch (error) { console.error("파일 다운로드 오류:", error); } } const handlePreview = async () => { try { // API를 통해 파일 다운로드 const response = await fetch(`/api/project-gtc?action=download&projectId=${project.id}`, { method: 'GET', }); if (!response.ok) { throw new Error('파일을 열 수 없습니다.'); } // 파일 blob 생성 const blob = await response.blob(); // PDF 파일인 경우 새 탭에서 열기 if (project.mimeType === 'application/pdf') { const url = window.URL.createObjectURL(blob); window.open(url, '_blank'); // 메모리 정리는 브라우저가 탭을 닫을 때 자동으로 처리됨 } else { // 다른 파일 타입은 다운로드 const url = window.URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = project.originalFileName || 'gtc-file'; document.body.appendChild(link); link.click(); document.body.removeChild(link); window.URL.revokeObjectURL(url); } } catch (error) { console.error("파일 미리보기 오류:", error); } } const getFileIcon = () => { if (project.mimeType?.includes('pdf')) { return "📄" } else if (project.mimeType?.includes('word') || project.mimeType?.includes('document')) { return "📝" } else if (project.mimeType?.includes('text')) { return "📃" } return "📎" } return ( GTC 파일 정보 프로젝트 "{project.name}" ({project.code})의 GTC 파일 정보입니다.
{/* 프로젝트 정보 */}

프로젝트 정보

프로젝트 코드: {project.code}
프로젝트명: {project.name}
프로젝트 타입: {project.type}
{/* 파일 정보 */}

파일 정보

{getFileIcon()}
{project.originalFileName}
{project.fileName}
파일 크기: {project.fileSize ? formatBytes(project.fileSize) : '알 수 없음'}
파일 타입: {project.mimeType || '알 수 없음'}
업로드일: {project.gtcCreatedAt ? format(new Date(project.gtcCreatedAt), "yyyy-MM-dd HH:mm", { locale: ko }) : '알 수 없음' }
수정일: {project.gtcUpdatedAt ? format(new Date(project.gtcUpdatedAt), "yyyy-MM-dd HH:mm", { locale: ko }) : '알 수 없음' }
) }