import { computed, handler, NAME, pattern, Stream, type TrustedActionWrite, UI, type VNode, Writable, } from "commonfabric"; export const TRUSTED_CONVERSATION_SEND_SURFACE = "TrustedConversationSendSurface"; const CONVERSATION_SEND_ACTION = "TrustedConversationSend"; export const commitTrustedConversationSend = handler< void, { conversationTitle: Writable; audienceInput: Writable; messageDraft: Writable; sentMessage: Writable; } >((_, { conversationTitle, audienceInput, messageDraft, sentMessage }) => { const title = conversationTitle.get().trim() || "conversation"; const audience = audienceInput.get().trim() || "thread"; const message = messageDraft.get().trim(); sentMessage.set( message ? `Sent in ${title} to ${audience}: ${message}` : "", ); }); export interface TrustedConversationSendSurfaceInput { conversationTitle: Writable; audienceInput: Writable; messageDraft: Writable; sentMessage: Writable; } export interface TrustedConversationSendSurfaceOutput { [NAME]: string; [UI]: VNode; sentMessage: TrustedActionWrite< string, typeof commitTrustedConversationSend, typeof CONVERSATION_SEND_ACTION, typeof TRUSTED_CONVERSATION_SEND_SURFACE >; sendMessage: Stream; } export const TrustedConversationSendSurface = pattern< TrustedConversationSendSurfaceInput, TrustedConversationSendSurfaceOutput >(({ conversationTitle, audienceInput, messageDraft, sentMessage }) => { const sendMessage = commitTrustedConversationSend({ conversationTitle, audienceInput, messageDraft, sentMessage, }); return { [NAME]: computed(() => "Trusted Conversation Send Surface"), [UI]: ( Trusted conversation send Send a message from within the current conversation context. Conversation title Audience within conversation Message Send in conversation Sent message
{sentMessage}
), sentMessage, sendMessage, }; });