fix(app-shell): Haengende Lazy-Routen ("Dashboard loads forever") — instabile Zustands-Selektoren #381
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Bug
Alle Core-Lazy-Routen im AppShell-Baum (/dashboard, /approvals, /delegations, /profile, /system-dashboard, /outbox) blieben beim Direkt-Aufruf/Reload ewig im Route-Suspense-Spinner haengen ("Seite wird geladen"), obwohl die Chunks nachweislich in ~16ms luden und KEINE JS-Fehler auftraten. Plugin-Routen und der StartLayout-Baum funktionierten.
Root Cause (Bisekt-Beweis)
Sidebar.tsxselektierteuseWorkspaceStore(s => s.moduleMenuOrder())unduseWorkspace.tsselektiertes => s.visibleModuleKeys(). Beide Store-Methoden erzeugen bei JEDEM Aufruf ein NEUES Objekt (new Map(...)bzw.new Set(...)). Fuer React-18-useSyncExternalStore (Zustand 4.5.7) ist das ein instabiler getSnapshot: jeder Snapshot gilt als "geaendert" -> synchroner Re-Render-Loop -> die ausstehenden Suspense-Commits der Route-lazy-Pages kamen nie zur Landung.Bisekt-Kette: minimale AppShell (nur main+Outlet) -> alles rendert; +Sidebar allein -> Hang kehrt zurueck; Import-Bisect: Chunks resolved (LAZY-DEBUG-Log), React committed nie.
Fix (Commit
3fd0c69)Stabile
context-Referenz selektieren und Map/Set peruseMemoableiten (Sidebar.tsx + useWorkspace.ts).Verifikation
Klaraerte damit auch den alten Incident "Dashboard loads forever" (als Cache-Problem vermutet, Thread #3) — der Spinner-Hang war der Selector-Bug.