memos/web/src/store/v2/workspace.ts

106 lines
3.5 KiB
TypeScript

import { uniqBy } from "lodash-es";
import { makeAutoObservable } from "mobx";
import { workspaceServiceClient, workspaceSettingServiceClient } from "@/grpcweb";
import { WorkspaceProfile } from "@/types/proto/api/v1/workspace_service";
import { WorkspaceGeneralSetting, WorkspaceMemoRelatedSetting, WorkspaceSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { isValidateLocale } from "@/utils/i18n";
import { workspaceSettingNamePrefix } from "../common";
export enum WorkspaceSettingKey {
/** BASIC - BASIC is the key for basic settings. */
BASIC = "BASIC",
/** GENERAL - GENERAL is the key for general settings. */
GENERAL = "GENERAL",
/** STORAGE - STORAGE is the key for storage settings. */
STORAGE = "STORAGE",
/** MEMO_RELATED - MEMO_RELATED is the key for memo related settings. */
MEMO_RELATED = "MEMO_RELATED",
}
class LocalState {
locale: string = "en";
appearance: string = "system";
profile: WorkspaceProfile = WorkspaceProfile.fromPartial({});
settings: WorkspaceSetting[] = [];
get generalSetting() {
return (
this.settings.find((setting) => setting.name === `${workspaceSettingNamePrefix}${WorkspaceSettingKey.GENERAL}`)?.generalSetting ||
WorkspaceGeneralSetting.fromPartial({})
);
}
get memoRelatedSetting() {
return (
this.settings.find((setting) => setting.name === `${workspaceSettingNamePrefix}${WorkspaceSettingKey.MEMO_RELATED}`)
?.memoRelatedSetting || WorkspaceMemoRelatedSetting.fromPartial({})
);
}
constructor() {
makeAutoObservable(this);
}
setPartial(partial: Partial<LocalState>) {
const finalState = {
...this,
...partial,
};
if (!isValidateLocale(finalState.locale)) {
finalState.locale = "en";
}
if (!["system", "light", "dark"].includes(finalState.appearance)) {
finalState.appearance = "system";
}
Object.assign(this, finalState);
}
}
const workspaceStore = (() => {
const state = new LocalState();
const fetchWorkspaceSetting = async (settingKey: WorkspaceSettingKey) => {
const setting = await workspaceSettingServiceClient.getWorkspaceSetting({ name: `${workspaceSettingNamePrefix}${settingKey}` });
state.setPartial({
settings: uniqBy([setting, ...state.settings], "name"),
});
};
const upsertWorkspaceSetting = async (setting: WorkspaceSetting) => {
await workspaceSettingServiceClient.setWorkspaceSetting({ setting });
state.setPartial({
settings: uniqBy([setting, ...state.settings], "name"),
});
};
const getWorkspaceSettingByKey = (settingKey: WorkspaceSettingKey) => {
return (
state.settings.find((setting) => setting.name === `${workspaceSettingNamePrefix}${settingKey}`) || WorkspaceSetting.fromPartial({})
);
};
return {
state,
fetchWorkspaceSetting,
upsertWorkspaceSetting,
getWorkspaceSettingByKey,
};
})();
export const initialWorkspaceStore = async () => {
const workspaceProfile = await workspaceServiceClient.getWorkspaceProfile({});
// Prepare workspace settings.
for (const key of [WorkspaceSettingKey.GENERAL, WorkspaceSettingKey.MEMO_RELATED]) {
await workspaceStore.fetchWorkspaceSetting(key);
}
const workspaceGeneralSetting = workspaceStore.state.generalSetting;
workspaceStore.state.setPartial({
locale: workspaceGeneralSetting.customProfile?.locale,
appearance: workspaceGeneralSetting.customProfile?.appearance,
profile: workspaceProfile,
});
};
export default workspaceStore;