chore: store implementation for workspace user projects role

This commit is contained in:
gurusainath 2023-12-07 18:48:10 +05:30
parent 69b716ab5c
commit b0b25de07a
6 changed files with 60 additions and 3 deletions

View File

@ -27,8 +27,11 @@ export const ProfileIssuesPage = observer((props: IProfileIssuesPage) => {
const { const {
workspaceProfileIssues: { loader, getIssues, fetchIssues }, workspaceProfileIssues: { loader, getIssues, fetchIssues },
workspaceProfileIssuesFilter: { issueFilters, fetchFilters }, workspaceProfileIssuesFilter: { issueFilters, fetchFilters },
workspaceMember: { currentWorkspaceUserProjectsRole },
}: RootStore = useMobxStore(); }: RootStore = useMobxStore();
console.log("currentWorkspaceUserProjectsRole", currentWorkspaceUserProjectsRole);
useSWR( useSWR(
workspaceSlug && userId ? `CURRENT_WORKSPACE_PROFILE_ISSUES_${workspaceSlug}_${userId}_${type}` : null, workspaceSlug && userId ? `CURRENT_WORKSPACE_PROFILE_ISSUES_${workspaceSlug}_${userId}_${type}` : null,
async () => { async () => {

View File

@ -19,7 +19,7 @@ export const WorkspaceAuthWrapper: FC<IWorkspaceAuthWrapper> = observer((props)
user: { currentWorkspaceMemberInfo, hasPermissionToCurrentWorkspace, fetchUserWorkspaceInfo }, user: { currentWorkspaceMemberInfo, hasPermissionToCurrentWorkspace, fetchUserWorkspaceInfo },
project: { fetchProjects }, project: { fetchProjects },
workspace: { fetchWorkspaceLabels }, workspace: { fetchWorkspaceLabels },
workspaceMember: { fetchWorkspaceMembers }, workspaceMember: { fetchWorkspaceMembers, fetchWorkspaceUserProjectsRole },
} = useMobxStore(); } = useMobxStore();
// router // router
@ -45,6 +45,11 @@ export const WorkspaceAuthWrapper: FC<IWorkspaceAuthWrapper> = observer((props)
workspaceSlug ? `WORKSPACE_LABELS_${workspaceSlug}` : null, workspaceSlug ? `WORKSPACE_LABELS_${workspaceSlug}` : null,
workspaceSlug ? () => fetchWorkspaceLabels(workspaceSlug.toString()) : null workspaceSlug ? () => fetchWorkspaceLabels(workspaceSlug.toString()) : null
); );
// fetch workspace user projects role
useSWR(
workspaceSlug ? `WORKSPACE_PROJECTS_ROLE_${workspaceSlug}` : null,
workspaceSlug ? () => fetchWorkspaceUserProjectsRole(workspaceSlug.toString()) : null
);
// while data is being loaded // while data is being loaded
if (!currentWorkspaceMemberInfo && hasPermissionToCurrentWorkspace === undefined) { if (!currentWorkspaceMemberInfo && hasPermissionToCurrentWorkspace === undefined) {

View File

@ -13,6 +13,7 @@ import {
IProductUpdateResponse, IProductUpdateResponse,
IWorkspaceBulkInviteFormData, IWorkspaceBulkInviteFormData,
IWorkspaceViewProps, IWorkspaceViewProps,
IUserProjectsRole,
} from "types"; } from "types";
import { IWorkspaceView } from "types/workspace-views"; import { IWorkspaceView } from "types/workspace-views";
// store // store
@ -267,4 +268,12 @@ export class WorkspaceService extends APIService {
throw error?.response?.data; throw error?.response?.data;
}); });
} }
async getWorkspaceUserProjectsRole(workspaceSlug: string): Promise<IUserProjectsRole> {
return this.get(`/api/users/me/workspaces/${workspaceSlug}/project-roles/`)
.then((response) => response?.data)
.catch((error) => {
throw error?.response?.data;
});
}
} }

View File

