import { Routes, Route, Navigate } from 'react-router' import { Component, Suspense, lazy, type ReactNode } from 'react' import { StoreProvider, useStore } from './store/store' import AppLayout from './components/AppLayout' import LadeSkeleton from './components/LadeSkeleton' import Login from './pages/Login' // Seiten werden beim ersten Aufruf nachgeladen (Code-Splitting) – // Verwaltungsmodule landen nicht im Bundle der Mieter. const Dashboard = lazy(() => import('./pages/Dashboard')) const Payments = lazy(() => import('./pages/Payments')) const Tickets = lazy(() => import('./pages/Tickets')) const Documents = lazy(() => import('./pages/Documents')) const Messages = lazy(() => import('./pages/Messages')) const Zaehler = lazy(() => import('./pages/Zaehler')) const Kosten = lazy(() => import('./pages/Kosten')) const Bestand = lazy(() => import('./pages/Bestand')) const Mietvertraege = lazy(() => import('./pages/Mietvertraege')) const MieterVerwaltung = lazy(() => import('./pages/MieterVerwaltung')) const Assistent = lazy(() => import('./pages/Assistent')) const BenutzerVerwaltung = lazy(() => import('./pages/BenutzerVerwaltung')) const Profil = lazy(() => import('./pages/Profil')) const Anleitung = lazy(() => import('./pages/Anleitung')) /** 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 } function RequireAuth({ children }: { children: React.ReactElement }) { const { me, bereit } = useStore() if (!bereit) return if (!me) return return children } function LoginGate() { const { me, bereit } = useStore() if (!bereit) return if (me) return return } export default function App() { return ( }> } /> } > } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> ) }