import React, { useEffect, memo, useMemo } from '../../lib/teact/teact'; import { getActions, withGlobal } from '../../global'; import type { FC } from '../../lib/teact/teact'; import type { ApiUser, ApiTypingStatus, ApiUserStatus, ApiChatMember, } from '../../api/types'; import { MediaViewerOrigin } from '../../types'; import { selectChatMessages, selectUser, selectUserStatus, } from '../../global/selectors'; import { getMainUsername, getUserStatus, isUserOnline } from '../../global/helpers'; import buildClassName from '../../util/buildClassName'; import renderText from './helpers/renderText'; import useLastCallback from '../../hooks/useLastCallback'; import useLang from '../../hooks/useLang'; import Avatar from './Avatar'; import TypingStatus from './TypingStatus'; import DotAnimation from './DotAnimation'; import FullNameTitle from './FullNameTitle'; type OwnProps = { userId: string; typingStatus?: ApiTypingStatus; avatarSize?: 'tiny' | 'small' | 'medium' | 'large' | 'jumbo'; forceShowSelf?: boolean; status?: string; statusIcon?: string; withDots?: boolean; withMediaViewer?: boolean; withUsername?: boolean; withFullInfo?: boolean; withUpdatingStatus?: boolean; emojiStatusSize?: number; noStatusOrTyping?: boolean; noRtl?: boolean; adminMember?: ApiChatMember; }; type StateProps = { user?: ApiUser; userStatus?: ApiUserStatus; isSavedMessages?: boolean; areMessagesLoaded: boolean; }; const PrivateChatInfo: FC = ({ typingStatus, avatarSize = 'medium', status, statusIcon, withDots, withMediaViewer, withUsername, withFullInfo, withUpdatingStatus, emojiStatusSize, noStatusOrTyping, noRtl, user, userStatus, isSavedMessages, areMessagesLoaded, adminMember, }) => { const { loadFullUser, openMediaViewer, loadProfilePhotos, } = getActions(); const lang = useLang(); const { id: userId } = user || {}; useEffect(() => { if (userId) { if (withFullInfo) loadFullUser({ userId }); if (withMediaViewer) loadProfilePhotos({ profileId: userId }); } }, [userId, withFullInfo, withMediaViewer]); const handleAvatarViewerOpen = useLastCallback( (e: React.MouseEvent, hasMedia: boolean) => { if (user && hasMedia) { e.stopPropagation(); openMediaViewer({ avatarOwnerId: user.id, mediaId: 0, origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar, }); } }, ); const mainUsername = useMemo(() => user && withUsername && getMainUsername(user), [user, withUsername]); if (!user) { return undefined; } function renderStatusOrTyping() { if (status) { return withDots ? ( ) : ( {statusIcon && } {renderText(status)} ); } if (withUpdatingStatus && !areMessagesLoaded) { return ( ); } if (!user) { return undefined; } if (typingStatus) { return ; } return ( {mainUsername && {mainUsername}} {getUserStatus(lang, user, userStatus)} ); } const customTitle = adminMember ? adminMember.customTitle || lang(adminMember.isOwner ? 'GroupInfo.LabelOwner' : 'GroupInfo.LabelAdmin') : undefined; function renderNameTitle() { if (customTitle) { return (
{customTitle && {customTitle}}
); } return ( ); } return (
{renderNameTitle()} {(status || (!isSavedMessages && !noStatusOrTyping)) && renderStatusOrTyping()}
); }; export default memo(withGlobal( (global, { userId, forceShowSelf }): StateProps => { const user = selectUser(global, userId); const userStatus = selectUserStatus(global, userId); const isSavedMessages = !forceShowSelf && user && user.isSelf; const areMessagesLoaded = Boolean(selectChatMessages(global, userId)); return { user, userStatus, isSavedMessages, areMessagesLoaded, }; }, )(PrivateChatInfo));