import { type IThreadMessage } from '@rocket.chat/core-typings'; import { Skeleton, ThreadMessage, ThreadMessageRow, ThreadMessageLeftContainer, ThreadMessageIconThread, ThreadMessageContainer, ThreadMessageOrigin, ThreadMessageBody, ThreadMessageUnfollow, CheckBox, MessageStatusIndicatorItem, } from '@rocket.chat/fuselage'; import { MessageTypes } from '@rocket.chat/message-types'; import { MessageAvatar } from '@rocket.chat/ui-avatar'; import type { ComponentProps, ReactElement } from 'react'; import { memo } from 'react'; import { useTranslation } from 'react-i18next'; import { useIsSelecting, useToggleSelect, useIsSelectedMessage, useCountSelected, } from '../../../views/room/MessageList/contexts/SelectedMessagesContext'; import { useMessageBody } from '../../../views/room/MessageList/hooks/useMessageBody'; import { useParentMessage } from '../../../views/room/MessageList/hooks/useParentMessage'; import { isParsedMessage } from '../../../views/room/MessageList/lib/isParsedMessage'; import { useGoToThread } from '../../../views/room/hooks/useGoToThread'; import Emoji from '../../Emoji'; import { useShowTranslated } from '../list/MessageListContext'; import ThreadMessagePreviewBody from './threadPreview/ThreadMessagePreviewBody'; type ThreadMessagePreviewProps = { message: IThreadMessage; showUserAvatar: boolean; sequential: boolean; } & ComponentProps; const ThreadMessagePreview = ({ message, showUserAvatar, sequential, ...props }: ThreadMessagePreviewProps): ReactElement => { const parentMessage = useParentMessage(message.tmid); const translated = useShowTranslated(message); const { t } = useTranslation(); const isSelecting = useIsSelecting(); const toggleSelected = useToggleSelect(message._id); const isSelected = useIsSelectedMessage(message._id); useCountSelected(); const messageType = parentMessage.isSuccess ? MessageTypes.getType(parentMessage.data) : null; const messageBody = useMessageBody(parentMessage.data); const previewMessage = isParsedMessage(messageBody) ? { md: messageBody } : { msg: messageBody }; const goToThread = useGoToThread(); const handleThreadClick = () => { if (!isSelecting) { if (!sequential) { return parentMessage.isSuccess && goToThread({ rid: message.rid, tmid: message.tmid, msg: parentMessage.data?._id }); } return goToThread({ rid: message.rid, tmid: message.tmid, msg: message._id }); } return toggleSelected(); }; return ( e.code === 'Enter' && handleThreadClick()} isSelected={isSelected} data-qa-selected={isSelected} {...props} > {!sequential && ( {parentMessage.isSuccess && !messageType && ( <> {(parentMessage.data as { ignored?: boolean })?.ignored ? ( t('Message_Ignored') ) : ( )} {translated && ( <> {' '} )} )} {messageType?.text(t, message)} {parentMessage.isLoading && } )} {!isSelecting && showUserAvatar && ( : undefined} username={message.u.username} size='x18' /> )} {isSelecting && } {(message as { ignored?: boolean }).ignored ? ( t('Message_Ignored') ) : ( <> {translated && ( <> {' '} )} )} ); }; export default memo(ThreadMessagePreview);