From 3613f70a72fb05dbb87d7628a96d03e671ec9857 Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Sat, 21 Oct 2017 23:41:57 +0900 Subject: [PATCH] Simplify and split config.json into defaultPreferences and buildConfig --- src/browser/components/SettingsPage.jsx | 5 +- src/browser/index.jsx | 11 ++- src/common/config/base.json | 32 -------- src/common/config/buildConfig.js | 19 +++++ src/common/config/defaultPreferences.js | 20 +++++ src/common/config/override.json | 3 - src/common/config/pastDefaultPreferences.js | 10 +++ src/common/config/upgradePreferences.js | 29 +++++++ src/common/settings.js | 85 ++++++++------------- src/main.js | 2 +- src/main/menus/app.js | 13 ++-- src/main/menus/tray.js | 4 +- 12 files changed, 132 insertions(+), 101 deletions(-) delete mode 100644 src/common/config/base.json create mode 100644 src/common/config/buildConfig.js create mode 100644 src/common/config/defaultPreferences.js delete mode 100644 src/common/config/override.json create mode 100644 src/common/config/pastDefaultPreferences.js create mode 100644 src/common/config/upgradePreferences.js diff --git a/src/browser/components/SettingsPage.jsx b/src/browser/components/SettingsPage.jsx index 95d7c5b1..63ff2924 100644 --- a/src/browser/components/SettingsPage.jsx +++ b/src/browser/components/SettingsPage.jsx @@ -8,6 +8,7 @@ const {ipcRenderer, remote} = require('electron'); const AutoLaunch = require('auto-launch'); const {debounce} = require('underscore'); +const buildConfig = require('../../common/config/buildConfig'); const settings = require('../../common/settings'); const TeamList = require('./TeamList.jsx'); @@ -301,8 +302,10 @@ const SettingsPage = createReactClass({ onTeamsChange={this.handleTeamsChange} updateTeam={this.updateTeam} addServer={this.addServer} - onTeamClick={backToIndex} allowTeamEdit={this.state.enableTeamModification} + onTeamClick={(index) => { + backToIndex(index + buildConfig.defaultTeams.length); + }} /> diff --git a/src/browser/index.jsx b/src/browser/index.jsx index ea2b2739..bd09839f 100644 --- a/src/browser/index.jsx +++ b/src/browser/index.jsx @@ -12,11 +12,15 @@ const {remote, ipcRenderer} = require('electron'); const MainPage = require('./components/MainPage.jsx'); const AppConfig = require('./config/AppConfig.js'); +const buildConfig = require('../common/config/buildConfig'); +const settings = require('../common/settings'); const url = require('url'); const badge = require('./js/badge'); const utils = require('../utils/util'); +const teams = settings.mergeDefaultTeams(AppConfig.data.teams); + remote.getCurrentWindow().removeAllListeners('focus'); if (AppConfig.data.teams.length === 0) { @@ -90,8 +94,9 @@ function showUnreadBadge(unreadCount, mentionCount) { const permissionRequestQueue = []; const requestingPermission = new Array(AppConfig.data.teams.length); -function teamConfigChange(teams) { - AppConfig.set('teams', teams); +function teamConfigChange(updatedTeams) { + AppConfig.set('teams', updatedTeams.slice(buildConfig.defaultTeams.length)); + teams.splice(0, teams.length, ...updatedTeams); requestingPermission.length = teams.length; ipcRenderer.send('update-menu', AppConfig.data); ipcRenderer.send('update-config'); @@ -157,7 +162,7 @@ if (!parsedURL.query.index || parsedURL.query.index === null) { ReactDOM.render( Learn More..." menu item. + * If null is specified, the menu disappears. + */ +const buildConfig = { + defaultTeams: [/* + { + name: 'example', + url: 'https://example.com' + }*/ + ], + helpLink: 'https://docs.mattermost.com/help/apps/desktop-guide.html' +}; + +module.exports = buildConfig; diff --git a/src/common/config/defaultPreferences.js b/src/common/config/defaultPreferences.js new file mode 100644 index 00000000..69b6ade3 --- /dev/null +++ b/src/common/config/defaultPreferences.js @@ -0,0 +1,20 @@ +/** + * Default user preferences. End-users can change these parameters by editing config.json + * @param {number} version - Scheme version. (Not application version) + */ +const defaultPreferences = { + version: 1, + teams: [], + showTrayIcon: false, + trayIconTheme: 'light', + minimizeToTray: false, + notifications: { + flashWindow: 0 + }, + showUnreadBadge: true, + useSpellChecker: true, + spellCheckerLocale: 'en-US', + enableServerManagement: true +}; + +module.exports = defaultPreferences; diff --git a/src/common/config/override.json b/src/common/config/override.json deleted file mode 100644 index 0db3279e..00000000 --- a/src/common/config/override.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - -} diff --git a/src/common/config/pastDefaultPreferences.js b/src/common/config/pastDefaultPreferences.js new file mode 100644 index 00000000..7ae417c7 --- /dev/null +++ b/src/common/config/pastDefaultPreferences.js @@ -0,0 +1,10 @@ +const defaultPreferences = require('./defaultPreferences'); + +const pastDefaultPreferences = { + 1: defaultPreferences, + 0: { + url: '' + } +}; + +module.exports = pastDefaultPreferences; diff --git a/src/common/config/upgradePreferences.js b/src/common/config/upgradePreferences.js new file mode 100644 index 00000000..3e8485a3 --- /dev/null +++ b/src/common/config/upgradePreferences.js @@ -0,0 +1,29 @@ +const pastDefaultPreferences = require('./pastDefaultPreferences'); + +function deepCopy(object) { + return JSON.parse(JSON.stringify(object)); +} + +function upgradeV0toV1(configV0) { + const config = deepCopy(pastDefaultPreferences['1']); + if (config.version !== 1) { + throw new Error('pastDefaultPreferences[\'1\'].version is not equal to 1'); + } + config.teams.push({ + name: 'Primary team', + url: configV0.url + }); + return config; +} + +function upgradeToLatest(config) { + var configVersion = config.version ? config.version : 0; + switch (configVersion) { + case 0: + return upgradeToLatest(upgradeV0toV1(config)); + default: + return config; + } +} + +module.exports = upgradeToLatest; diff --git a/src/common/settings.js b/src/common/settings.js index b0ec9116..30a56210 100644 --- a/src/common/settings.js +++ b/src/common/settings.js @@ -1,90 +1,56 @@ 'use strict'; const fs = require('fs'); - const path = require('path'); -const deepmerge = require('./deepmerge'); - -const settingsVersion = 1; -const baseConfig = require('./config/base.json'); -const overrideConfig = require('./config/override.json'); +const buildConfig = require('./config/buildConfig'); function merge(base, target) { return Object.assign({}, base, target); } -function deepMergeArray(source, dest) { - return dest; -} +const defaultPreferences = require('./config/defaultPreferences'); +const upgradePreferences = require('./config/upgradePreferences'); -function loadDefault(version, spellCheckerLocale) { - var ver = version; - if (version == null) { - ver = settingsVersion; - } - - const base = baseConfig[ver] || baseConfig.default; - const override = overrideConfig[ver] || {}; - - const defaults = deepmerge(base, override, {arrayMerge: deepMergeArray}); - - return Object.assign(defaults, { - spellCheckerLocale: spellCheckerLocale || defaults.spellCheckerLocale || 'en-US' +function loadDefault(spellCheckerLocale) { + const config = JSON.parse(JSON.stringify(defaultPreferences)); + return Object.assign({}, config, { + spellCheckerLocale: spellCheckerLocale || defaultPreferences.pellCheckerLocale || 'en-US' }); } -function upgradeV0toV1(configV0) { - var config = loadDefault(1); - config.teams.push({ - name: 'Primary team', - url: configV0.url - }); - return config; +function hasBuildConfigDefaultTeams(config) { + return config.defaultTeams.length > 0; } -function upgrade(config, newAppVersion) { - var configVersion = config.version ? config.version : 0; - if (newAppVersion) { - config.lastMattermostVersion = newAppVersion; - } - switch (configVersion) { - case 0: - return upgrade(upgradeV0toV1(config)); - default: - return config; - } +function upgrade(config) { + return upgradePreferences(config); } module.exports = { - version: settingsVersion, + version: defaultPreferences.version, upgrade, readFileSync(configFile) { - var config = JSON.parse(fs.readFileSync(configFile, 'utf8')); - - // need to be able to compare 1 to '1' - if (config.version == settingsVersion) { // eslint-disable-line - var defaultConfig = this.loadDefault(); - config = merge(defaultConfig, config); + const config = JSON.parse(fs.readFileSync(configFile, 'utf8')); + if (config.version === defaultPreferences.version) { + const defaultConfig = loadDefault(); + return merge(defaultConfig, config); } - return config; }, writeFile(configFile, config, callback) { - // need to be able to compare 1 to '1' - if (config.version != settingsVersion) { // eslint-disable-line - throw new Error('version ' + config.version + ' is not equal to ' + settingsVersion); + if (config.version !== defaultPreferences.version) { + throw new Error('version ' + config.version + ' is not equal to ' + defaultPreferences.version); } var data = JSON.stringify(config, null, ' '); fs.writeFile(configFile, data, 'utf8', callback); }, writeFileSync(configFile, config) { - // need to be able to compare 1 to '1' - if (config.version != settingsVersion) { // eslint-disable-line - throw new Error('version ' + config.version + ' is not equal to ' + settingsVersion); + if (config.version !== defaultPreferences.version) { + throw new Error('version ' + config.version + ' is not equal to ' + defaultPreferences.version); } const dir = path.dirname(configFile); @@ -96,5 +62,14 @@ module.exports = { fs.writeFileSync(configFile, data, 'utf8'); }, - loadDefault + loadDefault, + + mergeDefaultTeams(teams) { + const newTeams = []; + if (hasBuildConfigDefaultTeams(buildConfig)) { + newTeams.push(...JSON.parse(JSON.stringify(buildConfig.defaultTeams))); + } + newTeams.push(...JSON.parse(JSON.stringify(teams))); + return newTeams; + } }; diff --git a/src/main.js b/src/main.js index e59ffc7d..e8feed53 100644 --- a/src/main.js +++ b/src/main.js @@ -69,7 +69,7 @@ try { config = settings.readFileSync(configFile); if (config.version !== settings.version || wasUpdated()) { clearAppCache(); - config = settings.upgrade(config, app.getVersion()); + config = settings.upgrade(config); settings.writeFileSync(configFile, config); } } catch (e) { diff --git a/src/main/menus/app.js b/src/main/menus/app.js index 587bb465..89e6cd6c 100644 --- a/src/main/menus/app.js +++ b/src/main/menus/app.js @@ -1,6 +1,8 @@ 'use strict'; const electron = require('electron'); +const settings = require('../../common/settings'); +const buildConfig = require('../../common/config/buildConfig'); const Menu = electron.Menu; @@ -173,13 +175,14 @@ function createTemplate(mainWindow, config, isDev) { }] }); + const teams = settings.mergeDefaultTeams(config.teams); const windowMenu = { label: '&Window', submenu: [{ role: 'minimize' }, { role: 'close' - }, separatorItem, ...config.teams.slice(0, 9).map((team, i) => { + }, separatorItem, ...teams.slice(0, 9).map((team, i) => { return { label: team.name, accelerator: `CmdOrCtrl+${i + 1}`, @@ -194,23 +197,23 @@ function createTemplate(mainWindow, config, isDev) { click() { mainWindow.webContents.send('select-next-tab'); }, - enabled: (config.teams.length > 1) + enabled: (teams.length > 1) }, { label: 'Select Previous Server', accelerator: 'Ctrl+Shift+Tab', click() { mainWindow.webContents.send('select-previous-tab'); }, - enabled: (config.teams.length > 1) + enabled: (teams.length > 1) }] }; template.push(windowMenu); var submenu = []; - if (config.helpLink) { + if (buildConfig.helpLink) { submenu.push({ label: 'Learn More...', click() { - electron.shell.openExternal(config.helpLink); + electron.shell.openExternal(buildConfig.helpLink); } }); submenu.push(separatorItem); diff --git a/src/main/menus/tray.js b/src/main/menus/tray.js index 1de7615f..8db5587e 100644 --- a/src/main/menus/tray.js +++ b/src/main/menus/tray.js @@ -4,11 +4,13 @@ const { app, Menu } = require('electron'); +const settings = require('../../common/settings'); function createTemplate(mainWindow, config, isDev) { const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${app.getAppPath()}/browser/settings.html`; + const teams = settings.mergeDefaultTeams(config.teams); var template = [ - ...config.teams.slice(0, 9).map((team, i) => { + ...teams.slice(0, 9).map((team, i) => { return { label: team.name, click: () => {