๐Ÿ“ฆ GitSquared / uma

๐Ÿ“„ settings.ts ยท 121 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
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()
	}
}