"use client"; import React, { useState, useEffect } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { GlobalFileManager, GlobalFileInfo } from "@/lib/api/globalFile"; import { downloadFile } from "@/lib/api/file"; import { FileViewerModal } from "@/lib/registry/components/file-upload/FileViewerModal"; import { formatFileSize } from "@/lib/utils"; import { toast } from "sonner"; import { showErrorToast } from "@/lib/utils/toastUtils"; import { File, FileText, Image, Video, Music, Archive, Download, Eye, Search, Trash2, Clock, MapPin, Monitor, RefreshCw, Info, } from "lucide-react"; interface GlobalFileViewerProps { showControls?: boolean; maxHeight?: string; className?: string; } export const GlobalFileViewer: React.FC = ({ showControls = true, maxHeight = "600px", className = "", }) => { const [allFiles, setAllFiles] = useState([]); const [filteredFiles, setFilteredFiles] = useState([]); const [searchQuery, setSearchQuery] = useState(""); const [selectedTab, setSelectedTab] = useState("all"); const [viewerFile, setViewerFile] = useState(null); const [isViewerOpen, setIsViewerOpen] = useState(false); const [registryInfo, setRegistryInfo] = useState({ totalFiles: 0, accessibleFiles: 0, pages: [] as string[], screens: [] as number[], }); // 파일 아이콘 가져오기 const getFileIcon = (fileName: string, size: number = 16) => { const extension = fileName.split(".").pop()?.toLowerCase() || ""; const iconProps = { size, className: "text-muted-foreground" }; if (["jpg", "jpeg", "png", "gif", "bmp", "webp", "svg"].includes(extension)) { return ; } if (["mp4", "avi", "mov", "wmv", "flv", "webm"].includes(extension)) { return