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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121import UserSetting from '@lib/entities/UserSetting'
export enum UserSettingKey {
RunOnboardingAtNextLaunch = 'runOnboardingAtNextLaunch',
BatterySaver = 'batterySaver',
Fog = 'fog',
DebugView = 'debugView',
DebugWriteMode = 'debugWriteMode',
}
export interface UserSettings {
[UserSettingKey.RunOnboardingAtNextLaunch]: boolean
[UserSettingKey.BatterySaver]: boolean
[UserSettingKey.Fog]: boolean
[UserSettingKey.DebugView]: boolean
[UserSettingKey.DebugWriteMode]: boolean
}
export const DEFAULT_SETTINGS: UserSettings = {
[UserSettingKey.RunOnboardingAtNextLaunch]: true,
[UserSettingKey.BatterySaver]: true, // toggled off after permissions setup
[UserSettingKey.Fog]: true,
[UserSettingKey.DebugView]: false,
[UserSettingKey.DebugWriteMode]: false,
}
export async function loadSettings(): Promise<UserSettings> {
console.info('Loading user settings')
const settings = {}
const settingsKeys = Object.values(UserSettingKey)
let i = 0
while (i < settingsKeys.length) {
const key: UserSettingKey = settingsKeys[i]
const userSetting = await UserSetting.findOneBy({
key,
})
const rawValue: number | undefined = userSetting?.value
if (!userSetting || typeof rawValue === 'undefined') {
await writeSetting(key, DEFAULT_SETTINGS[key])
// loop again without incrementing cursor
continue
}
let parsedValue: UserSettings[typeof key] | undefined
switch (key) {
// Boolean settings
case UserSettingKey.RunOnboardingAtNextLaunch:
case UserSettingKey.BatterySaver:
case UserSettingKey.Fog:
case UserSettingKey.DebugView:
case UserSettingKey.DebugWriteMode:
if (rawValue === 0) {
parsedValue = false
} else if (rawValue === 1) {
parsedValue = true
}
break
}
if (typeof parsedValue === 'undefined') {
console.warn(
'Unknown setting value',
{ key, rawValue },
'resetting to default',
)
// initialize back to known deserializable value
await writeSetting(key, DEFAULT_SETTINGS[key])
// loop again without incrementing cursor
continue
}
settings[key] = parsedValue
i++
}
return settings as UserSettings
}
export async function writeSetting(
key: UserSettingKey,
value: UserSettings[typeof key],
): Promise<void> {
let serializedValue: number
switch (key) {
// Boolean settings
case UserSettingKey.RunOnboardingAtNextLaunch:
case UserSettingKey.BatterySaver:
case UserSettingKey.Fog:
case UserSettingKey.DebugView:
case UserSettingKey.DebugWriteMode:
if (!value) {
serializedValue = 0
} else {
serializedValue = 1
}
break
}
console.info('Setting', key, 'to', value)
const userSetting = await UserSetting.findOneBy({
key,
})
if (userSetting) {
userSetting.value = serializedValue
await userSetting.save()
} else {
await UserSetting.create({
key,
value: serializedValue,
}).save()
}
}