import { computed, handler, NAME, pattern, Stream, type TrustedActionWrite, UI, type VNode, Writable, } from "commonfabric"; export const TRUSTED_AUDIENCE_PUBLISH_SURFACE = "TrustedAudiencePublishSurface"; const PREPARE_AUDIENCE_PUBLISH_ACTION = "TrustedPrepareAudiencePublish"; const PUBLISH_AUDIENCE_POST_ACTION = "TrustedPublishAudiencePost"; export const prepareTrustedAudiencePublish = handler< void, { targetAudience: Writable; publishSubject: Writable; publishBody: Writable; preparedAudiencePublish: Writable; } >((_, { targetAudience, publishSubject, publishBody, preparedAudiencePublish, }) => { const audience = targetAudience.get().trim() || "public"; const subject = publishSubject.get().trim() || "Untitled"; const body = publishBody.get().trim(); preparedAudiencePublish.set( body ? `Prepared publish for ${audience}: ${subject} — ${body}` : `Prepared publish for ${audience}: ${subject}`, ); }); export const commitTrustedAudiencePublish = handler< void, { preparedAudiencePublish: Writable; publishedAudiencePost: Writable; } >((_, { preparedAudiencePublish, publishedAudiencePost }) => { publishedAudiencePost.set(preparedAudiencePublish.get().trim()); }); export interface TrustedAudiencePublishSurfaceInput { targetAudience: Writable; publishSubject: Writable; publishBody: Writable; preparedAudiencePublish: Writable; publishedAudiencePost: Writable; } export interface TrustedAudiencePublishSurfaceOutput { [NAME]: string; [UI]: VNode; preparedAudiencePublish: TrustedActionWrite< string, typeof prepareTrustedAudiencePublish, typeof PREPARE_AUDIENCE_PUBLISH_ACTION, typeof TRUSTED_AUDIENCE_PUBLISH_SURFACE >; publishedAudiencePost: TrustedActionWrite< string, typeof commitTrustedAudiencePublish, typeof PUBLISH_AUDIENCE_POST_ACTION, typeof TRUSTED_AUDIENCE_PUBLISH_SURFACE >; prepareAudiencePublish: Stream; publishAudiencePost: Stream; } export const TrustedAudiencePublishSurface = pattern< TrustedAudiencePublishSurfaceInput, TrustedAudiencePublishSurfaceOutput >( ({ targetAudience, publishSubject, publishBody, preparedAudiencePublish, publishedAudiencePost, }) => { const prepareAudiencePublish = prepareTrustedAudiencePublish({ targetAudience, publishSubject, publishBody, preparedAudiencePublish, }); const publishAudiencePost = commitTrustedAudiencePublish({ preparedAudiencePublish, publishedAudiencePost, }); return { [NAME]: computed(() => "Trusted Audience Publish Surface"), [UI]: ( Trusted audience publish Stage a publish and then commit it to a named audience. Audience Subject Body Prepare publish Publish to audience Prepared audience release
{preparedAudiencePublish}
Committed audience release
{publishedAudiencePost}
), preparedAudiencePublish, publishedAudiencePost, prepareAudiencePublish, publishAudiencePost, }; }, );