dashy/src/utils/ConfigAccumalator.js

104 lines
3.4 KiB
JavaScript

/**
* Reads the users config from `conf.yml`, and combines it with any local preferences
* Also ensures that any missing attributes are populated with defaults, and the
* object is structurally sound, to avoid any error if the user is missing something
* The main config object is made up of three parts: appConfig, pageInfo and sections
* For anything other than these three sections, please see @utils/ConfigHelpers.js
*/
import {
localStorageKeys,
appConfig as defaultAppConfig,
pageInfo as defaultPageInfo,
iconSize as defaultIconSize,
layout as defaultLayout,
} from '@/utils/defaults';
import ErrorHandler from '@/utils/ErrorHandler';
import { applyItemId } from '@/utils/SectionHelpers';
import $store from '@/store';
// import buildConf from '../../public/conf.yml';
export default class ConfigAccumulator {
constructor() {
this.conf = $store.state.config;
}
pages() {
return this.conf.pages;
}
/* App Config */
appConfig() {
let appConfigFile = {};
// Set app config from file
if (this.conf && this.conf.appConfig) {
appConfigFile = this.conf.appConfig;
}
// else if (buildConf && buildConf.appConfig) {
// appConfigFile = buildConf.appConfig;
// }
// Fill in defaults if anything missing
let usersAppConfig = defaultAppConfig;
if (localStorage[localStorageKeys.APP_CONFIG]) {
usersAppConfig = JSON.parse(localStorage[localStorageKeys.APP_CONFIG]);
} else if (Object.keys(appConfigFile).length > 0) {
usersAppConfig = appConfigFile;
}
// Some settings have their own local storage keys, apply them here
usersAppConfig.layout = localStorage[localStorageKeys.LAYOUT_ORIENTATION]
|| appConfigFile.layout
|| defaultLayout;
usersAppConfig.iconSize = localStorage[localStorageKeys.ICON_SIZE]
|| appConfigFile.iconSize
|| defaultIconSize;
// Don't let users modify users locally
if (appConfigFile.auth) usersAppConfig.auth = appConfigFile.auth;
// All done, return final appConfig object
return usersAppConfig;
}
/* Page Info */
pageInfo() {
let localPageInfo = {};
if (localStorage[localStorageKeys.PAGE_INFO]) {
// eslint-disable-next-line brace-style
try { localPageInfo = JSON.parse(localStorage[localStorageKeys.PAGE_INFO]); }
catch (e) { ErrorHandler('Malformed pageInfo data in local storage'); }
}
const filePageInfo = (this.conf && this.conf.pageInfo) ? this.conf.pageInfo : {};
return { ...defaultPageInfo, ...filePageInfo, ...localPageInfo };
}
/* Sections */
sections() {
let sections = [];
// If the user has stored sections in local storage, return those
const localSections = localStorage[localStorageKeys.CONF_SECTIONS];
if (localSections) {
try {
const json = JSON.parse(localSections);
if (json.length >= 1) sections = json;
} catch (e) {
ErrorHandler('Malformed section data in local storage');
}
}
// If sections were not set from local data, then use config file instead
if (sections.length === 0) {
sections = this.conf ? this.conf.sections || [] : [];
}
// Apply a unique ID to each item
sections = applyItemId(sections);
return sections;
}
/* Complete config */
config() {
return {
appConfig: this.appConfig(),
pageInfo: this.pageInfo(),
sections: this.sections(),
pages: this.pages(),
};
}
}