From faf9c3796cebaddcf81198b215b89b6eee445162 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Sat, 5 Mar 2022 18:06:28 +0100 Subject: [PATCH] Management: Avoid infinite requests after adding chat member --- src/modules/actions/api/chats.ts | 16 ++-------------- src/modules/reducers/chats.ts | 26 ++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/modules/actions/api/chats.ts b/src/modules/actions/api/chats.ts index 392dd28a0..c30df2c80 100644 --- a/src/modules/actions/api/chats.ts +++ b/src/modules/actions/api/chats.ts @@ -23,7 +23,7 @@ import { addChats, addUsers, addUserStatuses, replaceThreadParam, updateChatListIds, updateChats, updateChat, updateChatListSecondaryInfo, updateManagementProgress, leaveChat, replaceUsers, replaceUserStatuses, - replaceChats, replaceChatListIds, + replaceChats, replaceChatListIds, addChatMembers, } from '../../reducers'; import { selectChat, selectUser, selectChatListType, selectIsChatPinned, @@ -953,19 +953,7 @@ addReducer('loadMoreMembers', (global) => { global = getGlobal(); global = addUsers(global, buildCollectionByKey(users, 'id')); - - const newMemberIds = new Set(members.map(m => m.userId)); - const preservedMembers = chat.fullInfo?.members?.filter((m) => !newMemberIds.has(m.userId)) || []; - - global = updateChat(global, chat.id, { - fullInfo: { - ...chat.fullInfo, - members: [ - ...preservedMembers, - ...members, - ], - }, - }); + global = addChatMembers(global, chat, members); setGlobal(global); })(); }); diff --git a/src/modules/reducers/chats.ts b/src/modules/reducers/chats.ts index 5ad0de83a..ed6ca4690 100644 --- a/src/modules/reducers/chats.ts +++ b/src/modules/reducers/chats.ts @@ -1,8 +1,8 @@ import { GlobalState } from '../../global/types'; -import { ApiChat, ApiPhoto } from '../../api/types'; +import { ApiChat, ApiChatMember, ApiPhoto } from '../../api/types'; import { ARCHIVED_FOLDER_ID } from '../../config'; -import { omit } from '../../util/iteratees'; +import { areSortedArraysEqual, omit } from '../../util/iteratees'; import { selectChatListType } from '../selectors'; export function replaceChatListIds( @@ -216,3 +216,25 @@ export function leaveChat(global: GlobalState, leftChatId: string): GlobalState return global; } + +export function addChatMembers(global: GlobalState, chat: ApiChat, membersToAdd: ApiChatMember[]): GlobalState { + const currentMembers = chat.fullInfo?.members; + const newMemberIds = new Set(membersToAdd.map(m => m.userId)); + const updatedMembers = [ + ...currentMembers?.filter((m) => !newMemberIds.has(m.userId)) || [], + ...membersToAdd, + ]; + const currentIds = currentMembers?.map(({ userId }) => userId) || []; + const updatedIds = updatedMembers.map(({ userId }) => userId); + + if (areSortedArraysEqual(currentIds, updatedIds)) { + return global; + } + + return updateChat(global, chat.id, { + fullInfo: { + ...chat.fullInfo, + members: updatedMembers, + }, + }); +}