import { useState, useEffect } from 'react'; import { CloudFolderTree } from './CloudFolderTree'; import { CloudFileList } from './CloudFileList'; import { cloudService, type CloudFolder, type CloudFile, type CloudQuota } from '../services/cloudService'; interface CloudBrowserViewProps { onUploadClick?: () => void; } export function CloudBrowserView({ onUploadClick: _onUploadClick }: CloudBrowserViewProps) { const [folders, setFolders] = useState([]); const [files, setFiles] = useState([]); const [selectedFolderId, setSelectedFolderId] = useState(null); const [quota, setQuota] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { loadData(); }, [selectedFolderId]); async function loadData() { setLoading(true); try { const [folderData, fileData, quotaData] = await Promise.all([ cloudService.listFolders(selectedFolderId ?? undefined), cloudService.listFiles(selectedFolderId ?? undefined), cloudService.getQuota(), ]); setFolders((prev) => { const otherFolders = prev.filter( (f) => f.parent_id !== (selectedFolderId ?? null) || !selectedFolderId ); return [...otherFolders, ...folderData].filter( (f, i, arr) => arr.findIndex((x) => x.id === f.id) === i ); }); setFiles(fileData); setQuota(quotaData); } catch { // Errors handled silently } finally { setLoading(false); } } return (
{loading ? (
) : ( { await cloudService.deleteFile(id); loadData(); }} onPublishFile={async (id) => { await cloudService.publishAsTrack(id); }} /> )}
); } function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; }