Management: Avoid infinite requests after adding chat member

This commit is contained in:
Alexander Zinchuk 2022-03-05 18:06:28 +01:00
parent 9fb3b71e58
commit faf9c3796c
2 changed files with 26 additions and 16 deletions

View File

@ -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);
})();
});

View File

@ -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,
},
});
}