Files
kiss-translator/src/hooks/Setting.js

102 lines
2.1 KiB
JavaScript
Raw Normal View History

import {
createContext,
useCallback,
useContext,
useMemo,
useEffect,
} from "react";
import Alert from "@mui/material/Alert";
2025-10-13 11:29:22 +08:00
import {
STOKEY_SETTING,
DEFAULT_SETTING,
KV_SETTING_KEY,
MSG_SET_LOGLEVEL,
} from "../config";
2023-08-30 18:05:37 +08:00
import { useStorage } from "./Storage";
import { debounceSyncMeta } from "../libs/storage";
import Loading from "./Loading";
import { logger } from "../libs/log";
2025-10-13 11:29:22 +08:00
import { sendBgMsg } from "../libs/msg";
2023-07-20 13:45:41 +08:00
2023-08-30 18:05:37 +08:00
const SettingContext = createContext({
setting: DEFAULT_SETTING,
updateSetting: () => {},
reloadSetting: () => {},
2023-08-30 18:05:37 +08:00
});
export function SettingProvider({ children }) {
const {
data: setting,
isLoading,
update,
reload,
} = useStorage(STOKEY_SETTING, DEFAULT_SETTING, KV_SETTING_KEY);
2023-09-01 16:39:57 +08:00
useEffect(() => {
(async () => {
try {
logger.setLevel(setting?.logLevel);
2025-10-13 11:29:22 +08:00
await sendBgMsg(MSG_SET_LOGLEVEL, setting?.logLevel);
} catch (error) {
logger.error("Failed to fetch log level, using default.", error);
}
})();
}, [setting]);
2023-08-30 18:05:37 +08:00
const updateSetting = useCallback(
(objOrFn) => {
update(objOrFn);
debounceSyncMeta(KV_SETTING_KEY);
},
[update]
);
const updateChild = useCallback(
(key) => async (obj) => {
updateSetting((prev) => ({
...prev,
[key]: { ...(prev?.[key] || {}), ...obj },
}));
2023-08-30 18:05:37 +08:00
},
[updateSetting]
);
const value = useMemo(
() => ({
setting,
updateSetting,
updateChild,
reloadSetting: reload,
}),
[setting, updateSetting, updateChild, reload]
2023-08-30 18:05:37 +08:00
);
if (isLoading) {
return <Loading />;
}
if (!setting) {
<center>
<Alert severity="error" sx={{ maxWidth: 600, margin: "60px auto" }}>
<p>数据加载出错请刷新页面或卸载后重新安装</p>
<p>
Data loading error, please refresh the page or uninstall and
reinstall.
</p>
</Alert>
</center>;
2023-09-08 13:53:33 +08:00
}
2023-08-30 18:05:37 +08:00
return (
<SettingContext.Provider value={value}>{children}</SettingContext.Provider>
2023-08-30 18:05:37 +08:00
);
2023-07-20 13:45:41 +08:00
}
/**
2023-08-30 18:05:37 +08:00
* 设置 hook
2023-07-20 13:45:41 +08:00
* @returns
*/
2023-08-30 18:05:37 +08:00
export function useSetting() {
return useContext(SettingContext);
2023-07-20 13:45:41 +08:00
}