Client: Members: Fix infinite loading and duplicate members after inviting users. Remove useless code

This commit is contained in:
Aleksandr Lushkin 2024-05-27 18:45:43 +02:00
parent 5b6d391060
commit a7b38055a5
3 changed files with 45 additions and 91 deletions

View File

@ -80,8 +80,8 @@ const InvitePanel = ({
defaultAccess, defaultAccess,
inviteUsers, inviteUsers,
setInfoPanelIsMobileHidden, setInfoPanelIsMobileHidden,
updateInfoPanelSelection, updateInfoPanelMembers,
addInfoPanelMembers, isRoomMembersPanelOpen,
setInviteLanguage, setInviteLanguage,
getUsersList, getUsersList,
filter, filter,
@ -291,28 +291,6 @@ const InvitePanel = ({
setIsLoading(false); setIsLoading(false);
const invitedViaEmail = data.invitations
.filter((inv) => inv.email && !inv.id)
.map((invitation) => ({
access: invitation.access,
sharedTo: {
name: invitation.email,
userName: invitation.email,
email: invitation.email,
displayName: invitation.email,
status: 1,
activationStatus: 2,
usedSpace: 0,
hasAvatar: false,
},
canEditAccess: false,
}));
if (isRooms) {
const newInfoPanelMembers = [...result.members, ...invitedViaEmail];
addInfoPanelMembers(t, newInfoPanelMembers);
}
onClose(); onClose();
toastr.success(t("Common:UsersInvited")); toastr.success(t("Common:UsersInvited"));
@ -320,7 +298,9 @@ const InvitePanel = ({
toastr.warning(result?.warning); toastr.warning(result?.warning);
} }
updateInfoPanelSelection(); if (isRoomMembersPanelOpen) {
updateInfoPanelMembers(t);
}
} catch (err) { } catch (err) {
toastr.error(err); toastr.error(err);
setIsLoading(false); setIsLoading(false);
@ -503,8 +483,8 @@ export default inject(
const { filter } = peopleStore.filterStore; const { filter } = peopleStore.filterStore;
const { const {
setIsMobileHidden: setInfoPanelIsMobileHidden, setIsMobileHidden: setInfoPanelIsMobileHidden,
updateInfoPanelSelection, updateInfoPanelMembers,
addInfoPanelMembers, isRoomMembersPanelOpen,
} = infoPanelStore; } = infoPanelStore;
const { const {
@ -547,8 +527,8 @@ export default inject(
collaboratorLink, collaboratorLink,
inviteUsers, inviteUsers,
setInfoPanelIsMobileHidden, setInfoPanelIsMobileHidden,
updateInfoPanelSelection, updateInfoPanelMembers,
addInfoPanelMembers, isRoomMembersPanelOpen,
getUsersList, getUsersList,
filter, filter,
currentDeviceType, currentDeviceType,

View File

@ -65,7 +65,7 @@ const Members = ({
isPublicRoomType, isPublicRoomType,
membersFilter, membersFilter,
infoPanelMembers, infoPanelMembers,
setInfoPanelMembers, updateInfoPanelMembers,
primaryLink, primaryLink,
isArchiveFolder, isArchiveFolder,
isPublicRoom, isPublicRoom,
@ -75,38 +75,24 @@ const Members = ({
getPrimaryLink, getPrimaryLink,
setExternalLink, setExternalLink,
withPublicRoomBlock, withPublicRoomBlock,
fetchMembers,
fetchMoreMembers, fetchMoreMembers,
membersIsLoading, membersIsLoading,
searchValue, searchValue,
searchResultIsLoading, isMembersPanelUpdating,
}) => { }) => {
const withoutTitlesAndLinks = !!searchValue; const withoutTitlesAndLinks = !!searchValue;
const membersHelper = new MembersHelper({ t }); const membersHelper = new MembersHelper({ t });
const scrollContext = useContext(ScrollbarContext); const scrollContext = useContext(ScrollbarContext);
const updateInfoPanelMembers = async () => {
if (
!infoPanelSelection ||
!infoPanelSelection.isRoom ||
!infoPanelSelection.id
) {
return;
}
const fetchedMembers = await fetchMembers(t, true, withoutTitlesAndLinks);
setInfoPanelMembers(fetchedMembers);
};
useEffect(() => { useEffect(() => {
updateInfoPanelMembers(); updateInfoPanelMembers(t);
}, [infoPanelSelection, searchValue]); }, [infoPanelSelection, searchValue]);
useEffect(() => { useEffect(() => {
if (searchResultIsLoading) return; if (isMembersPanelUpdating) return;
scrollContext?.parentScrollbar?.scrollToTop(); scrollContext?.parentScrollbar?.scrollToTop();
}, [searchResultIsLoading]); }, [isMembersPanelUpdating]);
const loadNextPage = async () => { const loadNextPage = async () => {
await fetchMoreMembers(t, withoutTitlesAndLinks); await fetchMoreMembers(t, withoutTitlesAndLinks);
@ -259,8 +245,8 @@ const Members = ({
<MembersList <MembersList
loadNextPage={loadNextPage} loadNextPage={loadNextPage}
hasNextPage={ hasNextPage={
membersList.length - headersCount < membersFilter.total && !isMembersPanelUpdating &&
!searchResultIsLoading membersList.length - headersCount < membersFilter.total
} }
itemCount={membersFilter.total + headersCount + publicRoomItemsLength} itemCount={membersFilter.total + headersCount + publicRoomItemsLength}
showPublicRoomBar={showPublicRoomBar} showPublicRoomBar={showPublicRoomBar}
@ -279,6 +265,7 @@ const Members = ({
membersHelper={membersHelper} membersHelper={membersHelper}
currentMember={currentMember} currentMember={currentMember}
hasNextPage={ hasNextPage={
!isMembersPanelUpdating &&
membersList.length - headersCount < membersFilter.total membersList.length - headersCount < membersFilter.total
} }
/> />
@ -303,13 +290,12 @@ export default inject(
infoPanelSelection, infoPanelSelection,
setIsScrollLocked, setIsScrollLocked,
infoPanelMembers, infoPanelMembers,
setInfoPanelMembers, updateInfoPanelMembers,
fetchMembers,
fetchMoreMembers, fetchMoreMembers,
membersIsLoading, membersIsLoading,
withPublicRoomBlock, withPublicRoomBlock,
searchValue, searchValue,
searchResultIsLoading, isMembersPanelUpdating,
} = infoPanelStore; } = infoPanelStore;
const { membersFilter } = filesStore; const { membersFilter } = filesStore;
const { id: selfId, isAdmin } = userStore.user; const { id: selfId, isAdmin } = userStore.user;
@ -337,7 +323,7 @@ export default inject(
isPublicRoomType, isPublicRoomType,
membersFilter, membersFilter,
infoPanelMembers, infoPanelMembers,
setInfoPanelMembers, updateInfoPanelMembers,
roomType, roomType,
primaryLink, primaryLink,
isArchiveFolder: isArchiveFolderRoot, isArchiveFolder: isArchiveFolderRoot,
@ -348,11 +334,10 @@ export default inject(
getPrimaryLink: filesStore.getPrimaryLink, getPrimaryLink: filesStore.getPrimaryLink,
setExternalLink, setExternalLink,
withPublicRoomBlock, withPublicRoomBlock,
fetchMembers,
fetchMoreMembers, fetchMoreMembers,
membersIsLoading, membersIsLoading,
searchValue, searchValue,
searchResultIsLoading, isMembersPanelUpdating,
}; };
}, },
)( )(

View File

@ -88,7 +88,7 @@ class InfoPanelStore {
infoPanelSelection = null; infoPanelSelection = null;
infoPanelRoom = null; infoPanelRoom = null;
membersIsLoading = false; membersIsLoading = false;
searchResultIsLoading = false; isMembersPanelUpdating = false;
shareChanged = false; shareChanged = false;
@ -128,15 +128,8 @@ class InfoPanelStore {
setShowSearchBlock = (bool) => (this.showSearchBlock = bool); setShowSearchBlock = (bool) => (this.showSearchBlock = bool);
setSearchResultIsLoading = (isLoading) => {
this.searchResultIsLoading = isLoading;
};
setSearchValue = (value) => { setSearchValue = (value) => {
if (value !== this.searchValue) { this.searchValue = value;
this.setSearchResultIsLoading(true);
this.searchValue = value;
}
}; };
resetSearch = () => { resetSearch = () => {
@ -171,6 +164,10 @@ class InfoPanelStore {
this.isScrollLocked = isScrollLocked; this.isScrollLocked = isScrollLocked;
}; };
setIsMembersPanelUpdating = (isMembersPanelUpdating) => {
this.isMembersPanelUpdating = isMembersPanelUpdating;
};
// Selection helpers // // Selection helpers //
get infoPanelSelectedItems() { get infoPanelSelectedItems() {
@ -231,6 +228,10 @@ class InfoPanelStore {
: null; : null;
} }
get isRoomMembersPanelOpen() {
return this.infoPanelSelection?.isRoom && this.roomsView === infoMembers;
}
get withPublicRoomBlock() { get withPublicRoomBlock() {
return ( return (
this.infoPanelCurrentSelection?.access === this.infoPanelCurrentSelection?.access ===
@ -643,7 +644,6 @@ class InfoPanelStore {
const [data, links] = await Promise.all(requests); const [data, links] = await Promise.all(requests);
clearFilter && this.setMembersIsLoading(false); clearFilter && this.setMembersIsLoading(false);
clearTimeout(timerId); clearTimeout(timerId);
this.setSearchResultIsLoading(false);
links && this.publicRoomStore.setExternalLinks(links); links && this.publicRoomStore.setExternalLinks(links);
@ -691,32 +691,21 @@ class InfoPanelStore {
this.setInfoPanelMembers(mergedMembers); this.setInfoPanelMembers(mergedMembers);
}; };
addInfoPanelMembers = (t, members) => { updateInfoPanelMembers = async (t) => {
const convertedMembers = this.convertMembers(t, members); if (
!this.infoPanelSelection ||
if (this.infoPanelMembers) { !this.infoPanelSelection.isRoom ||
const { roomId, administrators, users, expected, groups } = !this.infoPanelSelection.id
this.infoPanelMembers; ) {
return;
const mergedMembers = {
roomId: roomId,
administrators: [...administrators, ...convertedMembers.administrators],
users: [...users, ...convertedMembers.users],
expected: [...expected, ...convertedMembers.expectedMembers],
groups: [...groups, ...convertedMembers.groups],
};
this.addMembersTitle(
t,
mergedMembers.administrators,
mergedMembers.users,
mergedMembers.expected,
mergedMembers.groups,
);
this.filesStore.setInRoomFolder(roomId, true);
this.setInfoPanelMembers(mergedMembers);
} }
this.setIsMembersPanelUpdating(true);
const fetchedMembers = await this.fetchMembers(t, true, !!this.searchValue);
this.setInfoPanelMembers(fetchedMembers);
this.setIsMembersPanelUpdating(false);
}; };
openShareTab = () => { openShareTab = () => {