Files
ezbookkeeping/src/lib/settings.js
T
2023-04-29 13:45:19 +08:00

176 lines
6.7 KiB
JavaScript

import Cookies from 'js-cookie';
import currencyConstants from '../consts/currency.js';
import statisticsConstants from '../consts/statistics.js';
const settingsLocalStorageKey = 'ebk_app_settings';
const serverSettingsCookieKey = 'ebk_server_settings';
const defaultSettings = {
lang: 'en',
timeZone: '',
debug: false,
applicationLock: false,
applicationLockWebAuthn: false,
autoUpdateExchangeRatesData: true,
autoGetCurrentGeoLocation: false,
thousandsSeparator: true,
currencyDisplayMode: currencyConstants.defaultCurrencyDisplayMode,
showAmountInHomePage: true,
showTotalAmountInTransactionListPage: true,
showAccountBalance: true,
statistics: {
defaultChartType: statisticsConstants.defaultChartType,
defaultChartDataType: statisticsConstants.defaultChartDataType,
defaultDataRangeType: statisticsConstants.defaultDataRangeType,
defaultAccountFilter: {},
defaultTransactionCategoryFilter: {},
defaultSortingType: statisticsConstants.defaultSortingType
},
animate: true,
autoDarkMode: true
};
function getOriginalSettings() {
try {
const storageData = localStorage.getItem(settingsLocalStorageKey) || '{}';
return JSON.parse(storageData);
} catch (ex) {
console.warn('settings in local storage is invalid', ex);
return {};
}
}
function getFinalSettings() {
const originalSettings = getOriginalSettings();
for (let key in originalSettings) {
if (!Object.prototype.hasOwnProperty.call(originalSettings, key)) {
continue;
}
if (typeof(defaultSettings[key]) === 'object') {
originalSettings[key] = Object.assign({}, defaultSettings[key], originalSettings[key]);
}
}
return Object.assign({}, defaultSettings, originalSettings);
}
function setSettings(settings) {
const storageData = JSON.stringify(settings);
return localStorage.setItem(settingsLocalStorageKey, storageData);
}
function getOriginalOption(key) {
return getOriginalSettings()[key];
}
function getOption(key) {
return getFinalSettings()[key];
}
function getSubOption(key, subKey) {
const options = getFinalSettings()[key] || {};
return options[subKey];
}
function setOption(key, value) {
if (!Object.prototype.hasOwnProperty.call(defaultSettings, key)) {
return;
}
const settings = getFinalSettings();
settings[key] = value;
return setSettings(settings);
}
function setSubOption(key, subKey, value) {
if (!Object.prototype.hasOwnProperty.call(defaultSettings, key)) {
return;
}
if (!Object.prototype.hasOwnProperty.call(defaultSettings[key], subKey)) {
return;
}
const settings = getFinalSettings();
let options = settings[key];
if (!options) {
options = {};
}
options[subKey] = value;
settings[key] = options;
return setSettings(settings);
}
function getServerSetting(key) {
const settings = Cookies.get(serverSettingsCookieKey) || '';
const settingsArr = settings.split('_');
for (let i = 0; i < settingsArr.length; i++) {
const pairs = settingsArr[i].split('.');
if (pairs[0] === key) {
return pairs[1];
}
}
return undefined;
}
function clearSettings() {
localStorage.removeItem(settingsLocalStorageKey);
}
export default {
isProduction: () => process.env.NODE_ENV === 'production',
getLanguage: () => getOriginalOption('lang'),
setLanguage: value => setOption('lang', value),
getTimezone: () => getOption('timeZone'),
setTimezone: value => setOption('timeZone', value),
isEnableDebug: () => getOption('debug'),
setEnableDebug: value => setOption('debug', value),
isEnableApplicationLock: () => getOption('applicationLock'),
setEnableApplicationLock: value => setOption('applicationLock', value),
isEnableApplicationLockWebAuthn: () => getOption('applicationLockWebAuthn'),
setEnableApplicationLockWebAuthn: value => setOption('applicationLockWebAuthn', value),
isAutoUpdateExchangeRatesData: () => getOption('autoUpdateExchangeRatesData'),
setAutoUpdateExchangeRatesData: value => setOption('autoUpdateExchangeRatesData', value),
isAutoGetCurrentGeoLocation: () => getOption('autoGetCurrentGeoLocation'),
setAutoGetCurrentGeoLocation: value => setOption('autoGetCurrentGeoLocation', value),
isEnableThousandsSeparator: () => getOption('thousandsSeparator'),
setEnableThousandsSeparator: value => setOption('thousandsSeparator', value),
getCurrencyDisplayMode: () => getOption('currencyDisplayMode'),
setCurrencyDisplayMode: value => setOption('currencyDisplayMode', value),
isShowAmountInHomePage: () => getOption('showAmountInHomePage'),
setShowAmountInHomePage: value => setOption('showAmountInHomePage', value),
isShowTotalAmountInTransactionListPage: () => getOption('showTotalAmountInTransactionListPage'),
setShowTotalAmountInTransactionListPage: value => setOption('showTotalAmountInTransactionListPage', value),
isShowAccountBalance: () => getOption('showAccountBalance'),
setShowAccountBalance: value => setOption('showAccountBalance', value),
getStatisticsDefaultChartType: () => getSubOption('statistics', 'defaultChartType'),
setStatisticsDefaultChartType: value => setSubOption('statistics', 'defaultChartType', value),
getStatisticsDefaultChartDataType: () => getSubOption('statistics', 'defaultChartDataType'),
setStatisticsDefaultChartDataType: value => setSubOption('statistics', 'defaultChartDataType', value),
getStatisticsDefaultDateRange: () => getSubOption('statistics', 'defaultDataRangeType'),
setStatisticsDefaultDateRange: value => setSubOption('statistics', 'defaultDataRangeType', value),
getStatisticsDefaultAccountFilter: () => getSubOption('statistics', 'defaultAccountFilter'),
setStatisticsDefaultAccountFilter: value => setSubOption('statistics', 'defaultAccountFilter', value),
getStatisticsDefaultTransactionCategoryFilter: () => getSubOption('statistics', 'defaultTransactionCategoryFilter'),
setStatisticsDefaultTransactionCategoryFilter: value => setSubOption('statistics', 'defaultTransactionCategoryFilter', value),
getStatisticsSortingType: () => getSubOption('statistics', 'defaultSortingType'),
setStatisticsSortingType: value => setSubOption('statistics', 'defaultSortingType', value),
isEnableAnimate: () => getOption('animate'),
setEnableAnimate: value => setOption('animate', value),
isEnableAutoDarkMode: () => getOption('autoDarkMode'),
setEnableAutoDarkMode: value => setOption('autoDarkMode', value),
isUserRegistrationEnabled: () => getServerSetting('r') === '1',
isDataExportingEnabled: () => getServerSetting('e') === '1',
clearSettings: clearSettings
};