import { observable, action, makeObservable, runInAction } from "mobx"; // types import { IInstance } 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 { // issues isLoading: boolean; data: IInstance | NonNullable; config: Record; error: TError | undefined; // action fetchInstanceInfo: () => Promise; hydrate: (data: Record, config: Record) => void; } export class InstanceStore implements IInstanceStore { isLoading: boolean = true; data: IInstance | Record = {}; config: Record = {}; error: TError | undefined = undefined; // services instanceService; constructor(private store: RootStore) { makeObservable(this, { // observable isLoading: observable.ref, data: observable, config: observable, error: observable, // actions fetchInstanceInfo: action, hydrate: action, }); // services this.instanceService = new InstanceService(); } hydrate = (data: Record, config: Record) => { this.data = { ...this.data, ...data }; this.config = { ...this.config, ...config }; }; /** * @description fetching instance information */ fetchInstanceInfo = async () => { try { this.isLoading = true; this.error = undefined; const instanceDetails = await this.instanceService.getInstanceInfo(); runInAction(() => { this.isLoading = false; this.data = instanceDetails.instance; this.config = instanceDetails.config; }); } catch (error) { runInAction(() => { this.isLoading = false; this.error = { status: "error", message: "Failed to fetch instance info", }; }); } }; }