import { useState, useEffect } from 'react' import { trashApi, filesApi, type TrashItem } from '../api/client' import { formatBytes } from './FileBrowser' import PageHeader from '../components/PageHeader' import ConfirmDialog from '../components/ConfirmDialog' interface Props { /** Wiederherstellen verรคndert den belegten Speicher โ€“ Balken nachziehen. */ onUserChanged?: () => Promise } export default function TrashPage({ onUserChanged }: Props) { const [items, setItems] = useState([]) const [loading, setLoading] = useState(true) const [confirmDelete, setConfirmDelete] = useState(null) const [confirmEmpty, setConfirmEmpty] = useState(false) const [emptying, setEmptying] = useState(false) useEffect(() => { trashApi.list() .then(data => setItems(data ?? [])) .catch(() => {}) .finally(() => setLoading(false)) }, []) async function restore(file: TrashItem) { await trashApi.restore(file.id) setItems(i => i.filter(x => x.id !== file.id)) await onUserChanged?.() } async function emptyAll() { setEmptying(true) try { await trashApi.emptyAll() setItems([]) await onUserChanged?.() } catch { /* Liste bleibt stehen, damit der Fehlschlag sichtbar ist */ } setEmptying(false) setConfirmEmpty(false) } async function deletePermanently(file: TrashItem) { await trashApi.deletePermanently(file.id) setItems(i => i.filter(x => x.id !== file.id)) setConfirmDelete(null) } return (
} title="Trash" meta={items.length > 0 ? `${items.length} item${items.length !== 1 ? 's' : ''}` : undefined} > {items.length > 0 && ( )}
{loading && (
)} {!loading && items.length === 0 && (
๐Ÿ—‘

Trash is empty

)} {!loading && items.length > 0 && (
{items.map(file => (
{/* Thumbnail or icon */}
{file.has_thumbnail ? ( { e.currentTarget.style.display = 'none' }} /> ) : ( {mimeEmoji(file.mime_type)} )}
{/* Info */}

{file.name}

{formatBytes(file.size)} {file.folder_path ? `Home / ${file.folder_path}` : 'Home'}

{/* Actions */}
))}
)}
{confirmDelete && ( deletePermanently(confirmDelete)} onCancel={() => setConfirmDelete(null)} /> )} {confirmEmpty && ( setConfirmEmpty(false)} /> )}
) } function mimeEmoji(mime: string): string { if (mime.startsWith('image/')) return '๐Ÿ–ผ' if (mime.startsWith('video/')) return '๐ŸŽฌ' if (mime.startsWith('audio/')) return '๐ŸŽต' if (mime.includes('pdf')) return '๐Ÿ“„' if (mime.includes('zip') || mime.includes('tar')) return '๐Ÿ“ฆ' if (mime.includes('word') || mime.includes('document')) return '๐Ÿ“' if (mime.includes('sheet') || mime.includes('excel')) return '๐Ÿ“Š' return '๐Ÿ“' }