import { set } from "lodash"; import { observable, action, makeObservable, runInAction, computed } from "mobx"; import { computedFn } from "mobx-utils"; // services import { WorkspaceService } from "@/services/workspace.service"; // types import { RootStore } from "@/store/root.store"; import { IWorkspaceView } from "@plane/types"; export interface IGlobalViewStore { // observables globalViewMap: Record; // computed currentWorkspaceViews: string[] | null; // computed actions getSearchedViews: (searchQuery: string) => string[] | null; getViewDetailsById: (viewId: string) => IWorkspaceView | null; // fetch actions fetchAllGlobalViews: (workspaceSlug: string) => Promise; fetchGlobalViewDetails: (workspaceSlug: string, viewId: string) => Promise; // crud actions createGlobalView: (workspaceSlug: string, data: Partial) => Promise; updateGlobalView: (workspaceSlug: string, viewId: string, data: Partial) => Promise; deleteGlobalView: (workspaceSlug: string, viewId: string) => Promise; } export class GlobalViewStore implements IGlobalViewStore { // observables globalViewMap: Record = {}; // root store rootStore; // services workspaceService; constructor(_rootStore: RootStore) { makeObservable(this, { // observables globalViewMap: observable, // computed currentWorkspaceViews: computed, // actions fetchAllGlobalViews: action, fetchGlobalViewDetails: action, createGlobalView: action, updateGlobalView: action, deleteGlobalView: action, }); // root store this.rootStore = _rootStore; // services this.workspaceService = new WorkspaceService(); } /** * @description returns list of views for current workspace */ get currentWorkspaceViews() { const currentWorkspaceDetails = this.rootStore.workspaceRoot.currentWorkspace; if (!currentWorkspaceDetails) return null; return ( Object.keys(this.globalViewMap ?? {})?.filter( (viewId) => this.globalViewMap[viewId]?.workspace === currentWorkspaceDetails.id ) ?? null ); } /** * @description returns list of views for current workspace based on search query * @param searchQuery * @returns */ getSearchedViews = computedFn((searchQuery: string) => { const currentWorkspaceDetails = this.rootStore.workspaceRoot.currentWorkspace; if (!currentWorkspaceDetails) return null; return ( Object.keys(this.globalViewMap ?? {})?.filter( (viewId) => this.globalViewMap[viewId]?.workspace === currentWorkspaceDetails.id && this.globalViewMap[viewId]?.name?.toLowerCase().includes(searchQuery.toLowerCase()) ) ?? null ); }); /** * @description returns view details for given viewId * @param viewId */ getViewDetailsById = computedFn((viewId: string): IWorkspaceView | null => this.globalViewMap[viewId] ?? null); /** * @description fetch all global views for given workspace * @param workspaceSlug */ fetchAllGlobalViews = async (workspaceSlug: string): Promise => await this.workspaceService.getAllViews(workspaceSlug).then((response) => { runInAction(() => { response.forEach((view) => { set(this.globalViewMap, view.id, view); }); }); return response; }); /** * @description fetch view details for given viewId * @param viewId */ fetchGlobalViewDetails = async (workspaceSlug: string, viewId: string): Promise => await this.workspaceService.getViewDetails(workspaceSlug, viewId).then((response) => { runInAction(() => { set(this.globalViewMap, viewId, response); }); return response; }); /** * @description create new global view * @param workspaceSlug * @param data */ createGlobalView = async (workspaceSlug: string, data: Partial): Promise => await this.workspaceService.createView(workspaceSlug, data).then((response) => { runInAction(() => { set(this.globalViewMap, response.id, response); }); return response; }); /** * @description update global view * @param workspaceSlug * @param viewId * @param data */ updateGlobalView = async ( workspaceSlug: string, viewId: string, data: Partial ): Promise => await this.workspaceService.updateView(workspaceSlug, viewId, data).then((response) => { const viewToUpdate = { ...this.getViewDetailsById(viewId), ...data }; runInAction(() => { set(this.globalViewMap, viewId, viewToUpdate); }); return response; }); /** * @description delete global view * @param workspaceSlug * @param viewId */ deleteGlobalView = async (workspaceSlug: string, viewId: string): Promise => await this.workspaceService.deleteView(workspaceSlug, viewId).then(() => { runInAction(() => { delete this.globalViewMap[viewId]; }); }); }