import type { FC } from '../../../lib/teact/teact'; import React, { memo, useCallback } from '../../../lib/teact/teact'; import { getActions, withGlobal } from '../../../global'; import type { ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus, } from '../../../api/types'; import type { LangFn } from '../../../hooks/useLang'; import { getPrivateChatUserId, getMessageMediaHash, getMessageMediaThumbDataUri, getMessageVideo, getMessageRoundVideo, getMessageSticker, getMessageIsSpoiler, } from '../../../global/helpers'; import { selectChat, selectUser } from '../../../global/selectors'; import buildClassName from '../../../util/buildClassName'; import { formatPastTimeShort } from '../../../util/dateFormat'; import { renderMessageSummary } from '../../common/helpers/renderMessageText'; import useMedia from '../../../hooks/useMedia'; import useLang from '../../../hooks/useLang'; import useSelectWithEnter from '../../../hooks/useSelectWithEnter'; import useAppLayout from '../../../hooks/useAppLayout'; import Avatar from '../../common/Avatar'; import ListItem from '../../ui/ListItem'; import Link from '../../ui/Link'; import FullNameTitle from '../../common/FullNameTitle'; import './ChatMessage.scss'; type OwnProps = { searchQuery?: string; message: ApiMessage; chatId: string; }; type StateProps = { chat?: ApiChat; privateChatUser?: ApiUser; lastMessageOutgoingStatus?: ApiMessageOutgoingStatus; lastSyncTime?: number; }; const ChatMessage: FC = ({ message, searchQuery, chatId, chat, privateChatUser, lastSyncTime, }) => { 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 = useCallback(() => { focusMessage({ chatId, messageId: message.id, shouldReplaceHistory: true }); }, [chatId, focusMessage, message.id]); const lang = useLang(); const buttonRef = useSelectWithEnter(handleClick); if (!chat) { return undefined; } 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, lastSyncTime: global.lastSyncTime, ...(privateChatUserId && { privateChatUser }), }; }, )(ChatMessage));