'init'
This commit is contained in:
57
app/providers/SettingsProvider/SettingsProvider.tsx
Normal file
57
app/providers/SettingsProvider/SettingsProvider.tsx
Normal file
@@ -0,0 +1,57 @@
|
||||
import { useFileStorage } from "@/app/hooks/useFileStorage";
|
||||
import { useLogger } from "@/app/hooks/useLogger";
|
||||
import { createContext, useEffect, useState } from "react";
|
||||
|
||||
export interface SettingsContextValue {
|
||||
getSetting: (key: string, def?: any) => any;
|
||||
setSetting: (key: string, value: any) => void;
|
||||
}
|
||||
|
||||
export const SettingsProviderContext = createContext<SettingsContextValue|null>(null);
|
||||
|
||||
interface SettingsProviderProps {
|
||||
children?: React.ReactNode;
|
||||
}
|
||||
|
||||
export function SettingsProvider(props: SettingsProviderProps) {
|
||||
const [settings, setSettings] = useState<any>({});
|
||||
const {readFile, writeFile} = useFileStorage();
|
||||
const log = useLogger('SettingsProvider');
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
const loadSettings = async () => {
|
||||
const data = await readFile("settings.json");
|
||||
if(data){
|
||||
try {
|
||||
const parsedSettings = JSON.parse(Buffer.from(data).toString());
|
||||
setSettings(parsedSettings);
|
||||
} catch (e) {
|
||||
log("Failed to parse settings.json");
|
||||
}
|
||||
}
|
||||
}
|
||||
loadSettings();
|
||||
}, []);
|
||||
|
||||
const getSetting = (key: string, def? : any) => {
|
||||
if(settings[key] === undefined){
|
||||
return def;
|
||||
}
|
||||
return settings[key];
|
||||
}
|
||||
|
||||
const setSetting = (key: string, value: any) => {
|
||||
setSettings((prevSettings: any) => {
|
||||
const newSettings = {...prevSettings, [key]: value};
|
||||
writeFile("settings.json", JSON.stringify(newSettings));
|
||||
return newSettings;
|
||||
});
|
||||
}
|
||||
|
||||
return (
|
||||
<SettingsProviderContext.Provider value={{getSetting, setSetting}}>
|
||||
{props.children}
|
||||
</SettingsProviderContext.Provider>
|
||||
);
|
||||
}
|
||||
14
app/providers/SettingsProvider/useSetting.ts
Normal file
14
app/providers/SettingsProvider/useSetting.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { useContext } from "react";
|
||||
import { SettingsProviderContext } from "./SettingsProvider";
|
||||
|
||||
export function useSetting<T>(key: string, def?: any): [T, (value: T) => void] {
|
||||
const context = useContext(SettingsProviderContext);
|
||||
if(!context){
|
||||
throw new Error("useSetting must be used within a SettingsProvider");
|
||||
}
|
||||
|
||||
return [
|
||||
context.getSetting(key, def),
|
||||
(value: any) => context.setSetting(key, value)
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user