Simplify and split config.json into defaultPreferences and buildConfig
This commit is contained in:
parent
73a7476de8
commit
3613f70a72
|
@ -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>
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
19
src/common/config/buildConfig.js
Normal file
19
src/common/config/buildConfig.js
Normal 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;
|
20
src/common/config/defaultPreferences.js
Normal file
20
src/common/config/defaultPreferences.js
Normal 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;
|
|
@ -1,3 +0,0 @@
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
10
src/common/config/pastDefaultPreferences.js
Normal file
10
src/common/config/pastDefaultPreferences.js
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
const defaultPreferences = require('./defaultPreferences');
|
||||||
|
|
||||||
|
const pastDefaultPreferences = {
|
||||||
|
1: defaultPreferences,
|
||||||
|
0: {
|
||||||
|
url: ''
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = pastDefaultPreferences;
|
29
src/common/config/upgradePreferences.js
Normal file
29
src/common/config/upgradePreferences.js
Normal 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;
|
|
@ -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;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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: () => {
|
||||||
|
|
Loading…
Reference in a new issue