);
diff --git a/web/src/store/index.ts b/web/src/store/index.ts
index 90709b18..cc5dd474 100644
--- a/web/src/store/index.ts
+++ b/web/src/store/index.ts
@@ -2,13 +2,11 @@ import { configureStore } from "@reduxjs/toolkit";
import { TypedUseSelectorHook, useDispatch, useSelector } from "react-redux";
import dialogReducer from "./reducer/dialog";
import filterReducer from "./reducer/filter";
-import globalReducer from "./reducer/global";
import resourceReducer from "./reducer/resource";
import tagReducer from "./reducer/tag";
const store = configureStore({
reducer: {
- global: globalReducer,
tag: tagReducer,
filter: filterReducer,
resource: resourceReducer,
diff --git a/web/src/store/module/global.ts b/web/src/store/module/global.ts
deleted file mode 100644
index 7614ebb6..00000000
--- a/web/src/store/module/global.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-import { workspaceServiceClient } from "@/grpcweb";
-import * as api from "@/helpers/api";
-import storage from "@/helpers/storage";
-import i18n from "@/i18n";
-import { WorkspaceProfile } from "@/types/proto/api/v2/workspace_service";
-import { findNearestMatchedLanguage } from "@/utils/i18n";
-import store, { useAppSelector } from "../";
-import { setAppearance, setGlobalState, setLocale } from "../reducer/global";
-
-export const initialGlobalState = async () => {
- const defaultGlobalState = {
- locale: "en" as Locale,
- appearance: "system" as Appearance,
- systemStatus: {
- disablePasswordLogin: false,
- disablePublicMemos: false,
- maxUploadSizeMiB: 0,
- memoDisplayWithUpdatedTs: false,
- customizedProfile: {
- name: "Memos",
- logoUrl: "/logo.webp",
- description: "",
- locale: "en",
- appearance: "system",
- },
- } as SystemStatus,
- workspaceProfile: WorkspaceProfile.fromPartial({}),
- };
-
- const { workspaceProfile } = await workspaceServiceClient.getWorkspaceProfile({});
- if (workspaceProfile) {
- defaultGlobalState.workspaceProfile = workspaceProfile;
- }
-
- const { data } = await api.getSystemStatus();
- if (data) {
- const customizedProfile = data.customizedProfile;
- defaultGlobalState.systemStatus = {
- ...data,
- customizedProfile: {
- name: customizedProfile.name || "Memos",
- logoUrl: customizedProfile.logoUrl || "/logo.webp",
- description: customizedProfile.description,
- locale: customizedProfile.locale || "en",
- appearance: customizedProfile.appearance || "system",
- },
- };
- // Use storageLocale > userLocale > customizedProfile.locale (server's default locale)
- // Initially, storageLocale is undefined and user is not logged in, so use server's default locale.
- // User can change locale in login/sign up page, set storageLocale and override userLocale after logged in.
- // Otherwise, storageLocale remains undefined and if userLocale has value after user logged in, set to storageLocale and re-render.
- // Otherwise, use server's default locale, set to storageLocale.
- const { locale: storageLocale, appearance: storageAppearance } = storage.get(["locale", "appearance"]);
- defaultGlobalState.locale =
- storageLocale || defaultGlobalState.systemStatus.customizedProfile.locale || findNearestMatchedLanguage(i18n.language);
- defaultGlobalState.appearance = storageAppearance || defaultGlobalState.systemStatus.customizedProfile.appearance;
- }
- store.dispatch(setGlobalState(defaultGlobalState));
-};
-
-export const useGlobalStore = () => {
- const state = useAppSelector((state) => state.global);
-
- return {
- state,
- getState: () => {
- return store.getState().global;
- },
- getDisablePublicMemos: () => {
- return store.getState().global.systemStatus.disablePublicMemos;
- },
- isDev: () => {
- return state.workspaceProfile.mode !== "prod";
- },
- fetchSystemStatus: async () => {
- const { data: systemStatus } = await api.getSystemStatus();
- store.dispatch(setGlobalState({ systemStatus: systemStatus }));
- return systemStatus;
- },
- setSystemStatus: (systemStatus: Partial
) => {
- store.dispatch(
- setGlobalState({
- systemStatus: {
- ...state.systemStatus,
- ...systemStatus,
- },
- }),
- );
- },
- setLocale: (locale: Locale) => {
- // Set storageLocale to user selected locale.
- storage.set({
- locale: locale,
- });
- store.dispatch(setLocale(locale));
- },
- setAppearance: (appearance: Appearance) => {
- // Set storageAppearance to user selected appearance.
- storage.set({
- appearance: appearance,
- });
- store.dispatch(setAppearance(appearance));
- },
- };
-};
diff --git a/web/src/store/module/index.ts b/web/src/store/module/index.ts
index 57fc4f2a..9fba225a 100644
--- a/web/src/store/module/index.ts
+++ b/web/src/store/module/index.ts
@@ -1,4 +1,3 @@
-export * from "./global";
export * from "./filter";
export * from "./tag";
export * from "./dialog";
diff --git a/web/src/store/reducer/global.ts b/web/src/store/reducer/global.ts
deleted file mode 100644
index 1664e2a3..00000000
--- a/web/src/store/reducer/global.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { createSlice, PayloadAction } from "@reduxjs/toolkit";
-import { WorkspaceProfile } from "@/types/proto/api/v2/workspace_service";
-
-interface State {
- locale: Locale;
- appearance: Appearance;
- systemStatus: SystemStatus;
- workspaceProfile: WorkspaceProfile;
-}
-
-const globalSlice = createSlice({
- name: "global",
- initialState: {
- locale: "en",
- appearance: "system",
- systemStatus: {
- disablePasswordLogin: false,
- disablePublicMemos: false,
- memoDisplayWithUpdatedTs: false,
- customizedProfile: {
- name: "Memos",
- logoUrl: "/logo.webp",
- description: "",
- locale: "en",
- appearance: "system",
- },
- },
- workspaceProfile: WorkspaceProfile.fromPartial({}),
- } as State,
- reducers: {
- setGlobalState: (state, action: PayloadAction>) => {
- return {
- ...state,
- ...action.payload,
- };
- },
- setLocale: (state, action: PayloadAction) => {
- return {
- ...state,
- locale: action.payload,
- };
- },
- setAppearance: (state, action: PayloadAction) => {
- return {
- ...state,
- appearance: action.payload,
- };
- },
- },
-});
-
-export const { setGlobalState, setLocale, setAppearance } = globalSlice.actions;
-
-export default globalSlice.reducer;
diff --git a/web/src/store/v1/workspaceSetting.ts b/web/src/store/v1/workspaceSetting.ts
index 555ef198..b7213faf 100644
--- a/web/src/store/v1/workspaceSetting.ts
+++ b/web/src/store/v1/workspaceSetting.ts
@@ -15,6 +15,13 @@ const getDefaultState = (): State => ({
export const useWorkspaceSettingStore = create(
combine(getDefaultState(), (set, get) => ({
+ getState: () => {
+ return get();
+ },
+ listWorkspaceSettings: async () => {
+ const { settings } = await workspaceSettingServiceClient.listWorkspaceSettings({});
+ set({ workspaceSettingByName: settings.reduce((acc, setting) => ({ ...acc, [setting.name]: setting }), {}) });
+ },
fetchWorkspaceSetting: async (key: WorkspaceSettingKey) => {
const { setting } = await workspaceSettingServiceClient.getWorkspaceSetting({ name: `${WorkspaceSettingPrefix}${key}` });
if (!setting) {
@@ -25,5 +32,9 @@ export const useWorkspaceSettingStore = create(
getWorkspaceSettingByKey: (key: WorkspaceSettingKey): WorkspaceSetting => {
return get().workspaceSettingByName[`${WorkspaceSettingPrefix}${key}`] || WorkspaceSetting.fromPartial({});
},
+ setWorkspaceSetting: async (setting: WorkspaceSetting) => {
+ await workspaceSettingServiceClient.setWorkspaceSetting({ setting });
+ set({ workspaceSettingByName: { ...get().workspaceSettingByName, [setting.name]: setting } });
+ },
})),
);
diff --git a/web/src/types/modules/system.d.ts b/web/src/types/modules/system.d.ts
deleted file mode 100644
index debecd26..00000000
--- a/web/src/types/modules/system.d.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-interface CustomizedProfile {
- name: string;
- logoUrl: string;
- description: string;
- locale: Locale;
- appearance: Appearance;
-}
-
-interface SystemStatus {
- // System settings
- disablePasswordLogin: boolean;
- disablePublicMemos: boolean;
- maxUploadSizeMiB: number;
- customizedProfile: CustomizedProfile;
- storageServiceId: number;
- localStoragePath: string;
- memoDisplayWithUpdatedTs: boolean;
-}
-
-interface SystemSetting {
- name: string;
- value: string;
-}