1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58import {
loadSettings,
UserSettingKey,
UserSettings,
writeSetting,
} from '@lib/utils/settings'
import type { ReactNode } from 'react'
import { createContext, useCallback, useEffect, useState } from 'react'
interface SettingsContextType {
settings: Partial<UserSettings> // setting can be undefined if not loaded yet
set: <k extends UserSettingKey>(
key: k,
value: UserSettings[k],
) => Promise<void>
}
export const SettingsContext = createContext<SettingsContextType>({
settings: {},
set: async () => {},
})
// Synchronize settings changes with the state tree
export default function SettingsProvider({
children,
}: {
children: ReactNode
}) {
const [settings, setSettings] = useState<Partial<UserSettings>>({})
useEffect(() => {
void loadSettings().then((settings) => {
setSettings(settings)
})
}, [])
const set = useCallback<SettingsContextType['set']>(async (key, value) => {
try {
await writeSetting(key, value)
const newSettings = await loadSettings()
setSettings(newSettings)
} catch (err) {
console.error('failed to write setting', key, err)
}
}, [])
return (
<SettingsContext.Provider
value={{
settings,
set,
}}
>
{children}
</SettingsContext.Provider>
)
}