diff --git a/src/components/calls/group/GroupCallParticipant.tsx b/src/components/calls/group/GroupCallParticipant.tsx index da36db660..c4bac7219 100644 --- a/src/components/calls/group/GroupCallParticipant.tsx +++ b/src/components/calls/group/GroupCallParticipant.tsx @@ -29,14 +29,12 @@ type OwnProps = { }; type StateProps = { - user?: ApiUser; - chat?: ApiChat; + peer?: ApiUser | ApiChat; }; const GroupCallParticipant: FC = ({ participant, - user, - chat, + peer, }) => { // eslint-disable-next-line no-null/no-null const ref = useRef(null); @@ -124,13 +122,13 @@ const GroupCallParticipant: FC = ({ isMutedByMe, isRaiseHand, isSelf, hasCustomVolume, isMuted, isSpeaking, participant.about, participant.volume, lang, ]); - if (!user && !chat) { + if (!peer) { return undefined; } return ( } + leftElement={} rightElement={} className={styles.root} onClick={handleContextMenu} @@ -140,7 +138,7 @@ const GroupCallParticipant: FC = ({ ripple ref={ref} > - + {hasPresentationStream && } {hasVideoStream && } @@ -166,8 +164,7 @@ const GroupCallParticipant: FC = ({ export default memo(withGlobal( (global, { participant }): StateProps => { return { - user: participant.isUser ? selectUser(global, participant.id) : undefined, - chat: !participant.isUser ? selectChat(global, participant.id) : undefined, + peer: selectUser(global, participant.id) || selectChat(global, participant.id), }; }, )(GroupCallParticipant)); diff --git a/src/components/calls/group/GroupCallTopPane.tsx b/src/components/calls/group/GroupCallTopPane.tsx index 4c5c6a037..ba74689cd 100644 --- a/src/components/calls/group/GroupCallTopPane.tsx +++ b/src/components/calls/group/GroupCallTopPane.tsx @@ -27,6 +27,8 @@ type StateProps = { isActive: boolean; }; +const PREVIEW_AVATARS_COUNT = 3; + const GroupCallTopPane: FC = ({ chatId, isActive, @@ -58,19 +60,10 @@ const GroupCallTopPane: FC = ({ const usersById = getGlobal().users.byId; const chatsById = getGlobal().chats.byId; - return Object.values(participants).filter((_, i) => i < 3).map(({ id, isUser }) => { - if (isUser) { - if (!usersById[id]) { - return undefined; - } - return { user: usersById[id] }; - } else { - if (!chatsById[id]) { - return undefined; - } - return { chat: chatsById[id] }; - } - }).filter(Boolean); + return Object.values(participants) + .slice(0, PREVIEW_AVATARS_COUNT) + .map(({ id }) => usersById[id] || chatsById[id]) + .filter(Boolean); }, [participants]); useEffect(() => { @@ -107,17 +100,12 @@ const GroupCallTopPane: FC = ({ {lang('Participants', groupCall.participantsCount || 0, 'i')}
- {fetchedParticipants.map((p) => { - if (!p) return undefined; - - return ( - - ); - })} + {fetchedParticipants.map((peer) => ( + + ))}
diff --git a/src/components/mediaViewer/SenderInfo.tsx b/src/components/mediaViewer/SenderInfo.tsx index 5463df9dd..d82124f81 100644 --- a/src/components/mediaViewer/SenderInfo.tsx +++ b/src/components/mediaViewer/SenderInfo.tsx @@ -77,11 +77,7 @@ const SenderInfo: FC = ({ return (
- {isUserId(sender.id) ? ( - - ) : ( - - )} +
{senderTitle && renderText(senderTitle)} diff --git a/src/components/middle/ReactorListModal.tsx b/src/components/middle/ReactorListModal.tsx index f75eaf38a..aeeea9672 100644 --- a/src/components/middle/ReactorListModal.tsx +++ b/src/components/middle/ReactorListModal.tsx @@ -1,20 +1,17 @@ import type { FC } from '../../lib/teact/teact'; import React, { - memo, useMemo, useEffect, useState, useRef, + memo, useEffect, useMemo, useRef, useState, } from '../../lib/teact/teact'; import { getActions, getGlobal, withGlobal } from '../../global'; import type { ApiAvailableReaction, ApiMessage, ApiReaction } from '../../api/types'; import { LoadMoreDirection } from '../../types'; -import { - selectChatMessage, - selectTabState, -} from '../../global/selectors'; +import { selectChatMessage, selectTabState } from '../../global/selectors'; import buildClassName from '../../util/buildClassName'; import { formatIntegerCompact } from '../../util/textFormat'; import { unique } from '../../util/iteratees'; -import { isSameReaction, getReactionUniqueKey } from '../../global/helpers'; +import { getReactionUniqueKey, isSameReaction } from '../../global/helpers'; import { formatDateAtTime } from '../../util/dateFormat'; import useLang from '../../hooks/useLang'; @@ -63,6 +60,7 @@ const ReactorListModal: FC = ({ // No need for expensive global updates on users, so we avoid them const usersById = getGlobal().users.byId; + const chatsById = getGlobal().chats.byId; const lang = useLang(); const [isClosing, startClosing, stopClosing] = useFlag(false); @@ -187,25 +185,26 @@ const ReactorListModal: FC = ({ onLoadMore={getMore} > {viewportIds?.flatMap( - (userId) => { - const user = usersById[userId]; - const userReactions = reactors?.reactions.filter((reactor) => reactor.userId === userId); + (peerId) => { + const peer = usersById[peerId] || chatsById[peerId]; + + const userReactions = reactors?.reactions.filter((reactor) => reactor.userId === peerId); const items: React.ReactNode[] = []; - const seenByUser = seenByDates?.[userId]; + const seenByUser = seenByDates?.[peerId]; userReactions?.forEach((r) => { if (chosenTab && !isSameReaction(r.reaction, chosenTab)) return; items.push( handleClick(userId)} + onClick={() => handleClick(peerId)} > - +
- + {formatDateAtTime(lang, r.addedDate * 1000)} @@ -225,13 +224,13 @@ const ReactorListModal: FC = ({ if (!chosenTab && !userReactions?.length) { items.push( handleClick(userId)} + onClick={() => handleClick(peerId)} > = ({ focus={focus} > {withAvatar && ( - + )}
/{botCommand.command} diff --git a/src/components/middle/composer/Composer.tsx b/src/components/middle/composer/Composer.tsx index 47ac64c28..fea6e4915 100644 --- a/src/components/middle/composer/Composer.tsx +++ b/src/components/middle/composer/Composer.tsx @@ -1383,8 +1383,7 @@ const Composer: FC = ({ className={buildClassName('send-as-button', shouldAnimateSendAsButtonRef.current && 'appear-animation')} > diff --git a/src/components/middle/composer/SendAsMenu.tsx b/src/components/middle/composer/SendAsMenu.tsx index 7919bee15..2c82cc6f6 100644 --- a/src/components/middle/composer/SendAsMenu.tsx +++ b/src/components/middle/composer/SendAsMenu.tsx @@ -7,7 +7,6 @@ import type { ApiSendAsPeerId } from '../../../api/types'; import { IS_TOUCH_ENV } from '../../../util/windowEnvironment'; import buildClassName from '../../../util/buildClassName'; import setTooltipItemVisible from '../../../util/setTooltipItemVisible'; -import { isUserId } from '../../../global/helpers'; import useLastCallback from '../../../hooks/useLastCallback'; import { useKeyboardNavigation } from './hooks/useKeyboardNavigation'; @@ -95,9 +94,9 @@ const SendAsMenu: FC = ({ >
{lang('SendMessageAsTitle')}
{usersById && chatsById && sendAsPeerIds?.map(({ id, isPremium }, index) => { - const user = isUserId(id) ? usersById[id] : undefined; - const chat = !user ? chatsById[id] : undefined; - const userOrChat = user || chat; + const user = usersById[id]; + const chat = chatsById[id]; + const peer = user || chat; const handleClick = () => { if (!isPremium || isCurrentUserPremium) { @@ -128,12 +127,11 @@ const SendAsMenu: FC = ({ >
- {userOrChat && } + {peer && } {user ? lang('VoipGroupPersonalAccount') : lang('Subscribers', chat?.membersCount, 'i')} diff --git a/src/components/middle/composer/StickerPicker.tsx b/src/components/middle/composer/StickerPicker.tsx index 451d97d9c..0edaea336 100644 --- a/src/components/middle/composer/StickerPicker.tsx +++ b/src/components/middle/composer/StickerPicker.tsx @@ -282,7 +282,7 @@ const StickerPicker: FC = ({ ) : stickerSet.id === FAVORITE_SYMBOL_SET_ID ? ( ) : stickerSet.id === CHAT_STICKER_SET_ID ? ( - + ) : ( = ({ function renderRecentRepliers() { return ( - recentRepliers && recentRepliers.length > 0 && ( + Boolean(recentRepliers?.length) && (
- {recentRepliers.map((user) => ( + {recentRepliers!.map((peer) => ( ))}
diff --git a/src/components/middle/message/Contact.tsx b/src/components/middle/message/Contact.tsx index f937214e4..3a491172f 100644 --- a/src/components/middle/message/Contact.tsx +++ b/src/components/middle/message/Contact.tsx @@ -49,7 +49,7 @@ const Contact: FC = ({ >
diff --git a/src/components/middle/message/Location.tsx b/src/components/middle/message/Location.tsx index 718ad7818..120f87f61 100644 --- a/src/components/middle/message/Location.tsx +++ b/src/components/middle/message/Location.tsx @@ -12,7 +12,6 @@ import { getMessageLocation, buildStaticMapHash, isGeoLiveExpired, - isUserId, } from '../../../global/helpers'; import { formatCountdownShort, formatLastUpdated } from '../../../util/dateFormat'; import { @@ -87,10 +86,6 @@ const Location: FC = ({ const prevMediaBlobUrl = usePrevious(mediaBlobUrl); const mapBlobUrl = mediaBlobUrl || prevMediaBlobUrl; - const isPeerUser = peer && isUserId(peer.id); - const avatarUser = (peer && isPeerUser) ? peer as ApiUser : undefined; - const avatarChat = (peer && !isPeerUser) ? peer as ApiChat : undefined; - const accuracyRadiusPx = useMemo(() => { if (type !== 'geoLive' || !point.accuracyRadius) { return 0; @@ -213,7 +208,7 @@ const Location: FC = ({ if (type === 'geoLive') { return (
- + {location.heading !== undefined && (
)} diff --git a/src/components/middle/message/Message.tsx b/src/components/middle/message/Message.tsx index 2756af09a..90e8f53cc 100644 --- a/src/components/middle/message/Message.tsx +++ b/src/components/middle/message/Message.tsx @@ -774,18 +774,14 @@ const Message: FC = ({ } function renderAvatar() { - const isAvatarPeerUser = avatarPeer && isUserId(avatarPeer.id); - const avatarUser = (avatarPeer && isAvatarPeerUser) ? avatarPeer as ApiUser : undefined; - const avatarChat = (avatarPeer && !isAvatarPeerUser) ? avatarPeer as ApiChat : undefined; const hiddenName = (!avatarPeer && forwardInfo) ? forwardInfo.hiddenUserName : undefined; return ( ); } diff --git a/src/components/middle/message/MessageContextMenu.tsx b/src/components/middle/message/MessageContextMenu.tsx index 31e5b7d9d..0252f6448 100644 --- a/src/components/middle/message/MessageContextMenu.tsx +++ b/src/components/middle/message/MessageContextMenu.tsx @@ -415,7 +415,7 @@ const MessageContextMenu: FC = ({ {seenByRecentUsers?.map((user) => ( ))}
diff --git a/src/components/middle/message/Poll.tsx b/src/components/middle/message/Poll.tsx index bcfb1b190..4613e7285 100644 --- a/src/components/middle/message/Poll.tsx +++ b/src/components/middle/message/Poll.tsx @@ -226,7 +226,7 @@ const Poll: FC = ({ ))}
diff --git a/src/components/middle/message/ReactionButton.tsx b/src/components/middle/message/ReactionButton.tsx index 341c362ed..6a903d974 100644 --- a/src/components/middle/message/ReactionButton.tsx +++ b/src/components/middle/message/ReactionButton.tsx @@ -84,7 +84,7 @@ const ReactionButton: FC<{ {recentReactors.map((user) => ( ))} diff --git a/src/components/right/RightSearch.tsx b/src/components/right/RightSearch.tsx index 9d453a6e5..35345cbae 100644 --- a/src/components/right/RightSearch.tsx +++ b/src/components/right/RightSearch.tsx @@ -13,7 +13,6 @@ import { selectChat, selectCurrentTextSearch, } from '../../global/selectors'; -import { isChatChannel } from '../../global/helpers'; import { disableDirectTextInput, enableDirectTextInput } from '../../util/directInputManager'; import { renderMessageSummary } from '../common/helpers/renderMessageText'; import useLang from '../../hooks/useLang'; @@ -37,7 +36,6 @@ export type OwnProps = { }; type StateProps = { - chat?: ApiChat; messagesById?: Record; query?: string; totalCount?: number; @@ -48,7 +46,6 @@ const RightSearch: FC = ({ chatId, threadId, isActive, - chat, messagesById, query, totalCount, @@ -96,26 +93,29 @@ const RightSearch: FC = ({ return undefined; } - const senderUser = message.senderId ? selectUser(getGlobal(), message.senderId) : undefined; + const global = getGlobal(); - let senderChat; - if (chat && isChatChannel(chat)) { - senderChat = chat; - } else if (message.forwardInfo) { + let senderPeer = message.senderId + ? selectUser(global, message.senderId) || selectChat(global, message.senderId) + : undefined; + + if (!senderPeer && message.forwardInfo) { const { isChannelPost, fromChatId } = message.forwardInfo; - senderChat = isChannelPost && fromChatId ? selectChat(getGlobal(), fromChatId) : undefined; - } else { - senderChat = message.senderId ? selectChat(getGlobal(), message.senderId) : undefined; + const originalSender = isChannelPost && fromChatId ? selectChat(global, fromChatId) : undefined; + if (originalSender) senderPeer = originalSender; + } + + if (!senderPeer) { + return undefined; } return { message, - senderUser, - senderChat, + senderPeer: senderPeer!, onClick: () => focusMessage({ chatId, threadId, messageId: id }), }; }).filter(Boolean); - }, [query, viewportIds, messagesById, chat, focusMessage, chatId, threadId]); + }, [query, viewportIds, messagesById, focusMessage, chatId, threadId]); const handleKeyDown = useKeyboardListNavigation(containerRef, true, (index) => { const foundResult = viewportResults?.[index === -1 ? 0 : index]; @@ -125,11 +125,10 @@ const RightSearch: FC = ({ }, '.ListItem-button', true); const renderSearchResult = ({ - message, senderUser, senderChat, onClick, + message, senderPeer, onClick, }: { message: ApiMessage; - senderUser?: ApiUser; - senderChat?: ApiChat; + senderPeer: ApiUser | ApiChat; onClick: NoneToVoidFunction; }) => { const text = renderMessageSummary(lang, message, undefined, query); @@ -142,12 +141,11 @@ const RightSearch: FC = ({ onClick={onClick} >
- +
@@ -189,9 +187,8 @@ const RightSearch: FC = ({ export default memo(withGlobal( (global, { chatId }): StateProps => { - const chat = selectChat(global, chatId); - const messagesById = chat && selectChatMessages(global, chat.id); - if (!chat || !messagesById) { + const messagesById = selectChatMessages(global, chatId); + if (!messagesById) { return {}; } @@ -199,7 +196,6 @@ export default memo(withGlobal( const { totalCount, foundIds } = results || {}; return { - chat, messagesById, query, totalCount, diff --git a/src/components/right/management/JoinRequest.tsx b/src/components/right/management/JoinRequest.tsx index bb1ec1768..e50649407 100644 --- a/src/components/right/management/JoinRequest.tsx +++ b/src/components/right/management/JoinRequest.tsx @@ -67,7 +67,7 @@ const JoinRequest: FC = ({
{fullName}
diff --git a/src/components/right/management/ManageDiscussion.tsx b/src/components/right/management/ManageDiscussion.tsx index 290555050..5b134b58a 100644 --- a/src/components/right/management/ManageDiscussion.tsx +++ b/src/components/right/management/ManageDiscussion.tsx @@ -118,7 +118,7 @@ const ManageDiscussion: FC = ({
{lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')} @@ -136,7 +136,7 @@ const ManageDiscussion: FC = ({
{lang('Channel.DiscussionGroup.LinkGroup')} diff --git a/src/components/right/management/ManageUser.tsx b/src/components/right/management/ManageUser.tsx index 321b94d2a..4b3008ede 100644 --- a/src/components/right/management/ManageUser.tsx +++ b/src/components/right/management/ManageUser.tsx @@ -230,7 +230,7 @@ const ManageUser: FC = ({ diff --git a/src/components/right/statistics/StatisticsPublicForward.tsx b/src/components/right/statistics/StatisticsPublicForward.tsx index 5847fee4e..a60ee4f3d 100644 --- a/src/components/right/statistics/StatisticsPublicForward.tsx +++ b/src/components/right/statistics/StatisticsPublicForward.tsx @@ -27,7 +27,7 @@ const StatisticsPublicForward: FC = ({ data }) => { return (
- +
diff --git a/src/global/helpers/users.ts b/src/global/helpers/users.ts index dec4fa2ff..4c093efb9 100644 --- a/src/global/helpers/users.ts +++ b/src/global/helpers/users.ts @@ -171,6 +171,10 @@ export function isUserOnline(user: ApiUser, userStatus?: ApiUserStatus) { return false; } + if (user.isSelf) { + return false; + } + return userStatus.type === 'userStatusOnline' && type !== 'userTypeBot'; } diff --git a/src/lib/gramjs/client/MockClient.ts b/src/lib/gramjs/client/MockClient.ts index 391475d43..a6ddf2b52 100644 --- a/src/lib/gramjs/client/MockClient.ts +++ b/src/lib/gramjs/client/MockClient.ts @@ -178,7 +178,7 @@ class TelegramClient { return topic.id < offsetTopicId; } return true; - }).filter((_, i) => i < limit), + }).slice(0, limit), users: [], chats: [], messages: [],