2025-10-12 23:17:50 +08:00
|
|
|
|
import {
|
|
|
|
|
|
createContext,
|
|
|
|
|
|
useCallback,
|
|
|
|
|
|
useContext,
|
|
|
|
|
|
useMemo,
|
|
|
|
|
|
useEffect,
|
|
|
|
|
|
} from "react";
|
2025-09-24 23:24:00 +08:00
|
|
|
|
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";
|
2025-09-24 23:24:00 +08:00
|
|
|
|
import { debounceSyncMeta } from "../libs/storage";
|
|
|
|
|
|
import Loading from "./Loading";
|
2025-10-12 23:17:50 +08:00
|
|
|
|
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({
|
2025-09-24 23:24:00 +08:00
|
|
|
|
setting: DEFAULT_SETTING,
|
|
|
|
|
|
updateSetting: () => {},
|
|
|
|
|
|
reloadSetting: () => {},
|
2023-08-30 18:05:37 +08:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
export function SettingProvider({ children }) {
|
2025-09-24 23:24:00 +08:00
|
|
|
|
const {
|
|
|
|
|
|
data: setting,
|
|
|
|
|
|
isLoading,
|
|
|
|
|
|
update,
|
|
|
|
|
|
reload,
|
|
|
|
|
|
} = useStorage(STOKEY_SETTING, DEFAULT_SETTING, KV_SETTING_KEY);
|
2023-09-01 16:39:57 +08:00
|
|
|
|
|
2025-10-12 23:17:50 +08:00
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
(async () => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
logger.setLevel(setting?.logLevel);
|
2025-10-13 11:29:22 +08:00
|
|
|
|
await sendBgMsg(MSG_SET_LOGLEVEL, setting?.logLevel);
|
2025-10-12 23:17:50 +08:00
|
|
|
|
} catch (error) {
|
|
|
|
|
|
logger.error("Failed to fetch log level, using default.", error);
|
|
|
|
|
|
}
|
|
|
|
|
|
})();
|
|
|
|
|
|
}, [setting]);
|
|
|
|
|
|
|
2023-08-30 18:05:37 +08:00
|
|
|
|
const updateSetting = useCallback(
|
2025-09-24 23:24:00 +08:00
|
|
|
|
(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
|
|
|
|
},
|
2025-09-24 23:24:00 +08:00
|
|
|
|
[updateSetting]
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const value = useMemo(
|
|
|
|
|
|
() => ({
|
|
|
|
|
|
setting,
|
|
|
|
|
|
updateSetting,
|
|
|
|
|
|
updateChild,
|
|
|
|
|
|
reloadSetting: reload,
|
|
|
|
|
|
}),
|
|
|
|
|
|
[setting, updateSetting, updateChild, reload]
|
2023-08-30 18:05:37 +08:00
|
|
|
|
);
|
|
|
|
|
|
|
2025-09-24 23:24:00 +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 (
|
2025-09-24 23:24:00 +08:00
|
|
|
|
<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
|
|
|
|
}
|