import { useEffect, useState } from 'react' import { FileQuestion, FileText, Film, Image, Loader2, Music } from 'lucide-react' import { api, type Speicher } from '../api' import { useStore } from '../store' import { bytes, zeit } from '../format' import { Karte, Leer } from './Bausteine' const ARTEN: Record = { bild: { text: 'Bilder', kind: Image, farbe: 'bg-akzent' }, video: { text: 'Video', kind: Film, farbe: 'bg-warn' }, ton: { text: 'Ton', kind: Music, farbe: 'bg-gut' }, dokument: { text: 'Dokumente', kind: FileText, farbe: 'bg-schrift-leise' }, andere: { text: 'Anderes', kind: FileQuestion, farbe: 'bg-schlecht' }, } /** Was liegt da eigentlich — nach Art, nach Größe, nach Alter. * * ERST SEHEN, DANN ENTSCHEIDEN. Eine Aufbewahrungsregel („alles älter als 90 * Tage weg") ist eine Behauptung, solange niemand weiß, wie viel das wäre. * Diese Karten löschen nichts; sie liefern die Zahlen, mit denen man * entscheiden kann. */ export function SpeicherKarten() { const note = useStore((s) => s.note) const [daten, setDaten] = useState(null) useEffect(() => { api.speicher() .then(setDaten) .catch((err) => note('fehler', err instanceof Error ? err.message : 'Unbekannt')) }, [note]) if (!daten) { return (
) } const gesamt = daten.nachArt.reduce((s, a) => s + a.bytes, 0) || 1 return ( <>
{/* Ein Balken für alles, damit die Verhältnisse auf einen Blick stimmen — Zahlen untereinander liest man, Anteile sieht man. */}
{daten.nachArt .filter((a) => a.bytes > 0) .map((a) => (
))}
{daten.nachArt.map((a) => { const g = ARTEN[a.art] const Kind = g?.kind ?? FileQuestion return ( ) })}
{g?.text ?? a.art} {a.files} {bytes(a.bytes)} {gesamt > 1 ? `${Math.round((a.bytes / gesamt) * 100)} %` : '—'}
{daten.groesste.length === 0 ? ( ) : (
    {daten.groesste.map((m) => (
  • {m.path} {bytes(m.size)}
  • ))}
)}
{daten.doppelte.length === 0 ? (

Nichts doppelt — jeder Inhalt liegt genau einmal.

) : (

Derselbe Inhalt unter mehreren Pfaden. Kein Fehler — aber{' '} {bytes(daten.verschwendet)}{' '} Platz, den niemand gewählt hat.

    {daten.doppelte.map((d) => (
  • {d.n}× · {bytes(d.bytes / d.n)} {d.pfade.replaceAll('|', ' · ')}
  • ))}
)}

Die Frage, die eine Aufbewahrungsregel wirklich braucht — und die sich von innen nicht beantworten lässt. Gezählt wird seit dem Einbau des Zählers; was davor lag, steht hier als „nie geholt", auch wenn es täglich benutzt wurde. Nach ein paar Wochen stimmt die Zahl.

Nie geholt

{daten.nieGeholt.n}{' '} ({bytes(daten.nieGeholt.bytes)})

Am häufigsten geholt

{daten.beliebteste.length === 0 ? (

noch nichts gezählt

) : (
    {daten.beliebteste.slice(0, 5).map((m) => (
  • {m.path} {m.abrufe}×
  • ))}
)}

Die Zahlen, die eine Aufbewahrungsregel braucht. „Alles älter als 90 Tage löschen" ist eine Behauptung, solange niemand weiß, wie viel das wäre — hier steht es. Gelöscht wird hier nichts.

{daten.stufen.map((st) => ( ))}
älter als {st.tage} Tage {st.files} Dateien {bytes(st.bytes)}
{daten.aelteste[0] && (

Das älteste ist{' '} {daten.aelteste[0].path} vom{' '} {zeit(daten.aelteste[0].created_at)}.

)}
) }