wtetsu/mouse-dictionary

View on GitHub
src/main/core/config.js

Summary

Maintainability
A
0 mins
Test Coverage
/**
 * Mouse Dictionary (https://github.com/wtetsu/mouse-dictionary/)
 * Copyright 2018-present wtetsu
 * Licensed under MIT
 */

import storage from "../lib/storage";
import defaultSettings from "../settings";
import env from "../env";

const KEY_USER_CONFIG = "**** config ****";
const KEY_LAST_POSITION = "**** last_position ****";
const KEY_LOADED = "**** loaded ****";

const JSON_FIELDS = new Set(["normalDialogStyles", "movingDialogStyles", "hiddenDialogStyles"]);

const loadAll = async () => {
  if (!env.enableUserSettings) {
    return { settings: parseSettings(defaultSettings), position: {} };
  }
  const data = await getStoredData([KEY_USER_CONFIG, KEY_LAST_POSITION]);
  const mergedSettings = { ...defaultSettings, ...data[KEY_USER_CONFIG] };
  const settings = parseSettings(mergedSettings);

  const position = data[KEY_LAST_POSITION];
  return { settings, position };
};

const loadSettings = async () => {
  const rawSettings = await loadRawSettings();
  return parseSettings(rawSettings);
};

const loadRawSettings = async () => {
  if (!env.enableUserSettings) {
    return { ...defaultSettings };
  }

  const data = await getStoredData([KEY_USER_CONFIG]);
  const userSettings = data[KEY_USER_CONFIG];
  return { ...defaultSettings, ...userSettings };
};

const parseSettings = (settings) => {
  const result = {};
  const keys = Object.keys(settings);
  for (let i = 0; i < keys.length; i++) {
    const field = keys[i];
    const value = settings[field];
    if (value === null || value === undefined) {
      continue;
    }
    result[field] = JSON_FIELDS.has(field) ? parseJson(value) : value;
  }
  if (!env.enableWindowStatusSave && settings.initialPosition === "keep") {
    result.initialPosition = "right";
  }
  return result;
};

const parseJson = (json) => {
  if (!json) {
    return null;
  }
  let result;
  try {
    result = JSON.parse(json);
  } catch (e) {
    result = null;
    console.error("Failed to parse json:" + json);
    console.error(e);
  }
  return result;
};

const savePosition = async (e) => {
  if (!env.enableUserSettings || !env.enableWindowStatusSave) {
    return;
  }
  return storage.sync.set({
    [KEY_LAST_POSITION]: JSON.stringify(e),
  });
};

const getStoredData = async (keys) => {
  const result = {};
  const storedData = await storage.sync.get(keys);

  for (let i = 0; i < keys.length; i++) {
    const key = keys[i];
    const json = storedData[key] ?? "{}";
    result[key] = parseJson(json) ?? {};
  }

  return result;
};

const isDataReady = () => storage.local.pick(KEY_LOADED);

export default {
  loadAll,
  loadSettings,
  loadRawSettings,
  parseSettings,
  savePosition,
  isDataReady,
};