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, addChats, addUsers, addUserStatuses, replaceThreadParam,
updateChatListIds, updateChats, updateChat, updateChatListSecondaryInfo, updateChatListIds, updateChats, updateChat, updateChatListSecondaryInfo,
updateManagementProgress, leaveChat, replaceUsers, replaceUserStatuses, updateManagementProgress, leaveChat, replaceUsers, replaceUserStatuses,
replaceChats, replaceChatListIds, replaceChats, replaceChatListIds, addChatMembers,
} from '../../reducers'; } from '../../reducers';
import { import {
selectChat, selectUser, selectChatListType, selectIsChatPinned, selectChat, selectUser, selectChatListType, selectIsChatPinned,
@ -953,19 +953,7 @@ addReducer('loadMoreMembers', (global) => {
global = getGlobal(); global = getGlobal();
global = addUsers(global, buildCollectionByKey(users, 'id')); global = addUsers(global, buildCollectionByKey(users, 'id'));
global = addChatMembers(global, chat, members);
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,
],
},
});
setGlobal(global); setGlobal(global);
})(); })();
}); });

View File

@ -1,8 +1,8 @@
import { GlobalState } from '../../global/types'; 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 { ARCHIVED_FOLDER_ID } from '../../config';
import { omit } from '../../util/iteratees'; import { areSortedArraysEqual, omit } from '../../util/iteratees';
import { selectChatListType } from '../selectors'; import { selectChatListType } from '../selectors';
export function replaceChatListIds( export function replaceChatListIds(
@ -216,3 +216,25 @@ export function leaveChat(global: GlobalState, leftChatId: string): GlobalState
return global; 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,
},
});
}