diff --git a/src/App.tsx b/src/App.tsx index 3af44a4..e58ed68 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,5 @@ import { Routes, Route, Navigate } from 'react-router' +import { Component, type ReactNode } from 'react' import { StoreProvider, useStore } from './store/store' import AppLayout from './components/AppLayout' import Login from './pages/Login' @@ -9,6 +10,35 @@ import Documents from './pages/Documents' import Messages from './pages/Messages' import BenutzerVerwaltung from './pages/BenutzerVerwaltung' +/** Fängt Render-Fehler ab – statt schwarzem Bildschirm: Hinweis + Reload. */ +class FehlerGrenze extends Component<{ children: ReactNode }, { fehler: boolean }> { + state = { fehler: false } + static getDerivedStateFromError() { + return { fehler: true } + } + render() { + if (this.state.fehler) { + return ( +
+
+

Da ist etwas schiefgelaufen

+

+ Die Seite konnte nicht korrekt dargestellt werden. Ein Neuladen hilft in der Regel weiter. +

+ +
+
+ ) + } + return this.props.children + } +} + function Ladebildschirm() { return (
@@ -36,8 +66,9 @@ function LoginGate() { export default function App() { return ( - - + + + } /> } /> - + + ) } diff --git a/src/store/store.tsx b/src/store/store.tsx index eefab5e..4fb74bc 100644 --- a/src/store/store.tsx +++ b/src/store/store.tsx @@ -112,9 +112,9 @@ export function StoreProvider({ children }: { children: ReactNode }) { ;(async () => { try { const { benutzer } = await apiGet<{ benutzer: Benutzer }>('/api/auth/me') + await ladeAlles() // erst Daten, dann me – sonst rendern Seiten gegen leere Daten if (!aktiv) return setMe(benutzer) - await ladeAlles() } catch { /* nicht angemeldet – Login-Seite zeigen */ } finally { @@ -148,8 +148,8 @@ export function StoreProvider({ children }: { children: ReactNode }) { benutzername, passwortHash: await sha256(passwort), }) + await ladeAlles() // erst Daten, dann me (s. useEffect) setMe(benutzer) - await ladeAlles() return null } catch (e) { return fehlerNachricht(e) @@ -173,8 +173,8 @@ export function StoreProvider({ children }: { children: ReactNode }) { email, passwortHash: await sha256(passwort), }) + await ladeAlles() // erst Daten, dann me (s. useEffect) setMe(benutzer) - await ladeAlles() return null } catch (e) { return fehlerNachricht(e)