Simplify and split config.json into defaultPreferences and buildConfig

This commit is contained in:
Yuya Ochiai 2017-10-21 23:41:57 +09:00
parent 73a7476de8
commit 3613f70a72
12 changed files with 132 additions and 101 deletions

View file

@ -8,6 +8,7 @@ const {ipcRenderer, remote} = require('electron');
const AutoLaunch = require('auto-launch'); const AutoLaunch = require('auto-launch');
const {debounce} = require('underscore'); const {debounce} = require('underscore');
const buildConfig = require('../../common/config/buildConfig');
const settings = require('../../common/settings'); const settings = require('../../common/settings');
const TeamList = require('./TeamList.jsx'); const TeamList = require('./TeamList.jsx');
@ -301,8 +302,10 @@ const SettingsPage = createReactClass({
onTeamsChange={this.handleTeamsChange} onTeamsChange={this.handleTeamsChange}
updateTeam={this.updateTeam} updateTeam={this.updateTeam}
addServer={this.addServer} addServer={this.addServer}
onTeamClick={backToIndex}
allowTeamEdit={this.state.enableTeamModification} allowTeamEdit={this.state.enableTeamModification}
onTeamClick={(index) => {
backToIndex(index + buildConfig.defaultTeams.length);
}}
/> />
</Col> </Col>
</Row> </Row>

View file

@ -12,11 +12,15 @@ const {remote, ipcRenderer} = require('electron');
const MainPage = require('./components/MainPage.jsx'); const MainPage = require('./components/MainPage.jsx');
const AppConfig = require('./config/AppConfig.js'); const AppConfig = require('./config/AppConfig.js');
const buildConfig = require('../common/config/buildConfig');
const settings = require('../common/settings');
const url = require('url'); const url = require('url');
const badge = require('./js/badge'); const badge = require('./js/badge');
const utils = require('../utils/util'); const utils = require('../utils/util');
const teams = settings.mergeDefaultTeams(AppConfig.data.teams);
remote.getCurrentWindow().removeAllListeners('focus'); remote.getCurrentWindow().removeAllListeners('focus');
if (AppConfig.data.teams.length === 0) { if (AppConfig.data.teams.length === 0) {
@ -90,8 +94,9 @@ function showUnreadBadge(unreadCount, mentionCount) {
const permissionRequestQueue = []; const permissionRequestQueue = [];
const requestingPermission = new Array(AppConfig.data.teams.length); const requestingPermission = new Array(AppConfig.data.teams.length);
function teamConfigChange(teams) { function teamConfigChange(updatedTeams) {
AppConfig.set('teams', teams); AppConfig.set('teams', updatedTeams.slice(buildConfig.defaultTeams.length));
teams.splice(0, teams.length, ...updatedTeams);
requestingPermission.length = teams.length; requestingPermission.length = teams.length;
ipcRenderer.send('update-menu', AppConfig.data); ipcRenderer.send('update-menu', AppConfig.data);
ipcRenderer.send('update-config'); ipcRenderer.send('update-config');
@ -157,7 +162,7 @@ if (!parsedURL.query.index || parsedURL.query.index === null) {
ReactDOM.render( ReactDOM.render(
<MainPage <MainPage
teams={AppConfig.data.teams} teams={teams}
initialIndex={initialIndex} initialIndex={initialIndex}
onUnreadCountChange={showUnreadBadge} onUnreadCountChange={showUnreadBadge}
onTeamConfigChange={teamConfigChange} onTeamConfigChange={teamConfigChange}

View file

@ -1,32 +0,0 @@
{
"default": {
"teams": [],
"showTrayIcon": false,
"trayIconTheme": "light",
"minimizeToTray": false,
"version": 1,
"notifications": {
"flashWindow": 0
},
"showUnreadBadge": true,
"useSpellChecker": true,
"spellCheckerLocale": "en-US",
"helpLink": "https://docs.mattermost.com/help/apps/desktop-guide.html",
"enableServerManagement": true
},
"1": {
"teams": [],
"showTrayIcon": false,
"trayIconTheme": "light",
"minimizeToTray": false,
"version": 1,
"notifications": {
"flashWindow": 0
},
"showUnreadBadge": true,
"useSpellChecker": true,
"spellCheckerLocale": "en-US",
"helpLink": "https://docs.mattermost.com/help/apps/desktop-guide.html",
"enableServerManagement": true
}
}

View file

@ -0,0 +1,19 @@
/**
* Build-time configuration. End-users can't change these parameters.
* @prop {Object[]} defaultTeams
* @prop {string} defaultTeams[].name - The tab name for default team.
* @prop {string} defaultTeams[].url - The URL for default team.
* @prop {string} helpLink - The URL for "Help->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;

View file

@ -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;

View file

@ -1,3 +0,0 @@
{
}

View file

@ -0,0 +1,10 @@
const defaultPreferences = require('./defaultPreferences');
const pastDefaultPreferences = {
1: defaultPreferences,
0: {
url: ''
}
};
module.exports = pastDefaultPreferences;

View file

@ -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;

View file

@ -1,90 +1,56 @@
'use strict'; 'use strict';
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
const deepmerge = require('./deepmerge'); const buildConfig = require('./config/buildConfig');
const settingsVersion = 1;
const baseConfig = require('./config/base.json');
const overrideConfig = require('./config/override.json');
function merge(base, target) { function merge(base, target) {
return Object.assign({}, base, target); return Object.assign({}, base, target);
} }
function deepMergeArray(source, dest) { const defaultPreferences = require('./config/defaultPreferences');
return dest; const upgradePreferences = require('./config/upgradePreferences');
}
function loadDefault(version, spellCheckerLocale) { function loadDefault(spellCheckerLocale) {
var ver = version; const config = JSON.parse(JSON.stringify(defaultPreferences));
if (version == null) { return Object.assign({}, config, {
ver = settingsVersion; spellCheckerLocale: spellCheckerLocale || defaultPreferences.pellCheckerLocale || 'en-US'
}
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 upgradeV0toV1(configV0) { function hasBuildConfigDefaultTeams(config) {
var config = loadDefault(1); return config.defaultTeams.length > 0;
config.teams.push({
name: 'Primary team',
url: configV0.url
});
return config;
} }
function upgrade(config, newAppVersion) { function upgrade(config) {
var configVersion = config.version ? config.version : 0; return upgradePreferences(config);
if (newAppVersion) {
config.lastMattermostVersion = newAppVersion;
}
switch (configVersion) {
case 0:
return upgrade(upgradeV0toV1(config));
default:
return config;
}
} }
module.exports = { module.exports = {
version: settingsVersion, version: defaultPreferences.version,
upgrade, upgrade,
readFileSync(configFile) { readFileSync(configFile) {
var config = JSON.parse(fs.readFileSync(configFile, 'utf8')); const config = JSON.parse(fs.readFileSync(configFile, 'utf8'));
if (config.version === defaultPreferences.version) {
// need to be able to compare 1 to '1' const defaultConfig = loadDefault();
if (config.version == settingsVersion) { // eslint-disable-line return merge(defaultConfig, config);
var defaultConfig = this.loadDefault();
config = merge(defaultConfig, config);
} }
return config; return config;
}, },
writeFile(configFile, config, callback) { writeFile(configFile, config, callback) {
// need to be able to compare 1 to '1' if (config.version !== defaultPreferences.version) {
if (config.version != settingsVersion) { // eslint-disable-line throw new Error('version ' + config.version + ' is not equal to ' + defaultPreferences.version);
throw new Error('version ' + config.version + ' is not equal to ' + settingsVersion);
} }
var data = JSON.stringify(config, null, ' '); var data = JSON.stringify(config, null, ' ');
fs.writeFile(configFile, data, 'utf8', callback); fs.writeFile(configFile, data, 'utf8', callback);
}, },
writeFileSync(configFile, config) { writeFileSync(configFile, config) {
// need to be able to compare 1 to '1' if (config.version !== defaultPreferences.version) {
if (config.version != settingsVersion) { // eslint-disable-line throw new Error('version ' + config.version + ' is not equal to ' + defaultPreferences.version);
throw new Error('version ' + config.version + ' is not equal to ' + settingsVersion);
} }
const dir = path.dirname(configFile); const dir = path.dirname(configFile);
@ -96,5 +62,14 @@ module.exports = {
fs.writeFileSync(configFile, data, 'utf8'); 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;
}
}; };

View file

@ -69,7 +69,7 @@ try {
config = settings.readFileSync(configFile); config = settings.readFileSync(configFile);
if (config.version !== settings.version || wasUpdated()) { if (config.version !== settings.version || wasUpdated()) {
clearAppCache(); clearAppCache();
config = settings.upgrade(config, app.getVersion()); config = settings.upgrade(config);
settings.writeFileSync(configFile, config); settings.writeFileSync(configFile, config);
} }
} catch (e) { } catch (e) {

View file

@ -1,6 +1,8 @@
'use strict'; 'use strict';
const electron = require('electron'); const electron = require('electron');
const settings = require('../../common/settings');
const buildConfig = require('../../common/config/buildConfig');
const Menu = electron.Menu; const Menu = electron.Menu;
@ -173,13 +175,14 @@ function createTemplate(mainWindow, config, isDev) {
}] }]
}); });
const teams = settings.mergeDefaultTeams(config.teams);
const windowMenu = { const windowMenu = {
label: '&Window', label: '&Window',
submenu: [{ submenu: [{
role: 'minimize' role: 'minimize'
}, { }, {
role: 'close' role: 'close'
}, separatorItem, ...config.teams.slice(0, 9).map((team, i) => { }, separatorItem, ...teams.slice(0, 9).map((team, i) => {
return { return {
label: team.name, label: team.name,
accelerator: `CmdOrCtrl+${i + 1}`, accelerator: `CmdOrCtrl+${i + 1}`,
@ -194,23 +197,23 @@ function createTemplate(mainWindow, config, isDev) {
click() { click() {
mainWindow.webContents.send('select-next-tab'); mainWindow.webContents.send('select-next-tab');
}, },
enabled: (config.teams.length > 1) enabled: (teams.length > 1)
}, { }, {
label: 'Select Previous Server', label: 'Select Previous Server',
accelerator: 'Ctrl+Shift+Tab', accelerator: 'Ctrl+Shift+Tab',
click() { click() {
mainWindow.webContents.send('select-previous-tab'); mainWindow.webContents.send('select-previous-tab');
}, },
enabled: (config.teams.length > 1) enabled: (teams.length > 1)
}] }]
}; };
template.push(windowMenu); template.push(windowMenu);
var submenu = []; var submenu = [];
if (config.helpLink) { if (buildConfig.helpLink) {
submenu.push({ submenu.push({
label: 'Learn More...', label: 'Learn More...',
click() { click() {
electron.shell.openExternal(config.helpLink); electron.shell.openExternal(buildConfig.helpLink);
} }
}); });
submenu.push(separatorItem); submenu.push(separatorItem);

View file

@ -4,11 +4,13 @@ const {
app, app,
Menu Menu
} = require('electron'); } = require('electron');
const settings = require('../../common/settings');
function createTemplate(mainWindow, config, isDev) { function createTemplate(mainWindow, config, isDev) {
const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${app.getAppPath()}/browser/settings.html`; const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${app.getAppPath()}/browser/settings.html`;
const teams = settings.mergeDefaultTeams(config.teams);
var template = [ var template = [
...config.teams.slice(0, 9).map((team, i) => { ...teams.slice(0, 9).map((team, i) => {
return { return {
label: team.name, label: team.name,
click: () => { click: () => {