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.
96 lines
3.5 KiB
Markdown
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`
|