import { useCallback, useEffect, useState } from 'react' import { AlertTriangle, Loader2, RotateCcw, Trash2 } from 'lucide-react' import { api, type PapierkorbSeite, type PapierkorbEintrag } from '../api' import { run, useStore } from '../store' import { bytes, zeit } from '../format' import { Karte, Knopf, Leer, Nachfrage } from '../components/Bausteine' /** Der Papierkorb. * * Löschen war bis vor Kurzem endgültig — die Sicherung half nur bis zum * letzten nächtlichen Lauf. Bei einem Knopf „alle 3670 wählen" direkt neben * „löschen" ist das die falsche Härte. * * Was hier steht, liegt weiterhin auf der Platte, nur nicht mehr unter seiner * öffentlichen Adresse. Nach 30 Tagen räumt der Dienst selbst auf. */ export function Papierkorb() { const note = useStore((s) => s.note) const [daten, setDaten] = useState(null) const [gewaehlt, setGewaehlt] = useState>(new Set()) const [laeuft, setLaeuft] = useState(false) const [fragt, setFragt] = useState(null) const laden = useCallback(async () => { try { setDaten(await api.papierkorb()) } catch (err) { note('fehler', err instanceof Error ? err.message : 'Unbekannt') } }, [note]) useEffect(() => { void laden() }, [laden]) if (!daten) { return (
) } const items = daten.items const auswahl = items.filter((i) => gewaehlt.has(i.id)) async function zurueck(liste: PapierkorbEintrag[]) { setLaeuft(true) await run( () => api.papierkorbZurueck(liste.map((e) => e.id)), (r) => r.fehlgeschlagen === 0 ? `${r.zurueck} zurückgeholt.` : `${r.zurueck} zurückgeholt, ${r.fehlgeschlagen} nicht: ` + r.ergebnisse .filter((e) => !e.ok) .slice(0, 3) .map((e) => `${e.path} (${e.error})`) .join('; '), ) setLaeuft(false) setGewaehlt(new Set()) void laden() } return (
{daten.n} {daten.n === 1 ? 'Eintrag' : 'Einträge'} · {bytes(daten.bytes)} {auswahl.length > 0 && ( <> void zurueck(auswahl)} kind={ <> {auswahl.length} zurückholen } /> setFragt(auswahl)} kind={`${auswahl.length} endgültig löschen`} /> )} {items.length > 0 && ( setFragt('alles')} kind={ <> Papierkorb leeren } /> )}
{items.length === 0 ? ( } text="Der Papierkorb ist leer." /> ) : ( {items.map((e) => ( ))}
Pfad Größe Gelöscht Von
setGewaehlt((alt) => { const neu = new Set(alt) if (ev.target.checked) neu.add(e.id) else neu.delete(e.id) return neu }) } className="accent-akzent" /> {e.path} {bytes(e.size)} {zeit(e.geloescht)} {e.von}
)}

Einträge werden nach {daten.haltbarTage} Tagen von selbst endgültig entfernt. Solange sie hier stehen, liegen sie weiterhin auf der Platte — nur nicht mehr unter ihrer öffentlichen Adresse.

setFragt(null)} onJa={async () => { setLaeuft(true) await run( () => api.papierkorbLeeren( fragt === 'alles' ? undefined : (fragt ?? []).map((e) => e.id), ), (r) => `${r.geleert} endgültig entfernt.`, ) setLaeuft(false) setFragt(null) setGewaehlt(new Set()) void laden() }} text={

{fragt === 'alles' ? `Alle ${daten.n} Einträge werden von der Platte entfernt.` : `${(fragt as PapierkorbEintrag[])?.length} Einträge werden von der Platte entfernt.`}{' '} Danach hilft nur noch die Sicherung — und die ist bis zu 24 Stunden alt.

} />
) }