fix(#300): Web-Layout stabil bei Orientierungswechsel #301
No reviewers
Labels
No labels
app/archiv
app/einkaufslisten
app/imap-client
app/wissensbasis
arch-answered
arch-question
area/api
area/auth
area/infra
area/mobile
area/shared
area/ui
area/web
portfolio-status
prio/high
prio/low
prio/medium
roadmap/public
size/l
size/m
size/s
size/xl
size/xs
status/blocked
status/needs-info
type/bug
type/chore
type/docs
type/feature
type/idea
type/refactor
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
admin-mrrm/mrrmlabapp!301
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/300-categorize-orientation-change"
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?
Closes #300
Problem
Im Web brach die laufende Mail-Kategorisierung ab, sobald das Gerät gedreht wurde. Ursache:
Layoutwählte überuseIsWideScreen()zwischenWideLayoutundNarrowLayout— beim Überschreiten der 768px-Breakpoint-Linie wechselte der Parent-Komponententyp, was React zwang, den gesamten Outlet-Subtree (inkl.MailFoldersRoute) zu unmount-/remounten. Der Categorize-State (useCategorizeFolder) lebt in dem Component und ging dabei verloren.Fix
Layoutrendert jetzt einen stabilen Baum:$gtSm).{children}wird genau einmal gerendert und überlebt Viewport-Wechsel.Der
useIsWideScreen-Hook im Web ist damit ungenutzt und wurde entfernt (Mobile-Variante unterapps/mobilebleibt).Tests
apps/web/src/routes/layout.spec.tsx— assert:mountCountder Children bleibt1über mehrere Breakpoint-Crossings (NARROW → WIDE → NARROW).mountCount === 2. Nachher (GREEN):mountCount === 1.pnpm test(44/44 grün),pnpm typecheck✓,pnpm build✓.Wiki
Kein Update — interner Layout-Fix ohne Feature-Auswirkung. Designentscheidung ist im Kommentar in
layout.tsxdokumentiert.Zusatz im PR:
1. ESLint-Setup (Web)
Web-Workspace hatte keine
eslint.config.js(ESLint v9 Flat-Config).pnpm lintbrach mit Konfig-Fehler ab. Jetzt analog zu api/shared-types: nutzt@mrrmlab/config/eslint/react.Damit der Linter wieder läuft, fielen 5 vorbestehende Verstöße auf, die mitgefixt sind:
mail/hooks.ts:155— inlineimport()Type-Annotation → top-levelimport type(consistent-type-imports)mail-review.tsx:269,mail-tags-manager.tsx:66— rohe"in JSX-Text →“/”(react/no-unescaped-entities)2. Audit ähnlicher Remount-Patterns (Web + Mobile)
Ganzer Monorepo durchsucht nach dem Anti-Pattern „bedingt unterschiedliche Parent-Komponenten um
childrenrendern".apps/web/src/routes/layout.tsx— der Original-Fall, mit diesem PR gefixt.apps/mobile/app/(drawer)/_layout.tsx— sieht auf den ersten Blick verdächtig aus (drawerType: isWide ? permanent : front), ist aber nicht vom selben Bug betroffen: Quellcode vonreact-native-drawer-layoutzeigt, dassdrawerTypenur Styles und ein Geschwister-Overlay umschaltet — die{children}(Scenes) hängen immer am selben Tree-Slot. Kein Parent-Typ-Wechsel ⇒ kein Remount.isX ? <A>{children}</A> : <B>{children}</B>-Muster im Repo.Alles grün:
pnpm lint,pnpm typecheck,pnpm test(44/44),pnpm build.