Skip to content
File

Blob: src/client/lib/affordance/editor.ts

typescript42 lines
1import {
2 getPageAiEntitlements,
3 getPageEditEntitlements,
4 type EntitlementSurface,
5 type PageAccessLevel,
6 type ResolvedWorkspaceRole,
7} from "@/shared/entitlements";
8 
9export interface EditorAffordance {
10 documentEditable: boolean;
11 canInsertPageMentions: boolean;
12 canInsertImages: boolean;
13 canUseAiRewrite: boolean;
14 canUseAiGenerate: boolean;
15 canSummarizePage: boolean;
16 canAskPage: boolean;
17}
18 
19export function deriveEditorAffordance(input: {
20 surface: EntitlementSurface;
21 pageAccess: PageAccessLevel;
22 workspaceId: string | undefined;
23 online: boolean;
24 workspaceRole: ResolvedWorkspaceRole;
25}): EditorAffordance {
26 const { surface, pageAccess, workspaceId, online, workspaceRole } = input;
27 const pageEdit = getPageEditEntitlements(surface, pageAccess);
28 // AI entitlements are role-aware: `getPageAiEntitlements` denies guests and
29 // non-members on canonical surface, and denies everyone on shared surface.
30 const ai = getPageAiEntitlements(surface, pageAccess, workspaceRole);
31 
32 return {
33 documentEditable: pageEdit.editDocument,
34 canInsertPageMentions: pageEdit.insertPageMention && !!workspaceId,
35 canInsertImages: pageEdit.uploadImage && !!workspaceId && online,
36 canUseAiRewrite: ai.useAiRewrite && online,
37 canUseAiGenerate: ai.useAiGenerate && online,
38 canSummarizePage: ai.summarizePage && online,
39 canAskPage: ai.askPage && online,
40 };
41}