# Routing & navigation — handoff ## Summary React Router drives all app navigation: auth routes, client shell, home/direct/space/inbox/explore paths, room views, lobby/forum feeds, and modal overlays (settings, search, create). Supports hash router mode via client config. ## User-facing behavior - URL reflects current room, space, inbox tab, explore server - Mobile vs desktop route layouts (`MobileFriendly` wrappers) - Deep links and `matrix.to` style joins via join route - After-login redirect preserves intended destination - View transitions on supported platforms ## Architecture ``` App.tsx → createRouter(clientConfig, screenSize) → Auth routes | ClientLayout + SidebarNav + Outlet paths.ts — route constants pathUtils.ts — path builders (getHomeRoomPath, getSpaceDefaultPath, ...) Router.tsx — route tree + loaders/guards ``` ## Key files | Path | Role | |------|------| | `cinny/src/app/pages/Router.tsx` | Full route tree | | `cinny/src/app/pages/paths.ts` | Path constants | | `cinny/src/app/pages/pathUtils.ts` | Path builder utilities | | `cinny/src/app/pages/App.tsx` | RouterProvider setup | | `cinny/src/app/pages/client/ClientLayout.tsx` | Authenticated layout shell | | `cinny/src/app/pages/client/SidebarNav.tsx` | Left sidebar tabs | | `cinny/src/app/pages/MobileFriendly.tsx` | Mobile nav adapters | | `cinny/src/app/hooks/useRoomNavigate.ts` | Imperative room navigation | | `cinny/src/app/hooks/useNavToActivePathMapper.ts` | Restore last path | | `cinny/src/app/pages/afterLoginRedirectPath.ts` | Login redirect | | `cinny/src/app/components/AnimatedOutlet.tsx` | Route transitions | ## Data model | Key | Purpose | |-----|---------| | `navToActivePath` atom | Per-context last URL | | URL path params | roomId, spaceId, eventId | ## Dependencies - `react-router-dom` v6 - `clientConfig.hashRouter` for Electron/file protocol ## Integration points - **forum**: `ForumAwareSpaceLayout`, `ForumFeedPage` routes - **lobby-forums**: `_LOBBY_PATH`, `Lobby` component - **join-before-navigate**: `_JOIN_PATH` route - **local-api**: `setPaarrotNavigate` uses same path utils - **settings/room-settings**: overlay renderers on client routes ## Testing ### Manual 1. Navigate home → room → back; URL updates correctly. 2. Open space; forum vs lobby path per room type. 3. Hash router mode (if enabled in config). 4. Mobile breakpoints: sidebar vs full-page nav. 5. Refresh on deep room URL — lands in same room. ### Automated - None ## Known issues & gotchas - `getSpaceDefaultPath` branches forum vs lobby — must stay in sync with forum handoff - Hash router needed for some Electron `file://` deployments - Many path helpers — prefer using `pathUtils` over string concat ## Future work - Route-level code splitting audit - Unified join/link handler ## Related docs - [forum HANDOFF](../forum/HANDOFF.md) - [lobby-forums HANDOFF](../lobby-forums/HANDOFF.md) - [join-before-navigate HANDOFF](../join-before-navigate/HANDOFF.md) - [home-and-sidebar HANDOFF](../home-and-sidebar/HANDOFF.md) ## Add your extra things here - Key paths: `HOME_PATH`, `DIRECT_PATH`, `SPACE_PATH`, `INBOX_PATH`, `EXPLORE_PATH`, `_FEED_PATH`, `_LOBBY_PATH` - `getAppPathFromHref` for parsing external links