-
Notifications
You must be signed in to change notification settings - Fork 367
/
store.ts
92 lines (80 loc) · 2.36 KB
/
store.ts
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import { useState, useCallback, useMemo, useEffect } from 'react'
import { createStoreContext } from '../utils/context'
import { localLiteStorage } from 'ltstrg'
import { Preferences } from './types'
import { useSetState } from 'react-use'
import { useTranslation } from 'react-i18next'
import { preferencesKey } from '../localStorageKeys'
function loadPreferences() {
const stringifiedPreferences = localLiteStorage.getItem(preferencesKey)
if (stringifiedPreferences == null) return {}
try {
return JSON.parse(stringifiedPreferences)
} catch (error) {
console.warn(error.message)
return {}
}
}
function savePreferences(preferences: Partial<Preferences>) {
localLiteStorage.setItem(preferencesKey, JSON.stringify(preferences))
}
const initialPreferences = loadPreferences()
const basePreferences: Preferences = {
// General
'general.accounts': [],
'general.language': 'en-US',
'general.theme': 'dark',
'general.noteSorting': 'date-updated',
'general.enableAnalytics': true,
'general.enableDownloadAppModal': true,
'general.tutorials': 'display',
// Editor
'editor.theme': 'default',
'editor.fontSize': 15,
'editor.fontFamily':
'SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace',
'editor.indentType': 'spaces',
'editor.indentSize': 4,
'editor.keyMap': 'default',
// Markdown
'markdown.previewStyle': 'default',
'markdown.codeBlockTheme': 'default'
}
function usePreferencesStore() {
const [preferences, setPreferences] = useSetState<Preferences>(
initialPreferences
)
useEffect(() => {
savePreferences(preferences)
}, [preferences])
const mergedPreferences = useMemo(() => {
return {
...basePreferences,
...preferences
}
}, [preferences])
const [closed, setClosed] = useState(true)
const toggleClosed = useCallback(() => {
if (closed) {
setClosed(false)
} else {
setClosed(true)
}
}, [closed, setClosed])
const currentLanguage = mergedPreferences['general.language']
const { i18n } = useTranslation('preferences')
useEffect(() => {
i18n.changeLanguage(currentLanguage)
}, [i18n, currentLanguage])
return {
closed,
setClosed,
toggleClosed,
preferences: mergedPreferences,
setPreferences
}
}
export const {
StoreProvider: PreferencesProvider,
useStore: usePreferences
} = createStoreContext(usePreferencesStore, 'preferences')