|
|
|
import classNames from 'classnames';
|
|
|
|
import { isEmpty } from 'lodash';
|
|
|
|
import React from 'react';
|
|
|
|
import { useSelector } from 'react-redux';
|
|
|
|
import {
|
|
|
|
useConversationPropsById,
|
|
|
|
useHasUnread,
|
|
|
|
useIsPrivate,
|
|
|
|
useIsTyping,
|
|
|
|
} from '../../../hooks/useParamSelector';
|
|
|
|
import { isSearching } from '../../../state/selectors/search';
|
|
|
|
import { getIsMessageRequestOverlayShown } from '../../../state/selectors/section';
|
|
|
|
import { TypingAnimation } from '../../conversation/TypingAnimation';
|
|
|
|
import { MessageBody } from '../../conversation/message/message-content/MessageBody';
|
|
|
|
import { OutgoingMessageStatus } from '../../conversation/message/message-content/OutgoingMessageStatus';
|
|
|
|
import { useConvoIdFromContext } from './ConvoIdContext';
|
|
|
|
|
|
|
|
function useLastMessageFromConvo(convoId: string) {
|
|
|
|
const convoProps = useConversationPropsById(convoId);
|
|
|
|
if (!convoProps) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
return convoProps.lastMessage;
|
|
|
|
}
|
|
|
|
|
|
|
|
export const MessageItem = () => {
|
|
|
|
const conversationId = useConvoIdFromContext();
|
|
|
|
const lastMessage = useLastMessageFromConvo(conversationId);
|
|
|
|
const isGroup = !useIsPrivate(conversationId);
|
|
|
|
|
|
|
|
const hasUnread = useHasUnread(conversationId);
|
|
|
|
const isConvoTyping = useIsTyping(conversationId);
|
|
|
|
const isMessageRequest = useSelector(getIsMessageRequestOverlayShown);
|
|
|
|
|
|
|
|
const isSearchingMode = useSelector(isSearching);
|
|
|
|
|
|
|
|
if (!lastMessage && !isConvoTyping) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
const text = lastMessage?.text || '';
|
|
|
|
|
|
|
|
if (isEmpty(text)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div className="module-conversation-list-item__message">
|
|
|
|
<div
|
|
|
|
className={classNames(
|
|
|
|
'module-conversation-list-item__message__text',
|
|
|
|
hasUnread ? 'module-conversation-list-item__message__text--has-unread' : null
|
|
|
|
)}
|
|
|
|
>
|
|
|
|
{isConvoTyping ? (
|
|
|
|
<TypingAnimation />
|
|
|
|
) : (
|
|
|
|
<MessageBody text={text} disableJumbomoji={true} disableLinks={true} isGroup={isGroup} />
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
{!isSearchingMode && lastMessage && lastMessage.status && !isMessageRequest ? (
|
|
|
|
<OutgoingMessageStatus status={lastMessage.status} />
|
|
|
|
) : null}
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
};
|