import type { FC } from '../../../lib/teact/teact'; import React, { memo } from '../../../lib/teact/teact'; import { getActions, withGlobal } from '../../../global'; import type { ApiChat, ApiMessage, ApiMessageOutgoingStatus, ApiUser, } from '../../../api/types'; import type { LangFn } from '../../../hooks/useLang'; import { getMessageIsSpoiler, getMessageMediaHash, getMessageMediaThumbDataUri, getMessageRoundVideo, getMessageSticker, getMessageVideo, getPrivateChatUserId, } from '../../../global/helpers'; import { selectChat, selectUser } from '../../../global/selectors'; import buildClassName from '../../../util/buildClassName'; import { formatPastTimeShort } from '../../../util/date/dateFormat'; import { renderMessageSummary } from '../../common/helpers/renderMessageText'; import useAppLayout from '../../../hooks/useAppLayout'; import useLang from '../../../hooks/useLang'; import useLastCallback from '../../../hooks/useLastCallback'; import useMedia from '../../../hooks/useMedia'; import useSelectWithEnter from '../../../hooks/useSelectWithEnter'; import Avatar from '../../common/Avatar'; import FullNameTitle from '../../common/FullNameTitle'; import Link from '../../ui/Link'; import ListItem from '../../ui/ListItem'; import './ChatMessage.scss'; type OwnProps = { searchQuery?: string; message: ApiMessage; chatId: string; }; type StateProps = { chat?: ApiChat; privateChatUser?: ApiUser; lastMessageOutgoingStatus?: ApiMessageOutgoingStatus; }; const ChatMessage: FC = ({ message, searchQuery, chatId, chat, privateChatUser, }) => { const { focusMessage } = getActions(); const { isMobile } = useAppLayout(); const mediaThumbnail = !getMessageSticker(message) ? getMessageMediaThumbDataUri(message) : undefined; const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'micro')); const isRoundVideo = Boolean(getMessageRoundVideo(message)); const handleClick = useLastCallback(() => { focusMessage({ chatId, messageId: message.id, shouldReplaceHistory: true }); }); const lang = useLang(); const buttonRef = useSelectWithEnter(handleClick); if (!chat) { return undefined; } const peer = privateChatUser || chat; return (
{formatPastTimeShort(lang, message.date * 1000)}
{renderSummary(lang, message, mediaBlobUrl || mediaThumbnail, searchQuery, isRoundVideo)}
); }; function renderSummary( lang: LangFn, message: ApiMessage, blobUrl?: string, searchQuery?: string, isRoundVideo?: boolean, ) { if (!blobUrl) { return renderMessageSummary(lang, message, undefined, searchQuery); } const isSpoiler = getMessageIsSpoiler(message); return ( {getMessageVideo(message) && } {renderMessageSummary(lang, message, true, searchQuery)} ); } export default memo(withGlobal( (global, { chatId }): StateProps => { const chat = selectChat(global, chatId); if (!chat) { return {}; } const privateChatUserId = getPrivateChatUserId(chat); const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined; return { chat, ...(privateChatUserId && { privateChatUser }), }; }, )(ChatMessage));