File
Blob: src/client/lib/affordance/editor.ts
| 1 | import { |
| 2 | getPageAiEntitlements, |
| 3 | getPageEditEntitlements, |
| 4 | type EntitlementSurface, |
| 5 | type PageAccessLevel, |
| 6 | type ResolvedWorkspaceRole, |
| 7 | } from "@/shared/entitlements"; |
| 8 | |
| 9 | export 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 | |
| 19 | export 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 | } |