import React, { FC, memo, useCallback, } from '../../../lib/teact/teact'; import { withGlobal } from '../../../lib/teact/teactn'; import { GlobalActions } from '../../../global/types'; import { ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus, } from '../../../api/types'; import { IS_MOBILE_SCREEN } from '../../../util/environment'; import { getChatTitle, getPrivateChatUserId, getMessageMediaHash, getMessageSummaryText, getMessageMediaThumbDataUri, getMessageVideo, getMessageRoundVideo, } from '../../../modules/helpers'; import { selectChat, selectUser } from '../../../modules/selectors'; import renderText from '../../common/helpers/renderText'; import { pick } from '../../../util/iteratees'; import useMedia from '../../../hooks/useMedia'; import { formatPastTimeShort } from '../../../util/dateFormat'; import useLang, { LangFn } from '../../../hooks/useLang'; import useSelectWithEnter from '../../../hooks/useSelectWithEnter'; import Avatar from '../../common/Avatar'; import VerifiedIcon from '../../common/VerifiedIcon'; import ListItem from '../../ui/ListItem'; import Link from '../../ui/Link'; import './ChatMessage.scss'; type OwnProps = { searchQuery?: string; message: ApiMessage; chatId: number; }; type StateProps = { chat?: ApiChat; privateChatUser?: ApiUser; lastMessageOutgoingStatus?: ApiMessageOutgoingStatus; lastSyncTime?: number; }; type DispatchProps = Pick; const ChatMessage: FC = ({ message, searchQuery, chatId, chat, privateChatUser, focusMessage, lastSyncTime, }) => { const mediaThumbnail = getMessageMediaThumbDataUri(message); const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'micro')); const isRoundVideo = Boolean(getMessageRoundVideo(message)); const handleClick = useCallback(() => { focusMessage({ chatId, messageId: message.id }); }, [chatId, focusMessage, message.id]); const lang = useLang(); const buttonRef = useSelectWithEnter(handleClick); if (!chat) { return undefined; } return (

{renderText(getChatTitle(lang, chat, privateChatUser))}

{chat.isVerified && }
{formatPastTimeShort(lang, message.date * 1000)}
{renderMessageSummary(lang, message, mediaBlobUrl || mediaThumbnail, searchQuery, isRoundVideo)}
); }; function renderMessageSummary( lang: LangFn, message: ApiMessage, blobUrl?: string, searchQuery?: string, isRoundVideo?: boolean, ) { if (!blobUrl) { return renderText(getMessageSummaryText(lang, message)); } return ( {getMessageVideo(message) && } {renderText(getMessageSummaryText(lang, message, true), ['emoji', 'highlight'], { highlight: searchQuery })} ); } export default memo(withGlobal( (global, { chatId }): StateProps => { const chat = selectChat(global, chatId); if (!chat) { return {}; } const privateChatUserId = getPrivateChatUserId(chat); return { chat, ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }), lastSyncTime: global.lastSyncTime, }; }, (setGlobal, actions): DispatchProps => pick(actions, [ 'focusMessage', ]), )(ChatMessage));