Skip to content
File

Blob: src/client/components/workspace/use-canonical-page-context.ts

typescript58 lines
1import { useMemo } from "react";
2import { useParams } from "@tanstack/react-router";
3import { hasWorkspaceIdentity } from "@/client/lib/workspace-route-model";
4import {
5 usePageById,
6 useWorkspaceAccessMode,
7 useWorkspaceHead,
8 useWorkspaceMembers,
9 useWorkspacePages,
10 useWorkspaceRole,
11 type WorkspaceAccessMode,
12} from "@/client/stores/workspace-replica";
13import { useWorkspaceView } from "./use-workspace-view";
14import type { Page, Workspace, WorkspaceMember, WorkspaceRole } from "@/shared/types";
15 
16export interface CanonicalPageContextValue {
17 workspaceId: string | null;
18 currentPageMeta: Page | null;
19 workspace: Workspace | null;
20 pages: Page[];
21 members: WorkspaceMember[];
22 accessMode: WorkspaceAccessMode | null;
23 workspaceRole: WorkspaceRole | null;
24}
25 
26/**
27 * Derive canonical page inputs from the current workspace route and replica
28 * store. Layout and page-level consumers can call this directly without a
29 * layout-owned context provider.
30 */
31export function useCanonicalPageContext(): CanonicalPageContextValue {
32 const { route } = useWorkspaceView();
33 const params = useParams({ strict: false }) as { pageId?: string };
34 
35 const workspaceId = hasWorkspaceIdentity(route) ? route.workspaceId : null;
36 const workspace = useWorkspaceHead(workspaceId);
37 const replicaAccessMode = useWorkspaceAccessMode(workspaceId);
38 const workspaceRole = useWorkspaceRole(workspaceId);
39 const pages = useWorkspacePages(workspaceId);
40 const members = useWorkspaceMembers(workspaceId);
41 const currentPageMeta = usePageById(params.pageId ?? null);
42 
43 const accessMode = route.phase === "ready" ? route.accessMode : replicaAccessMode;
44 
45 return useMemo(
46 () => ({
47 workspaceId,
48 currentPageMeta,
49 workspace,
50 pages,
51 members,
52 accessMode,
53 workspaceRole,
54 }),
55 [accessMode, workspaceRole, currentPageMeta, pages, members, workspaceId, workspace],
56 );
57}