[WEB-4311] fix: membership data handling and state reversal on error (#7205)

This commit is contained in:
Prateek Shourya 2025-06-16 14:02:47 +05:30 committed by GitHub
parent 0fa9c8b015
commit cf595de7c7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 16 additions and 10 deletions

View file

@ -273,7 +273,7 @@ export abstract class BaseProjectMemberStore implements IBaseProjectMemberStore
if (!memberDetails || !memberDetails?.id) throw new Error("Member not found"); if (!memberDetails || !memberDetails?.id) throw new Error("Member not found");
// original data to revert back in case of error // original data to revert back in case of error
const isCurrentUser = this.rootStore.user.data?.id === userId; const isCurrentUser = this.rootStore.user.data?.id === userId;
const membershipBeforeUpdate = this.getProjectMembershipByUserId(userId, projectId); const membershipBeforeUpdate = { ...this.getProjectMembershipByUserId(userId, projectId) };
const permissionBeforeUpdate = isCurrentUser const permissionBeforeUpdate = isCurrentUser
? this.rootStore.user.permission.getProjectRoleByWorkspaceSlugAndProjectId(workspaceSlug, projectId) ? this.rootStore.user.permission.getProjectRoleByWorkspaceSlugAndProjectId(workspaceSlug, projectId)
: undefined; : undefined;

View file

@ -30,6 +30,7 @@ export interface IWorkspaceMemberStore {
workspaceMemberInvitationIds: string[] | null; workspaceMemberInvitationIds: string[] | null;
memberMap: Record<string, IWorkspaceMembership> | null; memberMap: Record<string, IWorkspaceMembership> | null;
// computed actions // computed actions
getWorkspaceMemberIds: (workspaceSlug: string) => string[];
getSearchedWorkspaceMemberIds: (searchQuery: string) => string[] | null; getSearchedWorkspaceMemberIds: (searchQuery: string) => string[] | null;
getSearchedWorkspaceInvitationIds: (searchQuery: string) => string[] | null; getSearchedWorkspaceInvitationIds: (searchQuery: string) => string[] | null;
getWorkspaceMemberDetails: (workspaceMemberId: string) => IWorkspaceMember | null; getWorkspaceMemberDetails: (workspaceMemberId: string) => IWorkspaceMember | null;
@ -95,14 +96,8 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
get workspaceMemberIds() { get workspaceMemberIds() {
const workspaceSlug = this.routerStore.workspaceSlug; const workspaceSlug = this.routerStore.workspaceSlug;
if (!workspaceSlug) return null; if (!workspaceSlug) return null;
let members = Object.values(this.workspaceMemberMap?.[workspaceSlug] ?? {});
members = sortBy(members, [ return this.getWorkspaceMemberIds(workspaceSlug);
(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;
} }
get memberMap() { get memberMap() {
@ -117,6 +112,17 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
return this.workspaceMemberInvitations?.[workspaceSlug]?.map((inv) => inv.id); 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 * @description get the list of all the user ids that match the search query of all the members of the current workspace
* @param searchQuery * @param searchQuery
@ -217,7 +223,7 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
const memberDetails = this.getWorkspaceMemberDetails(userId); const memberDetails = this.getWorkspaceMemberDetails(userId);
if (!memberDetails) throw new Error("Member not found"); if (!memberDetails) throw new Error("Member not found");
// original data to revert back in case of error // original data to revert back in case of error
const originalProjectMemberData = this.workspaceMemberMap?.[workspaceSlug]?.[userId]; const originalProjectMemberData = { ...this.workspaceMemberMap?.[workspaceSlug]?.[userId] };
try { try {
runInAction(() => { runInAction(() => {
set(this.workspaceMemberMap, [workspaceSlug, userId, "role"], data.role); set(this.workspaceMemberMap, [workspaceSlug, userId, "role"], data.role);