import { computed, handler, NAME, pattern, Stream, type TrustedActionWrite, UI, type VNode, Writable, } from "commonfabric"; export const TRUSTED_SAFE_LINK_SURFACE = "TrustedSafeLinkSurface"; const PREPARE_SAFE_LINK_ACTION = "TrustedPrepareSafeLink"; const RELEASE_SAFE_LINK_ACTION = "TrustedReleaseSafeLink"; export const prepareTrustedSafeLink = handler< void, { sourceUrl: Writable; preparedSafeLink: Writable; } >((_, { sourceUrl, preparedSafeLink }) => { const [base] = sourceUrl.get().split("?"); preparedSafeLink.set(base ? `${base}?view=summary` : ""); }); export const commitTrustedSafeLink = handler< void, { preparedSafeLink: Writable; releasedSafeLink: Writable; } >((_, { preparedSafeLink, releasedSafeLink }) => { const prepared = preparedSafeLink.get().trim(); releasedSafeLink.set(prepared ? `Released safe link ${prepared}` : ""); }); export interface TrustedSafeLinkSurfaceInput { sourceUrl: Writable; preparedSafeLink: Writable; releasedSafeLink: Writable; } export interface TrustedSafeLinkSurfaceOutput { [NAME]: string; [UI]: VNode; sourceUrl: string; preparedSafeLink: TrustedActionWrite< string, typeof prepareTrustedSafeLink, typeof PREPARE_SAFE_LINK_ACTION, typeof TRUSTED_SAFE_LINK_SURFACE >; releasedSafeLink: TrustedActionWrite< string, typeof commitTrustedSafeLink, typeof RELEASE_SAFE_LINK_ACTION, typeof TRUSTED_SAFE_LINK_SURFACE >; prepareSafeLink: Stream; releaseSafeLink: Stream; } export const TrustedSafeLinkSurface = pattern< TrustedSafeLinkSurfaceInput, TrustedSafeLinkSurfaceOutput >(({ sourceUrl, preparedSafeLink, releasedSafeLink }) => { const prepareSafeLink = prepareTrustedSafeLink({ sourceUrl, preparedSafeLink, }); const releaseSafeLink = commitTrustedSafeLink({ preparedSafeLink, releasedSafeLink, }); return { [NAME]: computed(() => "Trusted Safe Link Surface"), [UI]: ( Trusted safe-link release This reviewed surface strips risky query material and releases only the safe summary link. Source URL Prepare safe link Release safe link Prepared safe derivative Committed release ), sourceUrl, preparedSafeLink, releasedSafeLink, prepareSafeLink, releaseSafeLink, }; });