const React = require('react');
const ReactDOM = require('react-dom');
const {Button, Checkbox, Col, FormGroup, Grid, HelpBlock, Navbar, Radio, Row} = require('react-bootstrap');
const {ipcRenderer, remote} = require('electron');
const AutoLaunch = require('auto-launch');
const {debounce} = require('underscore');
const settings = require('../../common/settings');
const TeamList = require('./TeamList.jsx');
const AutoSaveIndicator = require('./AutoSaveIndicator.jsx');
const appLauncher = new AutoLaunch({
name: 'Mattermost',
isHidden: true
});
function backToIndex(index) {
const target = typeof index === 'undefined' ? 0 : index;
const indexURL = remote.getGlobal('isDev') ? 'http://localhost:8080/browser/index.html' : `file://${remote.app.getAppPath()}/browser/index.html`;
remote.getCurrentWindow().loadURL(`${indexURL}?index=${target}`);
}
const SettingsPage = React.createClass({
propTypes: {
configFile: React.PropTypes.string
},
getInitialState() {
var initialState;
try {
initialState = settings.readFileSync(this.props.configFile);
} catch (e) {
initialState = settings.loadDefault();
}
initialState.showAddTeamForm = false;
initialState.trayWasVisible = remote.getCurrentWindow().trayWasVisible;
initialState.disableClose = initialState.teams.length === 0;
if (initialState.teams.length === 0) {
initialState.showAddTeamForm = true;
}
initialState.savingState = 'done';
return initialState;
},
componentDidMount() {
if (process.platform === 'win32' || process.platform === 'linux') {
var self = this;
appLauncher.isEnabled().then((enabled) => {
self.setState({
autostart: enabled
});
});
}
ipcRenderer.on('add-server', () => {
this.setState({
showAddTeamForm: true
});
});
ipcRenderer.on('switch-tab', (event, key) => {
backToIndex(key);
});
},
setSavingState(state) {
if (!this.setSavingStateSaved) {
this.setSavingStateSaved = debounce(() => {
this.saveConfig((err) => {
if (err) {
this.setState({savingState: 'error'});
} else {
this.setState({savingState: 'saved'});
}
this.setSavingStateDoneTimer = setTimeout(this.setState.bind(this, {savingState: 'done'}), 2000);
});
}, 500);
}
if (this.setSavingStateDoneTimer) {
clearTimeout(this.setSavingStateDoneTimer);
this.setSavingStateDoneTimer = null;
}
this.setState({savingState: state});
if (state === 'saving') {
this.setSavingStateSaved();
}
},
startSaveConfig() {
this.setSavingState('saving');
},
handleTeamsChange(teams) {
this.setState({
showAddTeamForm: false,
teams
});
if (teams.length === 0) {
this.setState({showAddTeamForm: true});
}
setImmediate(this.startSaveConfig);
},
saveConfig(callback) {
var config = {
teams: this.state.teams,
showTrayIcon: this.state.showTrayIcon,
trayIconTheme: this.state.trayIconTheme,
version: settings.version,
minimizeToTray: this.state.minimizeToTray,
notifications: {
flashWindow: this.state.notifications.flashWindow
},
showUnreadBadge: this.state.showUnreadBadge
};
settings.writeFile(this.props.configFile, config, (err) => {
if (err) {
callback(err);
return;
}
ipcRenderer.send('update-menu', config);
ipcRenderer.send('update-config');
if (process.platform === 'win32' || process.platform === 'linux') {
const autostart = this.state.autostart;
this.saveAutoStart(autostart, callback);
} else {
callback();
}
});
},
saveAutoStart(autostart, callback) {
appLauncher.isEnabled().then((enabled) => {
if (enabled && !autostart) {
appLauncher.disable().then(() => {
callback();
}).catch(callback);
} else if (!enabled && autostart) {
appLauncher.enable().then(() => {
callback();
}).catch(callback);
} else {
callback();
}
}).catch(callback);
},
handleCancel() {
backToIndex();
},
handleChangeShowTrayIcon() {
var shouldShowTrayIcon = !this.refs.showTrayIcon.props.checked;
this.setState({
showTrayIcon: shouldShowTrayIcon
});
if (process.platform === 'darwin' && !shouldShowTrayIcon) {
this.setState({
minimizeToTray: false
});
}
setImmediate(this.startSaveConfig);
},
handleChangeTrayIconTheme() {
this.setState({
trayIconTheme: ReactDOM.findDOMNode(this.refs.trayIconTheme).value
});
setImmediate(this.startSaveConfig);
},
handleChangeAutoStart() {
this.setState({
autostart: !this.refs.autostart.props.checked
});
setImmediate(this.startSaveConfig);
},
handleChangeMinimizeToTray() {
const shouldMinimizeToTray = this.state.showTrayIcon && !this.refs.minimizeToTray.props.checked;
this.setState({
minimizeToTray: shouldMinimizeToTray
});
setImmediate(this.startSaveConfig);
},
toggleShowTeamForm() {
this.setState({
showAddTeamForm: !this.state.showAddTeamForm
});
},
setShowTeamFormVisibility(val) {
this.setState({
showAddTeamForm: val
});
},
handleFlashWindow() {
this.setState({
notifications: {
flashWindow: this.refs.flashWindow.props.checked ? 0 : 2
}
});
setImmediate(this.startSaveConfig);
},
handleShowUnreadBadge() {
this.setState({
showUnreadBadge: !this.refs.showUnreadBadge.props.checked
});
setImmediate(this.startSaveConfig);
},
updateTeam(index, newData) {
var teams = this.state.teams;
teams[index] = newData;
this.setState({
teams
});
setImmediate(this.startSaveConfig);
},
addServer(team) {
var teams = this.state.teams;
teams.push(team);
this.setState({
teams
});
setImmediate(this.startSaveConfig);
},
render() {
var teamsRow = (
{'App Options'}
{ options.map((opt, i) => (