feat: upgrade toolchain and soften sync recovery after network blips
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.
This commit is contained in:
99
docs/handoff/features/state-management/HANDOFF.md
Normal file
99
docs/handoff/features/state-management/HANDOFF.md
Normal file
@@ -0,0 +1,99 @@
|
||||
# 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
|
||||
|
||||
1. Type draft, reload — draft should restore.
|
||||
2. Collapse category, reload — stays collapsed.
|
||||
3. Reorder rooms; verify order persists.
|
||||
4. 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
|
||||
- `ClientBindAtoms` must mount early or UI shows stale unreads
|
||||
|
||||
## Future work
|
||||
|
||||
- Selective localStorage clear on logout (keep non-sensitive prefs)
|
||||
- Document atom dependency graph
|
||||
|
||||
## Related docs
|
||||
|
||||
- [matrix-client HANDOFF](../matrix-client/HANDOFF.md)
|
||||
- [home-and-sidebar HANDOFF](../home-and-sidebar/HANDOFF.md)
|
||||
|
||||
## Add your extra things here
|
||||
|
||||
- `useSetting` hook in `state/hooks/settings.ts` — primary settings accessor
|
||||
- `joiningProgress.ts` — room join UX state
|
||||
Reference in New Issue
Block a user