import classNames from 'classnames'; import { isEmpty } from 'lodash'; import React from 'react'; import { useSelector } from 'react-redux'; import { useConvoIdFromContext } from '../../../contexts/ConvoIdContext'; import { useHasUnread, useIsPrivate, useIsTyping, useLastMessage, } from '../../../hooks/useParamSelector'; import { LastMessageStatusType } from '../../../state/ducks/conversations'; import { isSearching } from '../../../state/selectors/search'; import { getIsMessageRequestOverlayShown } from '../../../state/selectors/section'; import { assertUnreachable } from '../../../types/sqlSharedTypes'; import { TypingAnimation } from '../../conversation/TypingAnimation'; import { MessageBody } from '../../conversation/message/message-content/MessageBody'; import { SessionIcon } from '../../icon'; import { InteractionItem } from './InteractionItem'; export const MessageItem = () => { const conversationId = useConvoIdFromContext(); const lastMessage = useLastMessage(conversationId); const isGroup = !useIsPrivate(conversationId); const hasUnread = useHasUnread(conversationId); const isConvoTyping = useIsTyping(conversationId); const isMessageRequest = useSelector(getIsMessageRequestOverlayShown); const isSearchingMode = useSelector(isSearching); if (lastMessage?.interactionType && lastMessage?.interactionStatus) { return ; } if (!lastMessage && !isConvoTyping) { return null; } const text = lastMessage?.text || ''; if (isEmpty(text)) { return null; } return (
{isConvoTyping ? ( ) : ( )}
{!isSearchingMode && lastMessage && lastMessage.status && !isMessageRequest ? ( ) : null}
); }; function IconMessageStatus({ status }: { status: LastMessageStatusType }) { const nonErrorIconColor = 'var(--text-secondary-color'; switch (status) { case 'error': return ; case 'read': return ( ); case 'sending': return ( ); case 'sent': return ; case undefined: return null; default: assertUnreachable(status, 'missing case error'); } }