mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
setup new store
This commit is contained in:
parent
142d294cc1
commit
eaf6444551
11
web/store/dataMaps/index.ts
Normal file
11
web/store/dataMaps/index.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { IWorkspaceData, WorkspaceData } from "./workspace.data.store";
|
||||||
|
|
||||||
|
export class DataStore {
|
||||||
|
workspaceData: IWorkspaceData;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.workspaceData = new WorkspaceData(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
resetOnSignout() {}
|
||||||
|
}
|
39
web/store/dataMaps/workspace.data.store.ts
Normal file
39
web/store/dataMaps/workspace.data.store.ts
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
import { makeObservable, observable } from "mobx";
|
||||||
|
import { WorkspaceModel } from "store/workspace.model";
|
||||||
|
import { DataStore } from ".";
|
||||||
|
import { IWorkspace } from "@plane/types";
|
||||||
|
import { set } from "lodash";
|
||||||
|
|
||||||
|
export interface IWorkspaceData {
|
||||||
|
workspaceMap: Record<string, WorkspaceModel>;
|
||||||
|
|
||||||
|
addWorkspaces: (workspaces: IWorkspace[]) => void;
|
||||||
|
deleteWorkspace: (workspaceId: string) => void;
|
||||||
|
getWorkspacebyId: (workspaceId: string) => WorkspaceModel | undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class WorkspaceData implements IWorkspaceData {
|
||||||
|
workspaceMap: Record<string, WorkspaceModel> = {};
|
||||||
|
|
||||||
|
// data store
|
||||||
|
dataStore;
|
||||||
|
|
||||||
|
constructor(_dataStore: DataStore) {
|
||||||
|
makeObservable(this, {
|
||||||
|
workspaceMap: observable,
|
||||||
|
});
|
||||||
|
this.dataStore = _dataStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
addWorkspaces = (workspaces: IWorkspace[]) => {
|
||||||
|
workspaces.forEach((workspace) => {
|
||||||
|
set(this.workspaceMap, [workspace.id], new WorkspaceModel(workspace, this.dataStore));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
deleteWorkspace = (workspaceId: string) => {
|
||||||
|
delete this.workspaceMap[workspaceId];
|
||||||
|
};
|
||||||
|
|
||||||
|
getWorkspacebyId = (workspaceId: string) => this.workspaceMap[workspaceId];
|
||||||
|
}
|
16
web/store/root.store.ts
Normal file
16
web/store/root.store.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { DataStore } from "./dataMaps";
|
||||||
|
import { IUserModel, UserModel } from "./user.model";
|
||||||
|
|
||||||
|
export class RootStore {
|
||||||
|
data: DataStore;
|
||||||
|
|
||||||
|
user: IUserModel;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.data = new DataStore();
|
||||||
|
|
||||||
|
this.user = new UserModel(this.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
resetOnSignout() {}
|
||||||
|
}
|
76
web/store/user.model.ts
Normal file
76
web/store/user.model.ts
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import { makeObservable, observable, runInAction } from "mobx";
|
||||||
|
import { WorkspaceService } from "services/workspace.service";
|
||||||
|
import set from "lodash/set";
|
||||||
|
import { IWorkspace } from "@plane/types";
|
||||||
|
import { DataStore } from "./dataMaps";
|
||||||
|
import { IWorkspaceModel } from "./workspace.model";
|
||||||
|
|
||||||
|
export interface IUserModel {
|
||||||
|
workspaces: Record<string, IWorkspaceModel>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class UserModel implements IUserModel {
|
||||||
|
workspaces: Record<string, IWorkspaceModel> = {};
|
||||||
|
|
||||||
|
// data store
|
||||||
|
dataStore;
|
||||||
|
// services
|
||||||
|
workspaceService;
|
||||||
|
|
||||||
|
constructor(_dataStore: DataStore) {
|
||||||
|
makeObservable(this, {
|
||||||
|
workspaces: observable,
|
||||||
|
});
|
||||||
|
this.dataStore = _dataStore;
|
||||||
|
this.workspaceService = new WorkspaceService();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get workspace info from the array of workspaces in the store using workspace slug
|
||||||
|
* @param workspaceSlug
|
||||||
|
*/
|
||||||
|
getWorkspaceBySlug = (workspaceSlug: string) =>
|
||||||
|
Object.values(this.workspaces ?? {})?.find((w) => w.slug == workspaceSlug) || null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fetch user workspaces from API
|
||||||
|
*/
|
||||||
|
fetchWorkspaces = async () => {
|
||||||
|
const workspaceResponse = await this.workspaceService.userWorkspaces();
|
||||||
|
|
||||||
|
this.dataStore.workspaceData.addWorkspaces(workspaceResponse);
|
||||||
|
runInAction(() => {
|
||||||
|
workspaceResponse.forEach((workspace) => {
|
||||||
|
set(this.workspaces, [workspace.id], this.dataStore.workspaceData.workspaceMap[workspace.id]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return workspaceResponse;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create workspace using the workspace data
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
createWorkspace = async (data: Partial<IWorkspace>) =>
|
||||||
|
await this.workspaceService.createWorkspace(data).then((response) => {
|
||||||
|
this.dataStore.workspaceData.addWorkspaces([response]);
|
||||||
|
runInAction(() => {
|
||||||
|
set(this.workspaces, [response.id], this.dataStore.workspaceData.workspaceMap[response.id]);
|
||||||
|
});
|
||||||
|
return response;
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* delete workspace using the workspace slug
|
||||||
|
* @param workspaceSlug
|
||||||
|
*/
|
||||||
|
deleteWorkspace = async (workspaceSlug: string) =>
|
||||||
|
await this.workspaceService.deleteWorkspace(workspaceSlug).then(() => {
|
||||||
|
const updatedWorkspacesList = this.workspaces;
|
||||||
|
const workspaceId = this.getWorkspaceBySlug(workspaceSlug)?.id;
|
||||||
|
this.dataStore.workspaceData.deleteWorkspace(`${workspaceId}`);
|
||||||
|
runInAction(() => {
|
||||||
|
delete updatedWorkspacesList[`${workspaceId}`];
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
61
web/store/workspace.model.ts
Normal file
61
web/store/workspace.model.ts
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
import { makeObservable, observable } from "mobx";
|
||||||
|
import { IUser, IWorkspace } from "@plane/types";
|
||||||
|
import { DataStore } from "./dataMaps";
|
||||||
|
|
||||||
|
export interface IWorkspaceModel {
|
||||||
|
id: string;
|
||||||
|
owner: IUser;
|
||||||
|
created_at: Date;
|
||||||
|
updated_at: Date;
|
||||||
|
name: string;
|
||||||
|
url: string;
|
||||||
|
logo: string | null;
|
||||||
|
total_members: number;
|
||||||
|
slug: string;
|
||||||
|
created_by: string;
|
||||||
|
updated_by: string;
|
||||||
|
organization_size: string;
|
||||||
|
total_issues: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class WorkspaceModel implements IWorkspaceModel {
|
||||||
|
id: string;
|
||||||
|
owner: IUser;
|
||||||
|
created_at: Date;
|
||||||
|
updated_at: Date;
|
||||||
|
name: string;
|
||||||
|
url: string;
|
||||||
|
logo: string | null;
|
||||||
|
total_members: number;
|
||||||
|
slug: string;
|
||||||
|
created_by: string;
|
||||||
|
updated_by: string;
|
||||||
|
organization_size: string;
|
||||||
|
total_issues: number;
|
||||||
|
|
||||||
|
// root store
|
||||||
|
dataStore;
|
||||||
|
|
||||||
|
constructor(workspace: IWorkspace, _dataStore: DataStore) {
|
||||||
|
makeObservable(this, {
|
||||||
|
name: observable.ref,
|
||||||
|
url: observable.ref,
|
||||||
|
logo: observable.ref,
|
||||||
|
});
|
||||||
|
this.dataStore = _dataStore;
|
||||||
|
|
||||||
|
this.id = workspace.id;
|
||||||
|
this.owner = workspace.owner;
|
||||||
|
this.created_at = workspace.created_at;
|
||||||
|
this.updated_at = workspace.updated_at;
|
||||||
|
this.name = workspace.name;
|
||||||
|
this.url = workspace.url;
|
||||||
|
this.logo = workspace.logo;
|
||||||
|
this.total_members = workspace.total_members;
|
||||||
|
this.slug = workspace.slug;
|
||||||
|
this.created_by = workspace.created_by;
|
||||||
|
this.updated_by = workspace.updated_by;
|
||||||
|
this.organization_size = workspace.organization_size;
|
||||||
|
this.total_issues = workspace.total_issues;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user