import type { IMessage, ISubscription } from '@rocket.chat/core-typings'; import { useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import type { ReactNode } from 'react'; import { memo, useMemo, useSyncExternalStore } from 'react'; import ComposerSkeleton from './ComposerSkeleton'; import { LegacyRoomManager } from '../../../lib/LegacyRoomManager'; import { useChat } from '../contexts/ChatContext'; import { useRoom } from '../contexts/RoomContext'; import MessageBox from './messageBox/MessageBox'; export type ComposerMessageProps = { tmid?: IMessage['_id']; threadExists?: boolean; children?: ReactNode; subscription?: ISubscription; tshow?: boolean; previewUrls?: string[]; onResize?: () => void; onEscape?: () => void; onSend?: () => void; onNavigateToNextMessage?: () => void; onNavigateToPreviousMessage?: () => void; onClickSelectAll?: () => void; }; const ComposerMessage = ({ tmid, onSend, ...props }: ComposerMessageProps) => { const chat = useChat(); const room = useRoom(); const dispatchToastMessage = useToastMessageDispatch(); const composerProps = useMemo( () => ({ onJoin: async (): Promise => { try { await chat?.data?.joinRoom(); } catch (error) { dispatchToastMessage({ type: 'error', message: error }); throw error; } }, onSend: async ({ value: text, tshow, previewUrls, isSlashCommandAllowed, }: { value: string; tshow?: boolean; previewUrls?: string[]; isSlashCommandAllowed?: boolean; }): Promise => { try { await chat?.action.stop('typing'); const newMessageSent = await chat?.flows.sendMessage({ text, tshow, previewUrls, isSlashCommandAllowed, tmid, }); if (newMessageSent) onSend?.(); } catch (error) { dispatchToastMessage({ type: 'error', message: error }); } }, onTyping: async (): Promise => { if (chat?.composer?.text?.trim() === '') { await chat?.action.stop('typing'); return; } await chat?.action.start('typing'); }, onNavigateToPreviousMessage: () => chat?.messageEditing.toPreviousMessage(), onNavigateToNextMessage: () => chat?.messageEditing.toNextMessage(), }), [chat?.data, chat?.flows, chat?.action, chat?.composer?.text, chat?.messageEditing, dispatchToastMessage, tmid, onSend], ); const { subscribe, getSnapshotValue } = useMemo(() => { return LegacyRoomManager.listenRoomPropsByRid(room._id, 'streamActive'); }, [room._id]); const publicationReady = useSyncExternalStore(subscribe, getSnapshotValue); if (!publicationReady) { return ; } return ; }; export default memo(ComposerMessage);