๐Ÿ“ฆ GitSquared / uma

๐Ÿ“„ SettingsProvider.tsx ยท 58 lines
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>
	)
}