Bump Vite 8, matrix-js-sdk, and related deps; fix immer/vanilla-extract imports for new majors. Replace blocking sync error dialog with background recovery on wake/offline, and disable Vite auto-open in dev. Add feature handoff documentation index.
3.3 KiB
3.3 KiB
State management — handoff
Summary
Client UI state uses Jotai atoms: room lists, unread counts, settings, modals, drafts, navigation memory, and sidebar collapse. Many atoms sync to localStorage via atomWithLocalStorage.
User-facing behavior
- Room list order, collapsed categories, sidebar folders persist across sessions
- Message drafts and upload queues per room persist locally
- Settings (theme, emoji style, zoom) persist locally
- Unread badges drive favicon and sidebar indicators
Architecture
JotaiProvider (App.tsx)
→ atoms in state/
→ hooks in state/hooks/ wrap atoms for components
ClientBindAtoms.tsx binds Matrix events → atom updates
Key files
| Path | Role |
|---|---|
cinny/src/app/state/settings.ts |
User settings atom |
cinny/src/app/state/sessions.ts |
Auth sessions |
cinny/src/app/state/room-list/roomList.ts |
allRoomsAtom, ordering |
cinny/src/app/state/room/roomToUnread.ts |
Unread counts |
cinny/src/app/state/room/roomInputDrafts.ts |
Composer drafts + uploads |
cinny/src/app/state/room/roomToParents.ts |
Space parent mapping |
cinny/src/app/state/mDirectList.ts |
Direct message index |
cinny/src/app/state/navToActivePath.ts |
Last active path per context |
cinny/src/app/state/closedNavCategories.ts |
Collapsed nav sections |
cinny/src/app/state/closedLobbyCategories.ts |
Collapsed lobby categories |
cinny/src/app/state/createRoomModal.ts |
Create room modal state |
cinny/src/app/state/createSpaceModal.ts |
Create space modal state |
cinny/src/app/state/searchModal.ts |
Global search modal |
cinny/src/app/state/utils/atomWithLocalStorage.ts |
Persistence helper |
cinny/src/app/pages/client/ClientBindAtoms.ts |
Matrix → atom bindings |
Data model
Most state is local only (not Matrix). Exceptions: settings that also write account data (notification prefs via separate hooks).
| Atom area | Persists? |
|---|---|
| settings | localStorage |
| room list order | localStorage |
| drafts | localStorage |
| unread | memory (derived from sync) |
| modals | memory |
Dependencies
jotai@tanstack/react-query(separate from Jotai, used in App.tsx)
Integration points
- matrix-client: sync updates room/unread atoms via ClientBindAtoms
- home-and-sidebar: room list atoms
- room-timeline: draft atoms
- routing-and-navigation: navToActivePath
Testing
Manual
- Type draft, reload — draft should restore.
- Collapse category, reload — stays collapsed.
- Reorder rooms; verify order persists.
- Logout — verify which atoms clear vs persist.
Automated
- None
Known issues & gotchas
- Logout clears all localStorage in session-logout handler — wipes settings too
- Atom families (
roomIdToMsgDraftAtomFamily) — memory growth in many rooms ClientBindAtomsmust mount early or UI shows stale unreads
Future work
- Selective localStorage clear on logout (keep non-sensitive prefs)
- Document atom dependency graph
Related docs
Add your extra things here
useSettinghook instate/hooks/settings.ts— primary settings accessorjoiningProgress.ts— room join UX state