Skip to content
File

Blob: src/client/lib/affordance/site-publish.ts

typescript40 lines
1import type { SitePublishingEntitlements } from "@/shared/entitlements";
2import {
3 ENABLED_ACTION,
4 HIDDEN_ACTION,
5 disabledAction,
6 OFFLINE_ACTION_REASON,
7 type UiActionState,
8} from "@/client/lib/affordance/action-state";
9import type { PageKind } from "@/shared/types";
10 
11export interface SitePublishAffordance {
12 // Whole tab is hidden when the workspace surface should not expose
13 // publishing controls at all (canvas pages, no membership).
14 showPublishTab: boolean;
15 // Owner/admin-only management controls share one policy: visible for
16 // managers, disabled while offline, hidden for everyone else.
17 manageSite: UiActionState;
18}
19 
20export interface DeriveSitePublishAffordanceInput {
21 entitlements: SitePublishingEntitlements;
22 online: boolean;
23 pageKind: PageKind;
24}
25 
26export function deriveSitePublishAffordance(input: DeriveSitePublishAffordanceInput): SitePublishAffordance {
27 const { entitlements, online, pageKind } = input;
28 const canvas = pageKind === "canvas";
29 const manageSite = !entitlements.manageSite
30 ? HIDDEN_ACTION
31 : online
32 ? ENABLED_ACTION
33 : disabledAction(OFFLINE_ACTION_REASON);
34 
35 return {
36 showPublishTab: entitlements.viewPagePublishStatus && !canvas,
37 manageSite,
38 };
39}