"use client"; import React, { useState, useEffect } from "react"; import { XMarkIcon, PencilIcon, CheckIcon, ArrowDownTrayIcon, TagIcon, DocumentIcon, } from "@heroicons/react/24/outline"; interface MediaFile { id: string; fileName: string; originalName: string; mimeType: string; size: number; url: string; thumbnailUrl?: string; createdAt: string; downloadCount?: number; viewCount?: number; tags?: string[]; description?: string; dimensions?: { width: number; height: number; }; metadata?: Record; } interface MediaPreviewProps { file: MediaFile | null; isOpen: boolean; onClose: () => void; onUpdate?: (file: MediaFile) => void; onDelete?: (fileId: string) => void; className?: string; } export function MediaPreview({ file, isOpen, onClose, onUpdate, onDelete, className = "", }: MediaPreviewProps) { const [isEditing, setIsEditing] = useState(false); const [editData, setEditData] = useState({ originalName: "", description: "", tags: [] as string[], }); const [newTag, setNewTag] = useState(""); useEffect(() => { if (file) { setEditData({ originalName: file.originalName, description: file.description || "", tags: file.tags || [], }); } }, [file]); if (!isOpen || !file) return null; const handleSave = () => { if (onUpdate) { onUpdate({ ...file, originalName: editData.originalName, description: editData.description, tags: editData.tags, }); } setIsEditing(false); }; const handleCancel = () => { setEditData({ originalName: file.originalName, description: file.description || "", tags: file.tags || [], }); setIsEditing(false); }; const addTag = () => { if (newTag.trim() && !editData.tags.includes(newTag.trim())) { setEditData({ ...editData, tags: [...editData.tags, newTag.trim()], }); setNewTag(""); } }; const removeTag = (tagToRemove: string) => { setEditData({ ...editData, tags: editData.tags.filter((tag) => tag !== tagToRemove), }); }; const formatFileSize = (bytes: number): string => { 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]; }; const formatDate = (dateString: string): string => { return new Date(dateString).toLocaleDateString("ko-KR", { year: "numeric", month: "long", day: "numeric", hour: "2-digit", minute: "2-digit", }); }; const getFileTypeIcon = (mimeType: string) => { if (mimeType.startsWith("image/")) return "๐Ÿ–ผ๏ธ"; if (mimeType.startsWith("video/")) return "๐ŸŽฅ"; if (mimeType.startsWith("audio/")) return "๐ŸŽต"; if (mimeType.includes("pdf")) return "๐Ÿ“„"; return "๐Ÿ“"; }; const renderPreview = () => { const mimeType = file.mimeType; if (mimeType.startsWith("image/")) { return (
{file.originalName} { (e.target as HTMLImageElement).src = file.thumbnailUrl || "/placeholder-image.png"; }} />
); } if (mimeType.startsWith("video/")) { return (
); } if (mimeType.startsWith("audio/")) { return (
๐ŸŽต
); } if (mimeType.includes("pdf")) { return (

PDF ๋ฏธ๋ฆฌ๋ณด๊ธฐ

์ƒˆ ์ฐฝ์—์„œ ์—ด๊ธฐ
); } return (
{getFileTypeIcon(mimeType)}

๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

); }; return (
{/* ํ—ค๋” */}
{getFileTypeIcon(file.mimeType)} {isEditing ? ( setEditData({ ...editData, originalName: e.target.value }) } className="text-lg font-semibold border border-gray-300 rounded px-2 py-1 focus:ring-2 focus:ring-blue-500" /> ) : (

{file.originalName}

)}
{isEditing ? ( <> ) : ( )}
{/* ๋ฏธ๋ฆฌ๋ณด๊ธฐ */}
{renderPreview()}
{/* ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ */}
{/* ๊ธฐ๋ณธ ์ •๋ณด */}

ํŒŒ์ผ ์ •๋ณด

ํฌ๊ธฐ: {formatFileSize(file.size)}
ํ˜•์‹: {file.mimeType}
{file.dimensions && (
ํฌ๊ธฐ: {file.dimensions.width} ร— {file.dimensions.height}
)}
์—…๋กœ๋“œ: {formatDate(file.createdAt)}
{typeof file.downloadCount !== "undefined" && (
๋‹ค์šด๋กœ๋“œ: {file.downloadCount}ํšŒ
)} {typeof file.viewCount !== "undefined" && (
์กฐํšŒ: {file.viewCount}ํšŒ
)}
{/* ์„ค๋ช… */}

์„ค๋ช…

{isEditing ? (