Files
cinny/docs/handoff/features/lobby-forums/HANDOFF.md
Max Litruv Boonzaayer e058165830 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.
2026-07-09 01:55:09 +10:00

96 lines
3.5 KiB
Markdown

# Lobby & forums — handoff
## Summary
Spaces in Paarrot can show a **Lobby** view: a card-based hierarchy of child rooms with drag-and-drop ordering, hero header, and category collapse. **Forum** spaces (`m.forum` room type or `im.paarrot.room.kind` = `forum_space`) use a post-feed style navigation instead of the standard lobby when opened.
## User-facing behavior
- Opening a space lands on lobby (or forum feed for forum spaces)
- Lobby: hero, categories, room cards, DnD reorder (with permissions)
- Forum spaces: routed to post feed per `getSpaceDefaultPath` / `shouldShowForumLobby`
- Category open/closed state persisted per space
## Architecture
```
Space route → Lobby.tsx (SpaceCardLobby)
→ LobbyHeader, LobbyHero, SpaceHierarchy
→ DnD reorder → m.space.child order updates
→ closedLobbyCategories atom (per-space category collapse)
→ shouldShowForumLobby(space) gates forum vs lobby behavior
```
## Key files
| Path | Role |
|------|------|
| `cinny/src/app/features/lobby/Lobby.tsx` | Main lobby view |
| `cinny/src/app/features/lobby/LobbyHeader.tsx` | Space header |
| `cinny/src/app/features/lobby/LobbyHero.tsx` | Hero banner area |
| `cinny/src/app/features/lobby/SpaceHierarchy.tsx` | Room tree/cards |
| `cinny/src/app/features/lobby/DnD.tsx` | Drag and drop |
| `cinny/src/app/features/lobby/RoomItem.tsx` | Room card |
| `cinny/src/app/state/closedLobbyCategories.ts` | Collapsed categories |
| `cinny/src/app/state/hooks/closedLobbyCategories.ts` | Jotai hook |
| `cinny/src/app/pages/pathUtils.ts` | `getSpaceLobbyPath`, forum routing |
| `cinny/src/app/utils/room.ts` | `shouldShowForumLobby`, `getStateEvent` |
| `cinny/src/types/matrix/room.ts` | `RoomType.Forum`, `PaarrotRoomKind` |
## Data model
| Event / field | Purpose |
|---------------|---------|
| `m.space.child` | Child room membership + `order` |
| `im.paarrot.sub_rooms` | Paarrot nested children (see sub-rooms handoff) |
| `im.paarrot.room.kind` | e.g. `forum_space` for forum behavior |
| `m.room.create` `type` | `m.forum` for forum rooms |
| Local: `closedLobbyCategories` | UI collapse state (not Matrix) |
## Dependencies
- Matrix space hierarchy events
- DnD library (see Lobby imports)
- Room power levels for reorder permission (`useCanDropLobbyItem`)
## Integration points
- **Sub-rooms**: `SpaceHierarchy` merges `im.paarrot.sub_rooms` children
- **Navigation**: `getSpaceDefaultPath` chooses lobby vs forum path
- **local-api**: `isSpaceLikeRoom` treats forum kind as space-like for channel API
## Testing
### Manual
1. Open a normal space → lobby with child rooms.
2. Collapse/expand category; reload — state should persist.
3. Drag reorder child (as admin); verify `m.space.child` order.
4. Open forum-type space; verify feed navigation not lobby cards.
5. Test with sub-rooms under a child space card.
### Automated
- None
## Known issues & gotchas
- Forum detection spans **two** signals: `m.forum` create type and `im.paarrot.room.kind`
- DnD permission logic is custom per `useCanDropLobbyItem` — read before changing
- `makeLobbyCategoryId(spaceId, childId)` keys collapse state
## Future work
- Unified hierarchy model (space.child + sub_rooms)
- Lobby theming from space avatar metadata
## Related docs
- [forum HANDOFF](../forum/HANDOFF.md) — post feed UI for forum spaces
- [sub-rooms HANDOFF](../sub-rooms/HANDOFF.md)
## Add your extra things here
- Route constant: `SPACE_LOBBY_PATH` in path utils
- `SpaceCardLobby` is the default export wrapper in `Lobby.tsx`