From dd3c6bc70f5cecd3eb0604ce808177ccd2d233d0 Mon Sep 17 00:00:00 2001 From: zubiden <19638254+zubiden@users.noreply.github.com> Date: Mon, 15 Jul 2024 15:52:10 +0200 Subject: [PATCH] Global Search: Use server order (#4752) --- src/api/gramjs/methods/chats.ts | 15 +++--- src/components/left/newChat/NewChatStep1.tsx | 33 ++++++-------- src/components/left/search/ChatResults.tsx | 48 ++++++++------------ src/global/actions/api/globalSearch.ts | 16 ++----- src/global/actions/api/users.ts | 19 ++++---- src/global/types.ts | 6 +-- 6 files changed, 57 insertions(+), 80 deletions(-) diff --git a/src/api/gramjs/methods/chats.ts b/src/api/gramjs/methods/chats.ts index abd6ad315..52173e2e7 100644 --- a/src/api/gramjs/methods/chats.ts +++ b/src/api/gramjs/methods/chats.ts @@ -360,16 +360,19 @@ export async function searchChats({ query }: { query: string }) { updateLocalDb(result); const accountPeerIds = result.myResults.map(getApiChatIdFromMtpPeer); - const allChats = result.chats.concat(result.users) + const globalPeerIds = result.results.map(getApiChatIdFromMtpPeer) + .filter((id) => !accountPeerIds.includes(id)); + + const chats = result.chats.concat(result.users) .map((user) => buildApiChatFromPreview(user)) .filter(Boolean); - const allUsers = result.users.map(buildApiUser).filter((user) => Boolean(user) && !user.isSelf) as ApiUser[]; + const users = result.users.map(buildApiUser).filter(Boolean); return { - accountChats: allChats.filter((r) => accountPeerIds.includes(r.id)), - accountUsers: allUsers.filter((u) => accountPeerIds.includes(u.id)), - globalChats: allChats.filter((r) => !accountPeerIds.includes(r.id)), - globalUsers: allUsers.filter((u) => !accountPeerIds.includes(u.id)), + accountResultIds: accountPeerIds, + globalResultIds: globalPeerIds, + chats, + users, }; } diff --git a/src/components/left/newChat/NewChatStep1.tsx b/src/components/left/newChat/NewChatStep1.tsx index bea355c2f..c568ab6d9 100644 --- a/src/components/left/newChat/NewChatStep1.tsx +++ b/src/components/left/newChat/NewChatStep1.tsx @@ -27,22 +27,22 @@ type StateProps = { localContactIds?: string[]; searchQuery?: string; isSearching?: boolean; - localUserIds?: string[]; - globalUserIds?: string[]; + localPeerIds?: string[]; + globalPeerIds?: string[]; }; const NewChatStep1: FC = ({ isChannel, isActive, selectedMemberIds, - onSelectedMemberIdsChange, - onNextStep, - onReset, localContactIds, searchQuery, isSearching, - localUserIds, - globalUserIds, + localPeerIds, + globalPeerIds, + onSelectedMemberIdsChange, + onNextStep, + onReset, }) => { const { setGlobalSearchQuery, @@ -67,20 +67,17 @@ const NewChatStep1: FC = ({ return sortChatIds( unique([ ...foundContactIds, - ...(localUserIds || []), - ...(globalUserIds || []), + ...(localPeerIds || []), + ...(globalPeerIds || []), ]).filter((contactId) => { const user = usersById[contactId]; - if (!user) { - return true; - } - return !user.isSelf && (user.canBeInvitedToGroup || !isUserBot(user)); + return user && !user.isSelf && (user.canBeInvitedToGroup || !isUserBot(user)); }), false, selectedMemberIds, ); - }, [localContactIds, searchQuery, localUserIds, globalUserIds, selectedMemberIds]); + }, [localContactIds, searchQuery, localPeerIds, globalPeerIds, selectedMemberIds]); const handleNextStep = useCallback(() => { setGlobalSearchQuery({ query: '' }); @@ -136,15 +133,15 @@ export default memo(withGlobal( globalResults, localResults, } = selectTabState(global).globalSearch; - const { userIds: globalUserIds } = globalResults || {}; - const { userIds: localUserIds } = localResults || {}; + const { peerIds: globalPeerIds } = globalResults || {}; + const { peerIds: localPeerIds } = localResults || {}; return { localContactIds, searchQuery, isSearching: fetchingStatus?.chats, - globalUserIds, - localUserIds, + globalPeerIds, + localPeerIds, }; }, )(NewChatStep1)); diff --git a/src/components/left/search/ChatResults.tsx b/src/components/left/search/ChatResults.tsx index 6c2ab51c8..965246ed3 100644 --- a/src/components/left/search/ChatResults.tsx +++ b/src/components/left/search/ChatResults.tsx @@ -47,10 +47,8 @@ export type OwnProps = { type StateProps = { currentUserId?: string; contactIds?: string[]; - accountChatIds?: string[]; - accountUserIds?: string[]; - globalChatIds?: string[]; - globalUserIds?: string[]; + accountPeerIds?: string[]; + globalPeerIds?: string[]; foundIds?: string[]; globalMessagesByChatId?: Record }>; fetchingStatus?: { chats?: boolean; messages?: boolean }; @@ -69,10 +67,8 @@ const ChatResults: FC = ({ dateSearchQuery, currentUserId, contactIds, - accountChatIds, - accountUserIds, - globalChatIds, - globalUserIds, + accountPeerIds, + globalPeerIds, foundIds, globalMessagesByChatId, fetchingStatus, @@ -155,41 +151,35 @@ const ChatResults: FC = ({ contactIdsWithMe, usersById, searchQuery, currentUserId, lang('SavedMessages'), ); - const localPeerIds = unique([ + const localPeerIds = [ ...localContactIds, ...localChatIds, - ]); - - const accountPeerIds = unique([ - ...(accountChatIds ?? []), - ...(accountUserIds ?? []), - ].filter((accountPeerId) => !localPeerIds.includes(accountPeerId))); - - return [ - ...sortChatIds(localPeerIds, undefined, currentUserId ? [currentUserId] : undefined), - ...sortChatIds(accountPeerIds), ]; - }, [searchQuery, lang, currentUserId, contactIds, accountChatIds, accountUserIds, isChannelList]); + + return unique([ + ...sortChatIds(localPeerIds, undefined, currentUserId ? [currentUserId] : undefined), + ...sortChatIds(accountPeerIds || []), + ]); + }, [searchQuery, lang, currentUserId, contactIds, accountPeerIds, isChannelList]); useHorizontalScroll(chatSelectionRef, !localResults.length || isChannelList, true); const globalResults = useMemo(() => { - if (!searchQuery || searchQuery.length < MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH || !globalChatIds || !globalUserIds) { + if (!searchQuery || searchQuery.length < MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH || !globalPeerIds) { return MEMO_EMPTY_ARRAY; } // No need for expensive global updates, so we avoid them const chatsById = getGlobal().chats.byId; - const ids = unique([...globalChatIds, ...globalUserIds]); - const filteredIds = ids.filter((id) => { + const filteredIds = globalPeerIds.filter((id) => { if (!isChannelList) return true; const chat = chatsById[id]; return chat && isChatChannel(chat); }); return sortChatIds(filteredIds, true); - }, [globalChatIds, globalUserIds, isChannelList, searchQuery]); + }, [globalPeerIds, isChannelList, searchQuery]); const foundMessages = useMemo(() => { if ((!searchQuery && !searchDate) || !foundIds || foundIds.length === 0) { @@ -372,8 +362,8 @@ export default memo(withGlobal( const { fetchingStatus, globalResults, localResults, resultsByType, } = selectTabState(global).globalSearch; - const { chatIds: globalChatIds, userIds: globalUserIds } = globalResults || {}; - const { chatIds: accountChatIds, userIds: accountUserIds } = localResults || {}; + const { peerIds: globalPeerIds } = globalResults || {}; + const { peerIds: accountPeerIds } = localResults || {}; const { byChatId: globalMessagesByChatId } = messages; const foundIds = resultsByType?.[isChannelList ? 'channels' : 'text']?.foundIds; const { similarChannelIds } = selectSimilarChannelIds(global, GLOBAL_SUGGESTED_CHANNELS_ID) || {}; @@ -381,10 +371,8 @@ export default memo(withGlobal( return { currentUserId, contactIds, - accountChatIds, - accountUserIds, - globalChatIds, - globalUserIds, + accountPeerIds, + globalPeerIds, foundIds, globalMessagesByChatId, fetchingStatus, diff --git a/src/global/actions/api/globalSearch.ts b/src/global/actions/api/globalSearch.ts index 7e2d38475..14174a1a2 100644 --- a/src/global/actions/api/globalSearch.ts +++ b/src/global/actions/api/globalSearch.ts @@ -44,27 +44,21 @@ addActionHandler('setGlobalSearchQuery', (global, actions, payload): ActionRetur } const { - accountChats, accountUsers, globalChats, globalUsers, + accountResultIds, globalResultIds, users, chats, } = result; - if (accountChats.length || globalChats.length) { - global = addChats(global, buildCollectionByKey([...accountChats, ...globalChats], 'id')); - } + global = addChats(global, buildCollectionByKey(chats, 'id')); - if (accountUsers.length || globalUsers.length) { - global = addUsers(global, buildCollectionByKey([...accountUsers, ...globalUsers], 'id')); - } + global = addUsers(global, buildCollectionByKey(users, 'id')); global = updateGlobalSearchFetchingStatus(global, { chats: false }, tabId); global = updateGlobalSearch(global, { localResults: { - chatIds: accountChats.map(({ id }) => id), - userIds: accountChats.map(({ id }) => id), + peerIds: accountResultIds, }, globalResults: { ...selectTabState(global, tabId).globalSearch.globalResults, - chatIds: globalChats.map(({ id }) => id), - userIds: globalUsers.map(({ id }) => id), + peerIds: globalResultIds, }, }, tabId); diff --git a/src/global/actions/api/users.ts b/src/global/actions/api/users.ts index 8fe417f30..e2735d545 100644 --- a/src/global/actions/api/users.ts +++ b/src/global/actions/api/users.ts @@ -318,18 +318,15 @@ addActionHandler('setUserSearchQuery', (global, actions, payload): ActionReturnT return; } - const { accountUsers, globalUsers } = result; + const { + users, chats, accountResultIds, globalResultIds, + } = result; - let localUserIds; - let globalUserIds; - if (accountUsers.length) { - global = addUsers(global, buildCollectionByKey(accountUsers, 'id')); - localUserIds = accountUsers.map(({ id }) => id); - } - if (globalUsers.length) { - global = addUsers(global, buildCollectionByKey(globalUsers, 'id')); - globalUserIds = globalUsers.map(({ id }) => id); - } + global = addUsers(global, buildCollectionByKey(users, 'id')); + global = addChats(global, buildCollectionByKey(chats, 'id')); + + const localUserIds = accountResultIds.filter(isUserId); + const globalUserIds = globalResultIds.filter(isUserId); global = updateUserSearchFetchingStatus(global, false, tabId); global = updateUserSearch(global, { localUserIds, globalUserIds }, tabId); diff --git a/src/global/types.ts b/src/global/types.ts index 75f5edb90..6881e0fa0 100644 --- a/src/global/types.ts +++ b/src/global/types.ts @@ -365,12 +365,10 @@ export type TabState = { }; isClosing?: boolean; localResults?: { - chatIds?: string[]; - userIds?: string[]; + peerIds?: string[]; }; globalResults?: { - chatIds?: string[]; - userIds?: string[]; + peerIds?: string[]; }; resultsByType?: Partial