@ -1,7 +1,7 @@
import { action, computed, observable, makeObservable, runInAction } from "mobx"; import { action, computed, observable, makeObservable, runInAction } from "mobx";
import { RootStore } from "../root"; import { RootStore } from "../root";
// types // types
import { IWorkspaceMember, IWorkspaceMemberInvitation, IWorkspaceBulkInviteFormData } from "types"; import { IWorkspaceMember, IWorkspaceMemberInvitation, IWorkspaceBulkInviteFormData, IUserProjectsRole } from "types";
// services // services
import { WorkspaceService } from "services/workspace.service"; import { WorkspaceService } from "services/workspace.service";
@ -13,7 +13,9 @@ export interface IWorkspaceMemberStore {
// observables // observables
members: { [workspaceSlug: string]: IWorkspaceMember[] }; // workspaceSlug: members[] members: { [workspaceSlug: string]: IWorkspaceMember[] }; // workspaceSlug: members[]
memberInvitations: { [workspaceSlug: string]: IWorkspaceMemberInvitation[] }; memberInvitations: { [workspaceSlug: string]: IWorkspaceMemberInvitation[] };
workspaceUserProjectsRole: { [workspaceSlug: string]: IUserProjectsRole } | undefined;
// actions // actions
fetchWorkspaceUserProjectsRole: (workspaceSlug: string) => Promise<IUserProjectsRole>;
fetchWorkspaceMembers: (workspaceSlug: string) => Promise<void>; fetchWorkspaceMembers: (workspaceSlug: string) => Promise<void>;
fetchWorkspaceMemberInvitations: (workspaceSlug: string) => Promise<IWorkspaceMemberInvitation[]>; fetchWorkspaceMemberInvitations: (workspaceSlug: string) => Promise<IWorkspaceMemberInvitation[]>;
updateMember: (workspaceSlug: string, memberId: string, data: Partial<IWorkspaceMember>) => Promise<void>; updateMember: (workspaceSlug: string, memberId: string, data: Partial<IWorkspaceMember>) => Promise<void>;
@ -29,6 +31,7 @@ export interface IWorkspaceMemberStore {
workspaceMembers: IWorkspaceMember[] | null; workspaceMembers: IWorkspaceMember[] | null;
workspaceMemberInvitations: IWorkspaceMemberInvitation[] | null; workspaceMemberInvitations: IWorkspaceMemberInvitation[] | null;
workspaceMembersWithInvitations: any[] | null; workspaceMembersWithInvitations: any[] | null;
currentWorkspaceUserProjectsRole: IUserProjectsRole | undefined;
} }
export class WorkspaceMemberStore implements IWorkspaceMemberStore { export class WorkspaceMemberStore implements IWorkspaceMemberStore {
@ -38,6 +41,7 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
// observables // observables
members: { [workspaceSlug: string]: IWorkspaceMember[] } = {}; members: { [workspaceSlug: string]: IWorkspaceMember[] } = {};
memberInvitations: { [workspaceSlug: string]: IWorkspaceMemberInvitation[] } = {}; memberInvitations: { [workspaceSlug: string]: IWorkspaceMemberInvitation[] } = {};
workspaceUserProjectsRole: { [workspaceSlug: string]: IUserProjectsRole } | undefined = undefined;
// services // services
workspaceService; workspaceService;
// root store // root store
@ -53,6 +57,7 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
members: observable.ref, members: observable.ref,
memberInvitations: observable.ref, memberInvitations: observable.ref,
// actions // actions
fetchWorkspaceUserProjectsRole: action,
fetchWorkspaceMembers: action, fetchWorkspaceMembers: action,
fetchWorkspaceMemberInvitations: action, fetchWorkspaceMemberInvitations: action,
updateMember: action, updateMember: action,
@ -64,6 +69,7 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
workspaceMembers: computed, workspaceMembers: computed,
workspaceMemberInvitations: computed, workspaceMemberInvitations: computed,
workspaceMembersWithInvitations: computed, workspaceMembersWithInvitations: computed,
currentWorkspaceUserProjectsRole: computed,
}); });
this.rootStore = _rootStore; this.rootStore = _rootStore;
@ -126,6 +132,36 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
]; ];
} }
/**
* computed value provides the workspace user projects role
*/
get currentWorkspaceUserProjectsRole() {
if (!this.rootStore.workspace.workspaceSlug) return undefined;
return this.workspaceUserProjectsRole?.[this.rootStore.workspace.workspaceSlug];
}
/**
* fetch workspace user projects role using workspace slug
* @param workspaceSlug
*/
fetchWorkspaceUserProjectsRole = async (workspaceSlug: string) => {
try {
const _workspaceUserProjectsRole = { ...this.workspaceUserProjectsRole };
if (!_workspaceUserProjectsRole[workspaceSlug]) _workspaceUserProjectsRole[workspaceSlug] = {};
const response = await this.workspaceService.getWorkspaceUserProjectsRole(workspaceSlug);
_workspaceUserProjectsRole[workspaceSlug] = response;
runInAction(() => {
this.workspaceUserProjectsRole = _workspaceUserProjectsRole;
});
return response;
} catch (error) {
throw error;
}
};
/** /**
* fetch workspace members using workspace slug * fetch workspace members using workspace slug
* @param workspaceSlug * @param workspaceSlug

View File

@ -162,6 +162,10 @@ export interface IUserProfileProjectSegregation {
}; };
} }
export interface IUserProjectsRole {
[project_id: string]: boolean;
}
// export interface ICurrentUser { // export interface ICurrentUser {
// id: readonly string; // id: readonly string;
// avatar: string; // avatar: string;

View File

@ -2797,7 +2797,7 @@
dependencies: dependencies:
"@types/react" "*" "@types/react" "*"
"@types/react@*", "@types/react@^18.2.39", "@types/react@^18.2.42": "@types/react@*", "@types/react@18.2.42", "@types/react@^18.2.39", "@types/react@^18.2.42":
version "18.2.42" version "18.2.42"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.42.tgz#6f6b11a904f6d96dda3c2920328a97011a00aba7" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.42.tgz#6f6b11a904f6d96dda3c2920328a97011a00aba7"
integrity sha512-c1zEr96MjakLYus/wPnuWDo1/zErfdU9rNsIGmE+NV71nx88FG9Ttgo5dqorXTu/LImX2f63WBP986gJkMPNbA== integrity sha512-c1zEr96MjakLYus/wPnuWDo1/zErfdU9rNsIGmE+NV71nx88FG9Ttgo5dqorXTu/LImX2f63WBP986gJkMPNbA==