import set from "lodash/set"; import { observable, action, makeObservable, runInAction } from "mobx"; // types import { IInstance, IInstanceConfig } from "@plane/types"; // services import { InstanceService } from "@/services/instance.service"; // store types import { RootStore } from "@/store/root.store"; type TError = { status: string; message: string; data?: { is_activated: boolean; is_setup_done: boolean; }; }; export interface IInstanceStore { // observables isLoading: boolean; instance: IInstance | undefined; config: IInstanceConfig | undefined; error: TError | undefined; // action fetchInstanceInfo: () => Promise; hydrate: (data: IInstance) => void; } export class InstanceStore implements IInstanceStore { isLoading: boolean = true; instance: IInstance | undefined = undefined; config: IInstanceConfig | undefined = undefined; error: TError | undefined = undefined; // services instanceService; constructor(private store: RootStore) { makeObservable(this, { // observable isLoading: observable.ref, instance: observable, config: observable, error: observable, // actions fetchInstanceInfo: action, hydrate: action, }); // services this.instanceService = new InstanceService(); } hydrate = (data: IInstance) => set(this, "instance", data); /** * @description fetching instance information */ fetchInstanceInfo = async () => { try { this.isLoading = true; this.error = undefined; const instanceInfo = await this.instanceService.getInstanceInfo(); runInAction(() => { this.isLoading = false; this.instance = instanceInfo.instance; this.config = instanceInfo.config; }); } catch (error) { runInAction(() => { this.isLoading = false; this.error = { status: "error", message: "Failed to fetch instance info", }; }); } }; }