Files
Bridge-Multi/src-electron/ipc/SettingsHandler.ipc.ts
2024-07-09 19:50:44 -05:00

56 lines
1.6 KiB
TypeScript

import { readFileSync } from 'fs'
import { writeFile } from 'fs/promises'
import _ from 'lodash'
import { mkdirp } from 'mkdirp'
import { inspect } from 'util'
import { dataPath, settingsPath, tempPath, themesPath } from '../../src-shared/Paths.js'
import { defaultSettings, Settings } from '../../src-shared/Settings.js'
export let settings = readSettings()
function readSettings() {
try {
const settings = JSON.parse(readFileSync(settingsPath, 'utf8')) as Partial<Settings>
return Object.assign(_.cloneDeep(defaultSettings), settings)
} catch (err) {
if (err?.code === 'ENOENT') {
saveSettings(_.cloneDeep(defaultSettings))
} else {
console.error('Failed to load settings. Default settings will be used.\n' + inspect(err))
}
return _.cloneDeep(defaultSettings)
}
}
/**
* Updates Bridge's settings object to `newSettings` and saves them to Bridge's data directories.
*/
export async function setSettings(newSettings: Settings) {
settings = newSettings
await saveSettings(newSettings)
}
/**
* @returns the current settings object, or default settings if they couldn't be loaded.
*/
export async function getSettings() {
return settings
}
/**
* Saves `settings` to Bridge's data directories. If settings are not provided, default settings are used.
*/
async function saveSettings(settings: Settings) {
try {
// Create data directories if they don't exist
for (const path of [dataPath, tempPath, themesPath]) {
await mkdirp(path)
}
await writeFile(settingsPath, JSON.stringify(settings, undefined, 2), 'utf8')
} catch (err) {
console.error('Failed to save settings.\n' + inspect(err))
}
}