From cf595de7c74b05240ea55f564fa4439c6c95fe52 Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Mon, 16 Jun 2025 14:02:47 +0530 Subject: [PATCH] [WEB-4311] fix: membership data handling and state reversal on error (#7205) --- .../store/member/base-project-member.store.ts | 2 +- .../store/member/workspace-member.store.ts | 24 ++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/web/core/store/member/base-project-member.store.ts b/web/core/store/member/base-project-member.store.ts index 40047b065c..ceba44c9e5 100644 --- a/web/core/store/member/base-project-member.store.ts +++ b/web/core/store/member/base-project-member.store.ts @@ -273,7 +273,7 @@ export abstract class BaseProjectMemberStore implements IBaseProjectMemberStore if (!memberDetails || !memberDetails?.id) throw new Error("Member not found"); // original data to revert back in case of error const isCurrentUser = this.rootStore.user.data?.id === userId; - const membershipBeforeUpdate = this.getProjectMembershipByUserId(userId, projectId); + const membershipBeforeUpdate = { ...this.getProjectMembershipByUserId(userId, projectId) }; const permissionBeforeUpdate = isCurrentUser ? this.rootStore.user.permission.getProjectRoleByWorkspaceSlugAndProjectId(workspaceSlug, projectId) : undefined; diff --git a/web/core/store/member/workspace-member.store.ts b/web/core/store/member/workspace-member.store.ts index e45c2d5c2c..a4a5b1f1ce 100644 --- a/web/core/store/member/workspace-member.store.ts +++ b/web/core/store/member/workspace-member.store.ts @@ -30,6 +30,7 @@ export interface IWorkspaceMemberStore { workspaceMemberInvitationIds: string[] | null; memberMap: Record | null; // computed actions + getWorkspaceMemberIds: (workspaceSlug: string) => string[]; getSearchedWorkspaceMemberIds: (searchQuery: string) => string[] | null; getSearchedWorkspaceInvitationIds: (searchQuery: string) => string[] | null; getWorkspaceMemberDetails: (workspaceMemberId: string) => IWorkspaceMember | null; @@ -95,14 +96,8 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore { get workspaceMemberIds() { const workspaceSlug = this.routerStore.workspaceSlug; if (!workspaceSlug) return null; - let members = Object.values(this.workspaceMemberMap?.[workspaceSlug] ?? {}); - members = sortBy(members, [ - (m) => m.member !== this.userStore?.data?.id, - (m) => this.memberRoot?.memberMap?.[m.member]?.display_name?.toLowerCase(), - ]); - //filter out bots - const memberIds = members.filter((m) => !this.memberRoot?.memberMap?.[m.member]?.is_bot).map((m) => m.member); - return memberIds; + + return this.getWorkspaceMemberIds(workspaceSlug); } get memberMap() { @@ -117,6 +112,17 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore { return this.workspaceMemberInvitations?.[workspaceSlug]?.map((inv) => inv.id); } + getWorkspaceMemberIds = computedFn((workspaceSlug: string) => { + let members = Object.values(this.workspaceMemberMap?.[workspaceSlug] ?? {}); + members = sortBy(members, [ + (m) => m.member !== this.userStore?.data?.id, + (m) => this.memberRoot?.memberMap?.[m.member]?.display_name?.toLowerCase(), + ]); + //filter out bots + const memberIds = members.filter((m) => !this.memberRoot?.memberMap?.[m.member]?.is_bot).map((m) => m.member); + return memberIds; + }); + /** * @description get the list of all the user ids that match the search query of all the members of the current workspace * @param searchQuery @@ -217,7 +223,7 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore { const memberDetails = this.getWorkspaceMemberDetails(userId); if (!memberDetails) throw new Error("Member not found"); // original data to revert back in case of error - const originalProjectMemberData = this.workspaceMemberMap?.[workspaceSlug]?.[userId]; + const originalProjectMemberData = { ...this.workspaceMemberMap?.[workspaceSlug]?.[userId] }; try { runInAction(() => { set(this.workspaceMemberMap, [workspaceSlug, userId, "role"], data.role);