plane/web/store/member/project-member.store.ts

101 lines
2.7 KiB
TypeScript
Raw Normal View History

2023-12-15 12:32:15 +00:00
import { action, computed, makeObservable, observable, runInAction } from "mobx";
import { set } from "lodash";
// services
import { ProjectMemberService } from "services/project";
// types
import { RootStore } from "store/root.store";
import { IProjectMember, IUserLite } from "types";
// constants
import { EUserProjectRoles } from "constants/project";
interface IProjectMemberDetails {
id: string;
member: IUserLite;
role: EUserProjectRoles;
}
export interface IProjectMemberStore {
// observables
projectMemberMap: {
[projectId: string]: Record<string, IProjectMember>;
};
// computed
projectMembers: string[] | null;
// computed actions
getProjectMemberDetails: (projectMemberId: string) => IProjectMemberDetails | null;
// actions
fetchProjectMembers: (workspaceSlug: string, projectId: string) => Promise<IProjectMember[]>;
}
export class ProjectMemberStore implements IProjectMemberStore {
// observables
projectMemberMap: {
[projectId: string]: Record<string, IProjectMember>;
} = {};
// root store
rootStore: RootStore;
// root store memberMap
memberMap: Record<string, IUserLite> = {};
// services
projectMemberService;
constructor(_rootStore: RootStore) {
makeObservable(this, {
// observables
projectMemberMap: observable,
// computed
projectMembers: computed,
// computed actions
getProjectMemberDetails: action,
// actions
fetchProjectMembers: action,
});
// root store
this.rootStore = _rootStore;
2023-12-18 07:01:57 +00:00
this.memberMap = this.rootStore.memberRoot?.memberMap;
2023-12-15 12:32:15 +00:00
// services
this.projectMemberService = new ProjectMemberService();
}
get projectMembers() {
const projectId = this.rootStore.app.router.projectId;
if (!projectId) return null;
return Object.keys(this.projectMemberMap?.[projectId] ?? {});
}
getProjectMemberDetails = (projectMemberId: string) => {
const projectId = this.rootStore.app.router.projectId;
if (!projectId) return null;
const projectMember = this.projectMemberMap?.[projectId]?.[projectMemberId];
const memberDetails: IProjectMemberDetails = {
id: projectMember.id,
role: projectMember.role,
member: this.memberMap?.[projectMember.member],
};
return memberDetails;
};
fetchProjectMembers = async (workspaceSlug: string, projectId: string) => {
try {
const response = await this.projectMemberService.fetchProjectMembers(workspaceSlug, projectId);
runInAction(() => {
response.forEach((member) => {
set(this.projectMemberMap, [projectId, member.member], member);
});
});
return response;
} catch (error) {
throw error;
}
};
}