aboutsummaryrefslogtreecommitdiffstats
path: root/src/electron/Settings.ts
blob: e15a2e65ce4488af8875d3d23a0ccff83b434398 (plain) (blame)
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
import { outputJsonSync, pathExistsSync, readJsonSync } from 'fs-extra';
import { makeObservable, observable, toJS } from 'mobx';
import { userDataPath } from '../environment-remote';

const debug = require('../preload-safe-debug')('Ferdium:Settings');

export default class Settings {
  type: string = '';

  defaultState: object;

  @observable store: object = {};

  constructor(type: string, defaultState = {}) {
    makeObservable(this);

    this.type = type;
    this.store = defaultState;
    this.defaultState = defaultState;

    if (pathExistsSync(this.settingsFile)) {
      this._hydrate();
    } else {
      this._writeFile();
    }
  }

  set(settings: object): void {
    this.store = this._merge(settings);

    this._writeFile();
  }

  get all(): object {
    return this.store;
  }

  get allSerialized(): object {
    return toJS(this.store);
  }

  get(key: string | number): any {
    return this.store[key];
  }

  _merge(settings: object): object {
    return Object.assign(this.defaultState, this.store, settings);
  }

  _hydrate(): void {
    this.store = this._merge(readJsonSync(this.settingsFile));
    debug('Hydrate store', this.type, this.allSerialized);
  }

  _writeFile(): void {
    outputJsonSync(this.settingsFile, this.store, {
      spaces: 2,
    });
    debug('Write settings file', this.type, this.allSerialized);
  }

  get settingsFile(): string {
    return userDataPath(
      'config',
      `${this.type === 'app' ? 'settings' : this.type}.json`,
    );
  }
}