/** * Copyright (c) 2023-present Plane Software, Inc. and contributors * SPDX-License-Identifier: AGPL-3.0-only * See the LICENSE file for details. */ import { set } from "lodash-es"; import { action, computed, makeObservable, observable, runInAction } from "mobx"; // plane imports import { SitesModuleService } from "@plane/services"; // types import type { TPublicModule } from "@/types/modules"; // root store import type { RootStore } from "./root.store"; export interface IIssueModuleStore { // observables modules: TPublicModule[] | undefined; // computed actions getModuleById: (moduleId: string | undefined) => TPublicModule | undefined; getModulesByIds: (moduleIds: string[]) => TPublicModule[]; // fetch actions fetchModules: (anchor: string) => Promise; } export class ModuleStore implements IIssueModuleStore { moduleMap: Record = {}; moduleService: SitesModuleService; rootStore: RootStore; constructor(_rootStore: RootStore) { makeObservable(this, { // observables moduleMap: observable, // computed modules: computed, // fetch action fetchModules: action, }); this.moduleService = new SitesModuleService(); this.rootStore = _rootStore; } get modules() { return Object.values(this.moduleMap); } getModuleById = (moduleId: string | undefined) => (moduleId ? this.moduleMap[moduleId] : undefined); getModulesByIds = (moduleIds: string[]) => { const currModules = []; for (const moduleId of moduleIds) { const issueModule = this.getModuleById(moduleId); if (issueModule) { currModules.push(issueModule); } } return currModules; }; fetchModules = async (anchor: string) => { try { const modulesResponse = await this.moduleService.list(anchor); runInAction(() => { this.moduleMap = {}; for (const issueModule of modulesResponse) { set(this.moduleMap, [issueModule.id], issueModule); } }); return modulesResponse; } catch (error) { console.error("Failed to fetch members:", error); return []; } }; }