[WEB-4959]chore: refactor project member page #8464
This commit is contained in:
parent
031baaa162
commit
c97e418515
15 changed files with 85 additions and 51 deletions
|
|
@ -81,6 +81,7 @@ export interface IBaseProjectMemberStore {
|
|||
role: EUserProjectRoles
|
||||
) => Promise<TProjectMembership>;
|
||||
removeMemberFromProject: (workspaceSlug: string, projectId: string, userId: string) => Promise<void>;
|
||||
mutateProjectMembersActivity: (workspaceSlug: string, projectId: string) => Promise<void>;
|
||||
}
|
||||
|
||||
export abstract class BaseProjectMemberStore implements IBaseProjectMemberStore {
|
||||
|
|
@ -315,13 +316,13 @@ export abstract class BaseProjectMemberStore implements IBaseProjectMemberStore
|
|||
});
|
||||
});
|
||||
});
|
||||
update(this.projectRoot.projectMap, [projectId, "members"], (memberIds) =>
|
||||
update(this.projectRoot.projectMap, [projectId, "members"], (memberIds: string[]) =>
|
||||
uniq([...memberIds, ...data.members.map((m) => m.member_id)])
|
||||
);
|
||||
this.projectRoot.projectMap[projectId].members = this.projectRoot.projectMap?.[projectId]?.members?.concat(
|
||||
data.members.map((m) => m.member_id)
|
||||
);
|
||||
|
||||
void this.mutateProjectMembersActivity(workspaceSlug, projectId);
|
||||
return response;
|
||||
});
|
||||
|
||||
|
|
@ -375,6 +376,7 @@ export abstract class BaseProjectMemberStore implements IBaseProjectMemberStore
|
|||
role,
|
||||
}
|
||||
);
|
||||
void this.mutateProjectMembersActivity(workspaceSlug, projectId);
|
||||
return response;
|
||||
} catch (error) {
|
||||
// revert back to original members in case of error
|
||||
|
|
@ -429,11 +431,11 @@ export abstract class BaseProjectMemberStore implements IBaseProjectMemberStore
|
|||
removeMemberFromProject = async (workspaceSlug: string, projectId: string, userId: string) => {
|
||||
const memberDetails = this.getProjectMemberDetails(userId, projectId);
|
||||
if (!memberDetails || !memberDetails?.id) throw new Error("Member not found");
|
||||
await this.projectMemberService.deleteProjectMember(workspaceSlug, projectId, memberDetails?.id).then(() => {
|
||||
runInAction(() => {
|
||||
this.processMemberRemoval(projectId, userId);
|
||||
});
|
||||
await this.projectMemberService.deleteProjectMember(workspaceSlug, projectId, memberDetails?.id);
|
||||
runInAction(() => {
|
||||
this.processMemberRemoval(projectId, userId);
|
||||
});
|
||||
void this.mutateProjectMembersActivity(workspaceSlug, projectId);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -501,4 +503,11 @@ export abstract class BaseProjectMemberStore implements IBaseProjectMemberStore
|
|||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Mutate project members activity
|
||||
* @param workspaceSlug
|
||||
* @param projectId
|
||||
*/
|
||||
abstract mutateProjectMembersActivity(workspaceSlug: string, projectId: string): Promise<void>;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,14 +4,14 @@ import { computedFn } from "mobx-utils";
|
|||
// types
|
||||
import type { EUserPermissions } from "@plane/constants";
|
||||
import type { IWorkspaceBulkInviteFormData, IWorkspaceMember, IWorkspaceMemberInvitation } from "@plane/types";
|
||||
// plane-web constants
|
||||
// plane-web imports
|
||||
import type { RootStore } from "@/plane-web/store/root.store";
|
||||
// services
|
||||
import { WorkspaceService } from "@/plane-web/services";
|
||||
// types
|
||||
import type { IRouterStore } from "@/store/router.store";
|
||||
import type { IUserStore } from "@/store/user";
|
||||
// store
|
||||
import type { CoreRootStore } from "../../root.store";
|
||||
import type { IMemberRootStore } from "../index.ts";
|
||||
import type { IWorkspaceMemberFiltersStore } from "./workspace-member-filters.store";
|
||||
import { WorkspaceMemberFiltersStore } from "./workspace-member-filters.store";
|
||||
|
|
@ -69,10 +69,11 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
|
|||
routerStore: IRouterStore;
|
||||
userStore: IUserStore;
|
||||
memberRoot: IMemberRootStore;
|
||||
rootStore: RootStore;
|
||||
// services
|
||||
workspaceService;
|
||||
|
||||
constructor(_memberRoot: IMemberRootStore, _rootStore: CoreRootStore) {
|
||||
constructor(_memberRoot: IMemberRootStore, _rootStore: RootStore) {
|
||||
makeObservable(this, {
|
||||
// observables
|
||||
workspaceMemberMap: observable,
|
||||
|
|
@ -95,6 +96,7 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
|
|||
this.routerStore = _rootStore.router;
|
||||
this.userStore = _rootStore.user;
|
||||
this.memberRoot = _memberRoot;
|
||||
this.rootStore = _rootStore;
|
||||
// services
|
||||
this.workspaceService = new WorkspaceService();
|
||||
}
|
||||
|
|
@ -259,6 +261,7 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
|
|||
set(this.workspaceMemberMap, [workspaceSlug, userId, "role"], data.role);
|
||||
});
|
||||
await this.workspaceService.updateWorkspaceMember(workspaceSlug, memberDetails.id, data);
|
||||
void this.rootStore.workspaceRoot.mutateWorkspaceMembersActivity(workspaceSlug);
|
||||
} catch (error) {
|
||||
// revert back to original members in case of error
|
||||
runInAction(() => {
|
||||
|
|
@ -276,11 +279,11 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
|
|||
removeMemberFromWorkspace = async (workspaceSlug: string, userId: string) => {
|
||||
const memberDetails = this.getWorkspaceMemberDetails(userId);
|
||||
if (!memberDetails) throw new Error("Member not found");
|
||||
await this.workspaceService.deleteWorkspaceMember(workspaceSlug, memberDetails?.id).then(() => {
|
||||
runInAction(() => {
|
||||
set(this.workspaceMemberMap, [workspaceSlug, userId, "is_active"], false);
|
||||
});
|
||||
await this.workspaceService.deleteWorkspaceMember(workspaceSlug, memberDetails?.id);
|
||||
runInAction(() => {
|
||||
set(this.workspaceMemberMap, [workspaceSlug, userId, "is_active"], false);
|
||||
});
|
||||
void this.rootStore.workspaceRoot.mutateWorkspaceMembersActivity(workspaceSlug);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -301,9 +304,9 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
|
|||
* @param data
|
||||
*/
|
||||
inviteMembersToWorkspace = async (workspaceSlug: string, data: IWorkspaceBulkInviteFormData) => {
|
||||
const response = await this.workspaceService.inviteWorkspace(workspaceSlug, data);
|
||||
await this.workspaceService.inviteWorkspace(workspaceSlug, data);
|
||||
await this.fetchWorkspaceMemberInvitations(workspaceSlug);
|
||||
return response;
|
||||
void this.rootStore.workspaceRoot.mutateWorkspaceMembersActivity(workspaceSlug);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -317,7 +320,7 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
|
|||
invitationId: string,
|
||||
data: Partial<IWorkspaceMemberInvitation>
|
||||
) => {
|
||||
const originalMemberInvitations = [...this.workspaceMemberInvitations?.[workspaceSlug]]; // in case of error, we will revert back to original members
|
||||
const originalMemberInvitations = [...(this.workspaceMemberInvitations?.[workspaceSlug] ?? [])]; // in case of error, we will revert back to original members
|
||||
try {
|
||||
const memberInvitations = originalMemberInvitations?.map((invitation) => ({
|
||||
...invitation,
|
||||
|
|
@ -342,14 +345,15 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
|
|||
* @param workspaceSlug
|
||||
* @param memberId
|
||||
*/
|
||||
deleteMemberInvitation = async (workspaceSlug: string, invitationId: string) =>
|
||||
await this.workspaceService.deleteWorkspaceInvitations(workspaceSlug.toString(), invitationId).then(() => {
|
||||
runInAction(() => {
|
||||
this.workspaceMemberInvitations[workspaceSlug] = this.workspaceMemberInvitations[workspaceSlug].filter(
|
||||
(inv) => inv.id !== invitationId
|
||||
);
|
||||
});
|
||||
deleteMemberInvitation = async (workspaceSlug: string, invitationId: string) => {
|
||||
await this.workspaceService.deleteWorkspaceInvitations(workspaceSlug.toString(), invitationId);
|
||||
runInAction(() => {
|
||||
this.workspaceMemberInvitations[workspaceSlug] = this.workspaceMemberInvitations[workspaceSlug].filter(
|
||||
(inv) => inv.id !== invitationId
|
||||
);
|
||||
});
|
||||
void this.rootStore.workspaceRoot.mutateWorkspaceMembersActivity(workspaceSlug);
|
||||
};
|
||||
|
||||
isUserSuspended = computedFn((userId: string, workspaceSlug: string) => {
|
||||
if (!workspaceSlug) return false;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue