import { MouseEvent as ReactMouseEvent } from 'react'; import React, { FC, useEffect, useCallback, memo, } from '../../lib/teact/teact'; import { getActions, withGlobal } from '../../global'; import { ApiUser, ApiTypingStatus, ApiUserStatus } from '../../api/types'; import { GlobalState } from '../../global/types'; import { MediaViewerOrigin } from '../../types'; import { selectChatMessages, selectUser, selectUserStatus } from '../../global/selectors'; import { getUserFullName, getUserStatus, isUserOnline } from '../../global/helpers'; import renderText from './helpers/renderText'; import useLang from '../../hooks/useLang'; import Avatar from './Avatar'; import VerifiedIcon from './VerifiedIcon'; import TypingStatus from './TypingStatus'; import DotAnimation from './DotAnimation'; 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; noStatusOrTyping?: boolean; noRtl?: boolean; }; type StateProps = { user?: ApiUser; userStatus?: ApiUserStatus; isSavedMessages?: boolean; areMessagesLoaded: boolean; serverTimeOffset: number; } & Pick; const PrivateChatInfo: FC = ({ typingStatus, avatarSize = 'medium', status, withDots, withMediaViewer, withUsername, withFullInfo, withUpdatingStatus, noStatusOrTyping, noRtl, user, userStatus, isSavedMessages, areMessagesLoaded, lastSyncTime, serverTimeOffset, }) => { const { loadFullUser, openMediaViewer, } = getActions(); const { id: userId } = user || {}; const fullName = getUserFullName(user); useEffect(() => { if (withFullInfo && lastSyncTime && userId) { loadFullUser({ userId }); } }, [userId, loadFullUser, lastSyncTime, withFullInfo]); const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => { if (user && hasPhoto) { e.stopPropagation(); openMediaViewer({ avatarOwnerId: user.id, origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar, }); } }, [user, avatarSize, openMediaViewer]); const lang = useLang(); if (!user) { return undefined; } function renderStatusOrTyping() { if (status) { return withDots ? ( ) : ( {status} ); } if (withUpdatingStatus && !areMessagesLoaded) { return ( ); } if (!user) { return undefined; } if (typingStatus) { return ; } return ( {withUsername && user.username && {user.username}} {getUserStatus(lang, user, userStatus, serverTimeOffset)} ); } return (
{isSavedMessages ? (

{lang('SavedMessages')}

) : (

{fullName && renderText(fullName)}

{user?.isVerified && }
)} {(status || (!isSavedMessages && !noStatusOrTyping)) && renderStatusOrTyping()}
); }; export default memo(withGlobal( (global, { userId, forceShowSelf }): StateProps => { const { lastSyncTime, serverTimeOffset } = global; const user = selectUser(global, userId); const userStatus = selectUserStatus(global, userId); const isSavedMessages = !forceShowSelf && user && user.isSelf; const areMessagesLoaded = Boolean(selectChatMessages(global, userId)); return { lastSyncTime, user, userStatus, isSavedMessages, areMessagesLoaded, serverTimeOffset, }; }, )(PrivateChatInfo));