"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 { 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