File
Blob: src/client/lib/affordance/site-publish.ts
| 1 | import type { SitePublishingEntitlements } from "@/shared/entitlements"; |
| 2 | import { |
| 3 | ENABLED_ACTION, |
| 4 | HIDDEN_ACTION, |
| 5 | disabledAction, |
| 6 | OFFLINE_ACTION_REASON, |
| 7 | type UiActionState, |
| 8 | } from "@/client/lib/affordance/action-state"; |
| 9 | import type { PageKind } from "@/shared/types"; |
| 10 | |
| 11 | export 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 | |
| 20 | export interface DeriveSitePublishAffordanceInput { |
| 21 | entitlements: SitePublishingEntitlements; |
| 22 | online: boolean; |
| 23 | pageKind: PageKind; |
| 24 | } |
| 25 | |
| 26 | export 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 | } |