import { useState, useEffect } from 'react'; import { TauriAPI, DirectoryEntry } from '../api/tauri'; import { FileTree } from './FileTree'; import { ResizablePanel } from './ResizablePanel'; import '../styles/AssetBrowser.css'; interface AssetItem { name: string; path: string; type: 'file' | 'folder'; extension?: string; } interface AssetBrowserProps { projectPath: string | null; locale: string; } type ViewMode = 'tree-split' | 'tree-only'; export function AssetBrowser({ projectPath, locale }: AssetBrowserProps) { const [viewMode, setViewMode] = useState('tree-split'); const [selectedPath, setSelectedPath] = useState(null); const [assets, setAssets] = useState([]); const [searchQuery, setSearchQuery] = useState(''); const [loading, setLoading] = useState(false); const translations = { en: { title: 'Assets', noProject: 'No project loaded', loading: 'Loading...', empty: 'No assets found', search: 'Search...', viewTreeSplit: 'Tree + List', viewTreeOnly: 'Tree Only', name: 'Name', type: 'Type', file: 'File', folder: 'Folder' }, zh: { title: '资产', noProject: '没有加载项目', loading: '加载中...', empty: '没有找到资产', search: '搜索...', viewTreeSplit: '树形+列表', viewTreeOnly: '纯树形', name: '名称', type: '类型', file: '文件', folder: '文件夹' } }; const t = translations[locale as keyof typeof translations] || translations.en; useEffect(() => { if (projectPath) { if (viewMode === 'tree-split') { loadAssets(projectPath); } } else { setAssets([]); setSelectedPath(null); } }, [projectPath, viewMode]); const loadAssets = async (path: string) => { setLoading(true); try { const entries = await TauriAPI.listDirectory(path); const assetItems: AssetItem[] = entries.map((entry: DirectoryEntry) => { const extension = entry.is_dir ? undefined : (entry.name.includes('.') ? entry.name.split('.').pop() : undefined); return { name: entry.name, path: entry.path, type: entry.is_dir ? 'folder' as const : 'file' as const, extension }; }); setAssets(assetItems); } catch (error) { console.error('Failed to load assets:', error); setAssets([]); } finally { setLoading(false); } }; const handleTreeSelect = (path: string) => { setSelectedPath(path); if (viewMode === 'tree-split') { loadAssets(path); } }; const handleAssetClick = (asset: AssetItem) => { setSelectedPath(asset.path); }; const handleAssetDoubleClick = (asset: AssetItem) => { console.log('Open asset:', asset); }; const filteredAssets = searchQuery ? assets.filter(asset => asset.type === 'file' && asset.name.toLowerCase().includes(searchQuery.toLowerCase()) ) : assets.filter(asset => asset.type === 'file'); const getFileIcon = (extension?: string) => { switch (extension?.toLowerCase()) { case 'ts': case 'tsx': case 'js': case 'jsx': return ( ); case 'json': return ( ); case 'png': case 'jpg': case 'jpeg': case 'gif': return ( ); default: return ( ); } }; if (!projectPath) { return (

{t.title}

{t.noProject}

); } const renderListView = () => (
setSearchQuery(e.target.value)} />
{loading ? (

{t.loading}

) : filteredAssets.length === 0 ? (

{t.empty}

) : (
{filteredAssets.map((asset, index) => (
handleAssetClick(asset)} onDoubleClick={() => handleAssetDoubleClick(asset)} > {getFileIcon(asset.extension)}
{asset.name}
{asset.extension || t.file}
))}
)}
); return (

{t.title}

{viewMode === 'tree-only' ? (
setSearchQuery(e.target.value)} />
) : (
} rightOrBottom={renderListView()} /> )}
); }