import { useEffect } from 'react' import { Code2, Gauge, HardDrive, History, Images, KeyRound, PieChart, Settings, Trash2, } from 'lucide-react' import { useStore } from './store' import { Anmelden } from './pages/Anmelden' import { Start } from './pages/Start' import { Galerie } from './pages/Galerie' import { Speicher } from './pages/Speicher' import { Tokens } from './pages/Tokens' import { Konto } from './pages/Konto' import { Einstellungen } from './pages/Einstellungen' import { Verlauf } from './pages/Verlauf' import { Api } from './pages/Api' import { Papierkorb } from './pages/Papierkorb' import { Freigabe } from './pages/Freigabe' import { Meldungen } from './components/Meldungen' import { gehZu, usePfad } from './router' import { Kontomenue } from './components/Kontomenue' import { dienstName, useMarke } from './marke' /** Die Breite des Inhalts — an EINER Stelle. * * Sie stand vorher zweimal da (Kopfzeile und Inhalt), und zwei Seiten setzten * zusätzlich ihre eigene: dadurch waren Konto und Einstellungen schmaler als * der Rest, und die Kopfzeile lief über beiden anders. Formulare werden * stattdessen INNERHALB ihrer Karte begrenzt. */ const BREITE = 'mx-auto w-full max-w-7xl px-4' const seiten = [ { pfad: '/', name: 'Start', kind: Gauge, Inhalt: Start }, { pfad: '/galerie', name: 'Galerie', kind: Images, Inhalt: Galerie }, { pfad: '/verlauf', name: 'Verlauf', kind: History, Inhalt: Verlauf }, { pfad: '/speicher', name: 'Speicher', kind: PieChart, Inhalt: Speicher }, { pfad: '/papierkorb', name: 'Papierkorb', kind: Trash2, Inhalt: Papierkorb }, { pfad: '/tokens', name: 'Token', kind: KeyRound, Inhalt: Tokens }, { pfad: '/api', name: 'API', kind: Code2, Inhalt: Api }, { pfad: '/einstellungen', name: 'Einstellungen', kind: Settings, Inhalt: Einstellungen }, ] as const /** Seiten OHNE Reiter. Sie sind ueber die Adresse und ueber das Kontomenue * erreichbar -- ein Lesezeichen auf /konto soll nicht ins Leere fuehren, nur * weil der Reiter verschwunden ist. */ const versteckt = [{ pfad: '/konto', Inhalt: Konto }] as const export function App() { // Einzeln ausgewählt und nicht als ganzer Laden: `useStore()` ohne // Auswahlfunktion abonniert ALLES, und dann zeichnet jede Meldung das // ganze Dashboard neu — bei 60 Kacheln mit Bildern ist das spürbar. const user = useStore((s) => s.user) const checking = useStore((s) => s.checking) const checkSession = useStore((s) => s.checkSession) const pfad = usePfad() const marke = useMarke() useEffect(() => { void checkSession() }, [checkSession]) // EINE FREIGABE GEHT VOR ALLEM ANDEREN -- vor dem Prüfen der Sitzung, vor // dem Anmeldeformular, vor der Kopfzeile. Wer einen Link bekommen hat, ist // kein Benutzer dieses Dashboards; ihm ein Anmeldeformular zu zeigen wäre // die falsche Antwort auf "sieh dir das an". // // Und deshalb steht das hier VOR dem `checking`-Zweig: sonst blitzt für // einen Moment das Rädchen der Sitzungsprüfung auf, die es gar nicht // braucht. if (pfad.startsWith('/s/')) { return } // Solange nicht feststeht, ob eine Sitzung besteht, wird NICHTS gezeigt. // Sonst blitzt bei jedem Neuladen kurz das Anmeldeformular auf, obwohl man // angemeldet ist — und das sieht aus wie ein Fehler. if (checking) { return (
) } if (!user) { return ( <> ) } const ohneReiter = versteckt.find((s) => s.pfad === pfad) const aktiv = seiten.find((s) => s.pfad === pfad) ?? seiten[0] const Inhalt = ohneReiter ? ohneReiter.Inhalt : aktiv.Inhalt return (
) }