import React, { useEffect, useCallback, memo, useMemo, } from '../../lib/teact/teact'; import { getActions, withGlobal } from '../../global'; import type { FC } from '../../lib/teact/teact'; import type { ApiUser, ApiTypingStatus, ApiUserStatus, ApiChatMember, ApiPhoto, } from '../../api/types'; import type { GlobalState } from '../../global/types'; import type { AnimationLevel } from '../../types'; import { MediaViewerOrigin } from '../../types'; import { selectChatMessages, selectUser, selectUserPhotoFromFullInfo, selectUserStatus, } from '../../global/selectors'; import { getMainUsername, getUserStatus, isUserOnline } from '../../global/helpers'; import buildClassName from '../../util/buildClassName'; import renderText from './helpers/renderText'; 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; withDots?: boolean; withMediaViewer?: boolean; withUsername?: boolean; withFullInfo?: boolean; withUpdatingStatus?: boolean; withVideoAvatar?: boolean; emojiStatusSize?: number; noStatusOrTyping?: boolean; noRtl?: boolean; adminMember?: ApiChatMember; }; type StateProps = { user?: ApiUser; userStatus?: ApiUserStatus; userProfilePhoto?: ApiPhoto; isSavedMessages?: boolean; animationLevel: AnimationLevel; areMessagesLoaded: boolean; } & Pick; const PrivateChatInfo: FC = ({ typingStatus, avatarSize = 'medium', status, withDots, withMediaViewer, withUsername, withFullInfo, withUpdatingStatus, withVideoAvatar, emojiStatusSize, noStatusOrTyping, noRtl, user, userStatus, userProfilePhoto, isSavedMessages, areMessagesLoaded, animationLevel, lastSyncTime, adminMember, }) => { const { loadFullUser, openMediaViewer, loadProfilePhotos, } = getActions(); const { id: userId } = user || {}; useEffect(() => { if (userId && lastSyncTime) { if (withFullInfo) loadFullUser({ userId }); if (withMediaViewer) loadProfilePhotos({ profileId: userId }); } }, [userId, loadFullUser, loadProfilePhotos, lastSyncTime, withFullInfo, withMediaViewer]); const handleAvatarViewerOpen = useCallback((e: React.MouseEvent, hasMedia: boolean) => { if (user && hasMedia) { e.stopPropagation(); openMediaViewer({ avatarOwnerId: user.id, mediaId: 0, origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar, }); } }, [user, avatarSize, openMediaViewer]); const lang = useLang(); const mainUsername = useMemo(() => user && withUsername && getMainUsername(user), [user, withUsername]); if (!user) { return undefined; } function renderStatusOrTyping() { if (status) { return withDots ? ( ) : ( {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 { lastSyncTime } = global; const user = selectUser(global, userId); const userStatus = selectUserStatus(global, userId); const isSavedMessages = !forceShowSelf && user && user.isSelf; const areMessagesLoaded = Boolean(selectChatMessages(global, userId)); const userProfilePhoto = user ? selectUserPhotoFromFullInfo(global, user.id) : undefined; return { lastSyncTime, user, userStatus, userProfilePhoto, isSavedMessages, areMessagesLoaded, animationLevel: global.settings.byKey.animationLevel, }; }, )(PrivateChatInfo));