import { useState, useEffect } from 'react'; import { X, Star, Folder, Globe, FileText, Database, Server, Mail, Image, Film, Music, Archive, Terminal, Settings, HardDrive, Network, Cloud } from 'lucide-react'; import { comms } from '@/communication'; import { FavoriteItem } from '@/types'; interface FavoriteDialogProps { isOpen: boolean; onClose: () => void; } // URL 유형에 따른 아이콘 및 색상 반환 function getIconInfo(url: string): { icon: React.ElementType; color: string; bgColor: string } { const lowerUrl = url.toLowerCase(); // 로컬 폴더/드라이브 경로 if (lowerUrl.match(/^[a-z]:\\/i) || lowerUrl.startsWith('\\\\') || lowerUrl.startsWith('file:')) { // 네트워크 경로 if (lowerUrl.startsWith('\\\\')) { return { icon: Network, color: 'text-purple-400', bgColor: 'from-purple-500/30 to-purple-600/30' }; } return { icon: Folder, color: 'text-yellow-400', bgColor: 'from-yellow-500/30 to-yellow-600/30' }; } // 웹 URL if (lowerUrl.startsWith('http://') || lowerUrl.startsWith('https://')) { // 특정 서비스 감지 if (lowerUrl.includes('mail') || lowerUrl.includes('outlook') || lowerUrl.includes('gmail')) { return { icon: Mail, color: 'text-red-400', bgColor: 'from-red-500/30 to-red-600/30' }; } if (lowerUrl.includes('cloud') || lowerUrl.includes('drive') || lowerUrl.includes('onedrive') || lowerUrl.includes('dropbox')) { return { icon: Cloud, color: 'text-sky-400', bgColor: 'from-sky-500/30 to-sky-600/30' }; } if (lowerUrl.includes('server') || lowerUrl.includes('admin')) { return { icon: Server, color: 'text-orange-400', bgColor: 'from-orange-500/30 to-orange-600/30' }; } if (lowerUrl.includes('database') || lowerUrl.includes('sql') || lowerUrl.includes('db')) { return { icon: Database, color: 'text-emerald-400', bgColor: 'from-emerald-500/30 to-emerald-600/30' }; } return { icon: Globe, color: 'text-blue-400', bgColor: 'from-blue-500/30 to-blue-600/30' }; } // 실행 파일 if (lowerUrl.endsWith('.exe') || lowerUrl.endsWith('.bat') || lowerUrl.endsWith('.cmd') || lowerUrl.endsWith('.ps1')) { return { icon: Terminal, color: 'text-green-400', bgColor: 'from-green-500/30 to-green-600/30' }; } // 문서 파일 if (lowerUrl.match(/\.(doc|docx|pdf|txt|xls|xlsx|ppt|pptx|hwp)$/i)) { return { icon: FileText, color: 'text-blue-400', bgColor: 'from-blue-500/30 to-blue-600/30' }; } // 이미지 파일 if (lowerUrl.match(/\.(jpg|jpeg|png|gif|bmp|svg|webp)$/i)) { return { icon: Image, color: 'text-pink-400', bgColor: 'from-pink-500/30 to-pink-600/30' }; } // 비디오 파일 if (lowerUrl.match(/\.(mp4|avi|mkv|mov|wmv)$/i)) { return { icon: Film, color: 'text-violet-400', bgColor: 'from-violet-500/30 to-violet-600/30' }; } // 오디오 파일 if (lowerUrl.match(/\.(mp3|wav|flac|aac|ogg)$/i)) { return { icon: Music, color: 'text-rose-400', bgColor: 'from-rose-500/30 to-rose-600/30' }; } // 압축 파일 if (lowerUrl.match(/\.(zip|rar|7z|tar|gz)$/i)) { return { icon: Archive, color: 'text-amber-400', bgColor: 'from-amber-500/30 to-amber-600/30' }; } // 설정 파일 if (lowerUrl.match(/\.(ini|cfg|config|xml|json|yaml|yml)$/i)) { return { icon: Settings, color: 'text-gray-400', bgColor: 'from-gray-500/30 to-gray-600/30' }; } // 드라이브 루트 if (lowerUrl.match(/^[a-z]:$/i)) { return { icon: HardDrive, color: 'text-slate-400', bgColor: 'from-slate-500/30 to-slate-600/30' }; } // 기본값: 폴더 return { icon: Folder, color: 'text-yellow-400', bgColor: 'from-yellow-500/30 to-yellow-600/30' }; } export function FavoriteDialog({ isOpen, onClose }: FavoriteDialogProps) { const [favorites, setFavorites] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { if (isOpen) { loadFavorites(); } }, [isOpen]); useEffect(() => { const handleEscape = (e: KeyboardEvent) => { if (e.key === 'Escape' && isOpen) { onClose(); } }; if (isOpen) { window.addEventListener('keydown', handleEscape); return () => window.removeEventListener('keydown', handleEscape); } }, [isOpen, onClose]); const loadFavorites = async () => { setLoading(true); try { const response = await comms.getFavoriteList(); if (response.Success && response.Data) { // 이름으로 정렬 const sorted = (response.Data as FavoriteItem[]).sort((a, b) => a.name.localeCompare(b.name, 'ko') ); setFavorites(sorted); } } catch (error) { console.error('즐겨찾기 로드 오류:', error); } finally { setLoading(false); } }; const handleItemClick = (url: string) => { window.open(url, '_blank'); onClose(); }; if (!isOpen) return null; return (
{/* Backdrop */}
{/* Dialog */}
{/* Header */}

즐겨찾기

({favorites.length}개)
{/* Content */}
{loading ? (
) : favorites.length === 0 ? (
등록된 즐겨찾기가 없습니다.
) : (
{favorites.map((item, index) => { const { icon: Icon, color, bgColor } = getIconInfo(item.url); return ( ); })}
)}
{/* Footer */}

클릭하면 새 탭에서 열립니다

); }