You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
memos/web/src/store/module/global.ts

79 lines
2.3 KiB
TypeScript

import * as api from "../../helpers/api";
import * as storage from "../../helpers/storage";
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: {
allowSignUp: false,
additionalStyle: "",
additionalScript: "",
customizedProfile: {
name: "memos",
logoUrl: "/logo.png",
description: "",
locale: "en",
appearance: "system",
externalUrl: "",
},
} as SystemStatus,
};
const { locale: storageLocale, appearance: storageAppearance } = storage.get(["locale", "appearance"]);
if (storageLocale) {
defaultGlobalState.locale = storageLocale;
}
if (storageAppearance) {
defaultGlobalState.appearance = storageAppearance;
}
try {
const { data } = (await api.getSystemStatus()).data;
if (data) {
const customizedProfile = data.customizedProfile;
defaultGlobalState.systemStatus = {
...data,
customizedProfile: {
name: customizedProfile.name || "memos",
logoUrl: customizedProfile.logoUrl || "/logo.png",
description: customizedProfile.description,
locale: customizedProfile.locale || "en",
appearance: customizedProfile.appearance || "system",
externalUrl: "",
},
};
defaultGlobalState.locale = customizedProfile.locale;
defaultGlobalState.appearance = customizedProfile.appearance;
}
} catch (error) {
// do nth
}
store.dispatch(setGlobalState(defaultGlobalState));
};
export const useGlobalStore = () => {
const state = useAppSelector((state) => state.global);
return {
state,
getState: () => {
return store.getState().global;
},
fetchSystemStatus: async () => {
const { data: systemStatus } = (await api.getSystemStatus()).data;
store.dispatch(setGlobalState({ systemStatus: systemStatus }));
return systemStatus;
},
setLocale: (locale: Locale) => {
store.dispatch(setLocale(locale));
},
setAppearance: (appearance: Appearance) => {
store.dispatch(setAppearance(appearance));
},
};
};