import { memo, useEffect, useMemo } from '../../lib/teact/teact'; import { getActions, getGlobal, withGlobal } from '../../global'; import type { ApiChat, ApiTopic, ApiTypingStatus, ApiUser, } from '../../api/types'; import type { IconName } from '../../types/icons'; import { MediaViewerOrigin, type StoryViewerOrigin, type ThreadId } from '../../types'; import { getChatTypeLangKey, getGroupStatus, getMainUsername, isChatSuperGroup, } from '../../global/helpers'; import { selectChat, selectChatMessages, selectChatOnlineCount, selectIsChatRestricted, selectMonoforumChannel, selectTopic, selectUser, } from '../../global/selectors'; import { selectThreadMessagesCount } from '../../global/selectors/threads'; import buildClassName from '../../util/buildClassName'; import { REM } from './helpers/mediaDimensions'; import renderText from './helpers/renderText'; import useLang from '../../hooks/useLang'; import useLastCallback from '../../hooks/useLastCallback'; import Transition from '../ui/Transition'; import Avatar from './Avatar'; import DotAnimation from './DotAnimation'; import FullNameTitle from './FullNameTitle'; import Icon from './icons/Icon'; import TopicIcon from './TopicIcon'; import TypingStatus from './TypingStatus'; const TOPIC_ICON_SIZE = 2.5 * REM; type OwnProps = { chatId: string; threadId?: ThreadId; className?: string; statusIcon?: IconName; typingStatus?: ApiTypingStatus; avatarSize?: 'tiny' | 'small' | 'medium' | 'large' | 'jumbo'; status?: string; withDots?: boolean; withMediaViewer?: boolean; withUsername?: boolean; withFullInfo?: boolean; withUpdatingStatus?: boolean; withChatType?: boolean; noEmojiStatus?: boolean; emojiStatusSize?: number; noRtl?: boolean; noAvatar?: boolean; noStatusOrTyping?: boolean; withStory?: boolean; storyViewerOrigin?: StoryViewerOrigin; isSavedDialog?: boolean; withMonoforumStatus?: boolean; onClick?: VoidFunction; onEmojiStatusClick?: VoidFunction; }; type StateProps = { chat?: ApiChat; topic?: ApiTopic; onlineCount?: number; areMessagesLoaded: boolean; messagesCount?: number; self?: ApiUser; monoforumChannel?: ApiChat; }; const GroupChatInfo = ({ typingStatus, className, statusIcon, avatarSize = 'medium', noAvatar, status, withDots, withMediaViewer, withUsername, withFullInfo, withUpdatingStatus, withChatType, noRtl, chat: realChat, onlineCount, areMessagesLoaded, topic, messagesCount, noStatusOrTyping, withStory, storyViewerOrigin, noEmojiStatus, emojiStatusSize, isSavedDialog, self, withMonoforumStatus, monoforumChannel, onClick, onEmojiStatusClick, }: OwnProps & StateProps) => { const { loadFullChat, openMediaViewer, loadMoreProfilePhotos, } = getActions(); const chat = !withMonoforumStatus && monoforumChannel ? monoforumChannel : realChat; const lang = useLang(); const isSuperGroup = chat && isChatSuperGroup(chat); const isTopic = Boolean(chat?.isForum && topic); const { id: chatId, isMin } = chat || {}; const isRestricted = selectIsChatRestricted(getGlobal(), chatId!); useEffect(() => { if (chatId && !isMin) { if (withFullInfo) loadFullChat({ chatId }); if (withMediaViewer) loadMoreProfilePhotos({ peerId: chatId, isPreload: true }); } }, [chatId, isMin, withFullInfo, isSuperGroup, withMediaViewer]); const handleAvatarViewerOpen = useLastCallback( (e: React.MouseEvent, hasMedia: boolean) => { if (chat && hasMedia) { e.stopPropagation(); openMediaViewer({ isAvatarView: true, chatId: chat.id, mediaIndex: 0, origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar, }); } }, ); const mainUsername = useMemo(() => chat && withUsername && getMainUsername(chat), [chat, withUsername]); if (!chat) { return undefined; } function renderStatusOrTyping() { if (withUpdatingStatus && !areMessagesLoaded && !isRestricted) { return ( ); } if (withMonoforumStatus) { return ( {lang('MonoforumStatus')} ); } if (realChat?.isMonoforum) { return undefined; } if (status) { return withDots ? ( ) : ( {statusIcon && } {renderText(status)} ); } if (!chat) { return undefined; } if (typingStatus) { return ; } if (isTopic) { return ( {messagesCount !== undefined ? lang('Messages', { count: messagesCount }, { pluralValue: messagesCount }) : lang('ChatInfoNoMessages')} ); } if (withChatType) { return ( {lang(getChatTypeLangKey(chat))} ); } const groupStatusElement = {getGroupStatus(lang, chat)}; const onlineStatus = onlineCount ? lang('OnlineCount', { count: onlineCount }, { pluralValue: onlineCount }) : undefined; const onlineStatusElement = onlineStatus ? {onlineStatus} : undefined; return ( {mainUsername && {mainUsername}} {!onlineStatusElement ? groupStatusElement : lang('GroupStatusWithOnline', { status: groupStatusElement, onlineCount: onlineStatusElement, }, { withNodes: true })} ); } return (
{!noAvatar && !isTopic && ( <> {isSavedDialog && self && ( )} )} {isTopic && ( )}
{topic ?

{renderText(topic.title)}

: ( )} {!noStatusOrTyping && renderStatusOrTyping()}
); }; export default memo(withGlobal( (global, { chatId, threadId, isSavedDialog }): Complete => { const chat = selectChat(global, chatId); const onlineCount = chat ? selectChatOnlineCount(global, chat) : undefined; const areMessagesLoaded = Boolean( isSavedDialog ? selectChatMessages(global, global.currentUserId!) : selectChatMessages(global, chatId), ); const topic = threadId ? selectTopic(global, chatId, threadId) : undefined; const messagesCount = topic && selectThreadMessagesCount(global, chatId, threadId!); const self = selectUser(global, global.currentUserId!); const monoforumChannel = selectMonoforumChannel(global, chatId); return { chat, onlineCount, topic, areMessagesLoaded, messagesCount, self, monoforumChannel, }; }, )(GroupChatInfo));