docs(spaces): document discovery-first Join a Space modal
This commit is contained in:
+25
-3
@@ -9,11 +9,13 @@ Source files:
|
|||||||
- `packages/web/src/stores/exploreStore.ts` — Explore page state, multi-instance discovery aggregation
|
- `packages/web/src/stores/exploreStore.ts` — Explore page state, multi-instance discovery aggregation
|
||||||
- `packages/web/src/components/modals/CreateSpace.tsx` — Space creation modal (icon crop, color, visibility)
|
- `packages/web/src/components/modals/CreateSpace.tsx` — Space creation modal (icon crop, color, visibility)
|
||||||
- `packages/web/src/components/modals/JoinSpace.tsx` — Join-by-code modal with federation connect phases
|
- `packages/web/src/components/modals/JoinSpace.tsx` — Join-by-code modal with federation connect phases
|
||||||
|
- `packages/web/src/components/modals/ExploreSpacePreviewCard.tsx` — Compact discoverable-space card rendered inside the Join Space modal
|
||||||
- `packages/web/src/components/modals/InviteModal.tsx` — Invite link generation and copy
|
- `packages/web/src/components/modals/InviteModal.tsx` — Invite link generation and copy
|
||||||
- `packages/web/src/components/modals/TransferOwnershipModal.tsx` — Ownership transfer member picker
|
- `packages/web/src/components/modals/TransferOwnershipModal.tsx` — Ownership transfer member picker
|
||||||
- `packages/web/src/components/modals/SpaceSettings.tsx` — Space settings: overview, discovery, members, roles, bans
|
- `packages/web/src/components/modals/SpaceSettings.tsx` — Space settings: overview, discovery, members, roles, bans
|
||||||
- `packages/web/src/components/JoinPage.tsx` — Public invite landing page with federation redirect
|
- `packages/web/src/components/JoinPage.tsx` — Public invite landing page with federation redirect
|
||||||
- `packages/web/src/hooks/useDragManager.ts` — Channel/category/voice-user drag-and-drop
|
- `packages/web/src/hooks/useDragManager.ts` — Channel/category/voice-user drag-and-drop
|
||||||
|
- `packages/web/src/hooks/useSpaceJoin.ts` — Shared join/request state machine over exploreStore (used by ExplorePage SpaceCard and the JoinSpace modal preview card)
|
||||||
- `packages/web/src/utils/inviteParser.ts` — Invite code/URL/qualified-code parser
|
- `packages/web/src/utils/inviteParser.ts` — Invite code/URL/qualified-code parser
|
||||||
|
|
||||||
Cross-references: [database.md](database.md) (table schemas), [permissions.md](permissions.md) (resolution algorithm, override tiers), [websocket.md](websocket.md) (event types), [federation.md](federation.md) (peer relay), [voice.md](voice.md) (voice channel join)
|
Cross-references: [database.md](database.md) (table schemas), [permissions.md](permissions.md) (resolution algorithm, override tiers), [websocket.md](websocket.md) (event types), [federation.md](federation.md) (peer relay), [voice.md](voice.md) (voice channel join)
|
||||||
@@ -196,12 +198,32 @@ Public route at `/join/:inviteCode`. Handles five phases:
|
|||||||
|
|
||||||
### Join Space Modal (`JoinSpaceModal`)
|
### Join Space Modal (`JoinSpaceModal`)
|
||||||
|
|
||||||
Modal with three phases matching JoinPage but in-app:
|
Opened from the space sidebar "Join a Space" action. The `input` phase is
|
||||||
- `input` — text field for invite code or URL
|
**discovery-first**: on open it triggers `exploreStore.fetchSpaces()` +
|
||||||
|
`fetchMyRequests()` (same multi-instance discovery data as the Explore page)
|
||||||
|
and renders up to 6 unjoined public/request spaces as compact
|
||||||
|
`ExploreSpacePreviewCard`s. A "Browse all in Explore" action routes to the full
|
||||||
|
Explore page — `navigate('/explore')` on desktop, `pushMobileScreen('explore')`
|
||||||
|
on mobile (`uiStore.isMobile`). Joining a public preview card closes the modal
|
||||||
|
and navigates into the space.
|
||||||
|
|
||||||
|
States: loading (skeletons), empty / all-joined (notice), discovery disabled by
|
||||||
|
admin (`discoveryEnabled=false` → notice, invite path becomes primary), fetch
|
||||||
|
error (quiet degrade — invite path unaffected).
|
||||||
|
|
||||||
|
Below a divider, the secondary **"Have an invite code?"** section keeps the
|
||||||
|
invite-code/link flow: `parseInviteInput` → `joinByCode(code, origin?)`, with the
|
||||||
|
unchanged federation phases:
|
||||||
- `connect` — password prompt for federation
|
- `connect` — password prompt for federation
|
||||||
- `fallback` — different-password login for remote instance
|
- `fallback` — different-password login for remote instance
|
||||||
|
|
||||||
Uses `parseInviteInput` to parse, then `joinByCode(code, origin?)` from spaceStore.
|
The join/request behavior of both the compact preview card and the Explore
|
||||||
|
page's `SpaceCard` is provided by the shared `useSpaceJoin` hook, so the two
|
||||||
|
surfaces cannot drift.
|
||||||
|
|
||||||
|
The direct sidebar "Explore Spaces" button remains the 1-click path to the full
|
||||||
|
Explore page; the modal's discovery preview is an additional, in-context entry
|
||||||
|
point, not a replacement.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user