import { computed, Default, NAME, pattern, Stream, UI, type VNode, Writable, } from "commonfabric"; import { TrustedPublishedBodyUiContract, TrustedPublishedTitleUiContract, TrustedPublishSurface, TrustedReviewedBodyUiContract, TrustedReviewedTitleUiContract, TrustedReviewSurface, TrustedSavedDraftBodyUiContract, TrustedSavedDraftTitleUiContract, TrustedSaveDraftSurface, } from "../cfc/trusted-surfaces/mod.ts"; interface StagedPublishInput { draftTitle: Writable>; draftBody: Writable>; savedTitle: Writable>; savedBody: Writable>; reviewedTitle: Writable>; reviewedBody: Writable>; publishedTitle: Writable>; publishedBody: Writable>; } export interface StagedPublishOutput { [NAME]: string; [UI]: VNode; draftTitle: string; draftBody: string; savedTitle: TrustedSavedDraftTitleUiContract; savedBody: TrustedSavedDraftBodyUiContract; reviewedTitle: TrustedReviewedTitleUiContract; reviewedBody: TrustedReviewedBodyUiContract; publishedTitle: TrustedPublishedTitleUiContract; publishedBody: TrustedPublishedBodyUiContract; stage: "drafting" | "saved" | "reviewed" | "published"; saveDraft: Stream; reviewSaved: Stream; publishReviewed: Stream; } // Named (not an anonymous `export default pattern(...)`) so importing files' // CTS transformer recognizes the factory; see cfc-authorized-save/main.tsx. const StagedPublish = pattern( ({ draftTitle, draftBody, savedTitle, savedBody, reviewedTitle, reviewedBody, publishedTitle, publishedBody, }) => { const trustedSaveDraft = TrustedSaveDraftSurface({ draftTitle, draftBody, savedTitle, savedBody, }); const trustedReview = TrustedReviewSurface({ savedTitle, savedBody, reviewedTitle, reviewedBody, }); const trustedPublish = TrustedPublishSurface({ reviewedTitle, reviewedBody, publishedTitle, publishedBody, }); const stage = computed(() => publishedTitle.get() ? "published" : reviewedTitle.get() ? "reviewed" : savedTitle.get() ? "saved" : "drafting" ); return { [NAME]: computed(() => `CFC Staged Publish (${stage})`), [UI]: ( Stage {stage} {trustedSaveDraft} Saved snapshot
{savedTitle}
{savedBody}
{trustedReview} Reviewed snapshot
{reviewedTitle}
{reviewedBody}
{trustedPublish} Published snapshot
{publishedTitle}
{publishedBody}
), draftTitle, draftBody, savedTitle, savedBody, reviewedTitle, reviewedBody, publishedTitle, publishedBody, stage, saveDraft: trustedSaveDraft.saveDraft, reviewSaved: trustedReview.reviewSaved, publishReviewed: trustedPublish.publishReviewed, }; }, ); export default StagedPublish;