import { computed, Default, NAME, pattern, Stream, UI, type VNode, Writable, } from "commonfabric"; import { TrustedSaveSurface, TrustedSaveTitleUiContract, } from "../cfc/trusted-surfaces/mod.ts"; interface AuthorizedSaveInput { draftTitle: Writable>; savedTitle: Writable>; } export interface AuthorizedSaveOutput { [NAME]: string; [UI]: VNode; draftTitle: string; savedTitle: TrustedSaveTitleUiContract; save: Stream; } // Named (not an anonymous `export default pattern(...)`) so importing files' // CTS transformer recognizes the factory: anonymous default exports make // `instance.save` in a consumer lift into a derived cell instead of a direct // `.key("save")` stream reference, which breaks sending events to it. const AuthorizedSave = pattern( ({ draftTitle, savedTitle }) => { const trustedSave = TrustedSaveSurface({ draftTitle, savedTitle }); return { [NAME]: computed(() => `Authorized Save (${savedTitle.get() || "empty"})` ), [UI]: ( {trustedSave} Host shortcut This plain host button reuses the same stream but is not the reviewed trusted surface. Save title Protected saved title
{savedTitle}
), draftTitle, savedTitle, save: trustedSave.save, }; }, ); export default AuthorizedSave;