mattermost-desktop/src/browser/components/SettingsPage.jsx

441 lines
12 KiB
React
Raw Normal View History

2016-11-01 07:46:13 -07:00
const React = require('react');
const ReactDOM = require('react-dom');
2017-02-01 08:19:46 -08:00
const {Button, Checkbox, Col, FormGroup, Grid, HelpBlock, Navbar, Radio, Row} = require('react-bootstrap');
2016-11-01 07:46:13 -07:00
const {ipcRenderer, remote} = require('electron');
const AutoLaunch = require('auto-launch');
const settings = require('../../common/settings');
const TeamList = require('./TeamList.jsx');
const appLauncher = new AutoLaunch({
name: 'Mattermost',
isHidden: true
});
function backToIndex(index) {
const target = typeof index === 'undefined' ? 0 : index;
remote.getCurrentWindow().loadURL(`file://${__dirname}/index.html?index=${target}`);
2016-11-01 07:46:13 -07:00
}
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;
}
2016-11-01 07:46:13 -07:00
return initialState;
},
componentDidMount() {
if (process.platform === 'win32' || process.platform === 'linux') {
var self = this;
appLauncher.isEnabled().then((enabled) => {
self.setState({
autostart: enabled
});
});
}
2017-01-30 13:16:16 -08:00
ipcRenderer.on('add-server', () => {
this.setState({
showAddTeamForm: true
});
});
2016-11-01 07:46:13 -07:00
},
handleTeamsChange(teams) {
this.setState({
showAddTeamForm: false,
teams
});
if (teams.length === 0) {
this.setState({showAddTeamForm: true});
}
2016-11-01 07:46:13 -07:00
},
handleSave() {
var config = {
teams: this.state.teams,
showTrayIcon: this.state.showTrayIcon,
trayIconTheme: this.state.trayIconTheme,
disablewebsecurity: this.state.disablewebsecurity,
version: settings.version,
minimizeToTray: this.state.minimizeToTray,
notifications: {
flashWindow: this.state.notifications.flashWindow
},
showUnreadBadge: this.state.showUnreadBadge
};
settings.writeFileSync(this.props.configFile, config);
if (process.platform === 'win32' || process.platform === 'linux') {
var autostart = this.state.autostart;
appLauncher.isEnabled().then((enabled) => {
if (enabled && !autostart) {
appLauncher.disable();
} else if (!enabled && autostart) {
appLauncher.enable();
}
});
}
ipcRenderer.send('update-menu', config);
ipcRenderer.send('update-config');
backToIndex();
},
handleCancel() {
backToIndex();
},
handleChangeDisableWebSecurity() {
this.setState({
disablewebsecurity: this.refs.disablewebsecurity.props.checked
2016-11-01 07:46:13 -07:00
});
},
handleChangeShowTrayIcon() {
2016-11-02 08:35:07 -07:00
var shouldShowTrayIcon = !this.refs.showTrayIcon.props.checked;
2016-11-01 07:46:13 -07:00
this.setState({
showTrayIcon: shouldShowTrayIcon
});
if (process.platform === 'darwin' && !shouldShowTrayIcon) {
this.setState({
minimizeToTray: false
});
}
},
handleChangeTrayIconTheme() {
this.setState({
trayIconTheme: ReactDOM.findDOMNode(this.refs.trayIconTheme).value
2016-11-01 07:46:13 -07:00
});
},
handleChangeAutoStart() {
this.setState({
2016-11-02 08:35:07 -07:00
autostart: !this.refs.autostart.props.checked
2016-11-01 07:46:13 -07:00
});
},
handleChangeMinimizeToTray() {
const shouldMinimizeToTray = this.state.showTrayIcon && !this.refs.minimizeToTray.props.checked;
2016-11-01 07:46:13 -07:00
this.setState({
minimizeToTray: shouldMinimizeToTray
});
},
toggleShowTeamForm() {
this.setState({
showAddTeamForm: !this.state.showAddTeamForm
});
},
setShowTeamFormVisibility(val) {
this.setState({
showAddTeamForm: val
});
},
2016-11-01 07:46:13 -07:00
handleFlashWindow() {
this.setState({
notifications: {
2016-11-02 08:35:07 -07:00
flashWindow: this.refs.flashWindow.props.checked ? 0 : 2
2016-11-01 07:46:13 -07:00
}
});
},
handleShowUnreadBadge() {
this.setState({
2016-11-02 08:35:07 -07:00
showUnreadBadge: !this.refs.showUnreadBadge.props.checked
2016-11-01 07:46:13 -07:00
});
},
updateTeam(index, newData) {
var teams = this.state.teams;
teams[index] = newData;
this.setState({
teams
});
},
2017-01-30 13:16:16 -08:00
addServer(team) {
var teams = this.state.teams;
teams.push(team);
this.setState({
teams
});
},
2016-11-01 07:46:13 -07:00
render() {
var teamsRow = (
<Row>
<Col md={12}>
<TeamList
teams={this.state.teams}
showAddTeamForm={this.state.showAddTeamForm}
toggleAddTeamForm={this.toggleShowTeamForm}
setAddTeamFormVisibility={this.setShowTeamFormVisibility}
2016-11-01 07:46:13 -07:00
onTeamsChange={this.handleTeamsChange}
updateTeam={this.updateTeam}
2017-01-30 13:16:16 -08:00
addServer={this.addServer}
onTeamClick={backToIndex}
2016-11-01 07:46:13 -07:00
/>
</Col>
</Row>
);
var options = [];
// MacOS has an option in the Dock, to set the app to autostart, so we choose to not support this option for OSX
2016-11-01 07:46:13 -07:00
if (process.platform === 'win32' || process.platform === 'linux') {
options.push(
2016-11-02 08:35:07 -07:00
<Checkbox
2016-11-01 07:46:13 -07:00
key='inputAutoStart'
id='inputAutoStart'
ref='autostart'
checked={this.state.autostart}
onChange={this.handleChangeAutoStart}
>{'Start app on login'}
<HelpBlock>
2017-02-12 14:26:34 -08:00
{'If enabled, the app starts automatically when you log in to your machine.'}
{' '}
{'The app will initially start minimized and appear on the taskbar.'}
</HelpBlock>
</Checkbox>);
2016-11-01 07:46:13 -07:00
}
options.push(
<Checkbox
key='inputDisableWebSecurity'
id='inputDisableWebSecurity'
ref='disablewebsecurity'
checked={!this.state.disablewebsecurity}
onChange={this.handleChangeDisableWebSecurity}
>{'Display secure content only'}
<HelpBlock>
2017-02-12 14:26:34 -08:00
{'If enabled, the app only displays secure (HTTPS/SSL) content.'}
{' '}
2017-02-12 14:26:34 -08:00
{'If disabled, the app displays secure and non-secure (HTTP) content such as images.'}
</HelpBlock>
</Checkbox>);
2016-11-01 07:46:13 -07:00
if (process.platform === 'darwin' || process.platform === 'win32') {
options.push(
2016-11-02 08:35:07 -07:00
<Checkbox
2016-11-01 07:46:13 -07:00
key='inputShowUnreadBadge'
id='inputShowUnreadBadge'
ref='showUnreadBadge'
checked={this.state.showUnreadBadge}
onChange={this.handleShowUnreadBadge}
>{'Show red badge on taskbar icon to indicate unread messages'}
<HelpBlock>
{'Regardless of this setting, mentions are always indicated with a red badge and item count on the taskbar icon.'}
</HelpBlock>
</Checkbox>);
2016-11-01 07:46:13 -07:00
}
if (process.platform === 'win32' || process.platform === 'linux') {
options.push(
2016-11-02 08:35:07 -07:00
<Checkbox
2016-11-01 07:46:13 -07:00
key='flashWindow'
id='inputflashWindow'
ref='flashWindow'
checked={this.state.notifications.flashWindow === 2}
onChange={this.handleFlashWindow}
>{'Flash taskbar icon when a new message is received'}
<HelpBlock>
2017-02-12 14:26:34 -08:00
{'If enabled, taskbar icon flashes for a few seconds when a new message is received.'}
</HelpBlock>
</Checkbox>);
}
2016-11-01 07:46:13 -07:00
if (process.platform === 'darwin' || process.platform === 'linux') {
options.push(
2016-11-02 08:35:07 -07:00
<Checkbox
2016-11-01 07:46:13 -07:00
key='inputShowTrayIcon'
id='inputShowTrayIcon'
ref='showTrayIcon'
checked={this.state.showTrayIcon}
onChange={this.handleChangeShowTrayIcon}
2016-11-02 08:35:07 -07:00
>{process.platform === 'darwin' ?
'Show Mattermost icon in the menu bar' :
'Show icon in the notification area'}
<HelpBlock>
{'Setting takes effect after restarting the app.'}
</HelpBlock>
</Checkbox>);
2016-11-01 07:46:13 -07:00
}
if (process.platform === 'linux') {
options.push(
<FormGroup
key='trayIconTheme'
style={{marginLeft: '20px'}}
>
{'Icon theme: '}
<Radio
inline={true}
name='trayIconTheme'
value='light'
defaultChecked={this.state.trayIconTheme === 'light' || this.state.trayIconTheme === ''}
onChange={() => {
this.setState({trayIconTheme: 'light'});
}}
>{'Light'}</Radio>
{' '}
<Radio
inline={true}
name='trayIconTheme'
value='dark'
defaultChecked={this.state.trayIconTheme === 'dark'}
onChange={() => {
this.setState({trayIconTheme: 'dark'});
}}
>{'Dark'}</Radio>
</FormGroup>
);
2016-11-01 07:46:13 -07:00
}
2017-02-01 06:32:07 -08:00
if (process.platform === 'linux') {
2016-11-01 07:46:13 -07:00
options.push(
2016-11-02 08:35:07 -07:00
<Checkbox
2016-11-01 07:46:13 -07:00
key='inputMinimizeToTray'
id='inputMinimizeToTray'
ref='minimizeToTray'
disabled={!this.state.showTrayIcon || !this.state.trayWasVisible}
checked={this.state.minimizeToTray}
onChange={this.handleChangeMinimizeToTray}
>
{'Leave app running in notification area when application window is closed'}
<HelpBlock>
2017-02-12 14:26:34 -08:00
{'If enabled, the app stays running in the notification area after app window is closed.'}
{this.state.trayWasVisible || !this.state.showTrayIcon ? '' : ' Setting takes effect after restarting the app.'}
</HelpBlock>
</Checkbox>);
2016-11-01 07:46:13 -07:00
}
const settingsPage = {
navbar: {
backgroundColor: '#fff'
},
close: {
textDecoration: 'none',
2016-11-01 07:46:13 -07:00
position: 'absolute',
right: '0',
top: '5px',
2016-11-01 07:46:13 -07:00
fontSize: '35px',
fontWeight: 'normal',
color: '#bbb'
2016-11-01 07:46:13 -07:00
},
heading: {
textAlign: 'center',
fontSize: '24px',
margin: '0',
padding: '1em 0'
},
sectionHeading: {
fontSize: '20px',
margin: '0',
padding: '1em 0'
},
sectionHeadingLink: {
marginTop: '24px',
display: 'inline-block',
fontSize: '15px'
},
footer: {
padding: '0.4em 0'
}
};
var optionsRow = (options.length > 0) ? (
<Row>
<Col md={12}>
2017-02-03 04:15:07 -08:00
<h2 style={settingsPage.sectionHeading}>{'App Options'}</h2>
2016-11-02 08:35:07 -07:00
{ options.map((opt, i) => (
<FormGroup key={`fromGroup${i}`}>
{opt}
</FormGroup>
)) }
2016-11-01 07:46:13 -07:00
</Col>
</Row>
) : null;
return (
<div>
<Navbar
className='navbar-fixed-top'
style={settingsPage.navbar}
>
<div style={{position: 'relative'}}>
<h1 style={settingsPage.heading}>{'Settings'}</h1>
<Button
bsStyle='link'
2016-11-01 07:46:13 -07:00
style={settingsPage.close}
onClick={this.handleCancel}
disabled={this.state.disableClose}
2016-11-01 07:46:13 -07:00
>
<span>{'×'}</span>
</Button>
2016-11-01 07:46:13 -07:00
</div>
</Navbar>
<Grid
className='settingsPage'
style={{padding: '100px 15px'}}
>
<Row>
<Col
md={10}
xs={8}
>
2017-01-27 05:50:17 -08:00
<h2 style={settingsPage.sectionHeading}>{'Server Management'}</h2>
2016-11-01 07:46:13 -07:00
</Col>
<Col
md={2}
xs={4}
>
<p className='text-right'>
<a
style={settingsPage.sectionHeadingLink}
id='addNewServer'
2016-11-01 07:46:13 -07:00
href='#'
onClick={this.toggleShowTeamForm}
2017-01-27 05:50:17 -08:00
>{'⊞ Add new server'}</a>
2016-11-01 07:46:13 -07:00
</p>
</Col>
</Row>
{ teamsRow }
<hr/>
{ optionsRow }
</Grid>
<Navbar className='navbar-fixed-bottom'>
<div
className='text-right'
style={settingsPage.footer}
>
2016-11-02 08:35:07 -07:00
<Button
2016-11-01 07:46:13 -07:00
id='btnCancel'
2016-11-02 08:35:07 -07:00
className='btn-link'
2016-11-01 07:46:13 -07:00
onClick={this.handleCancel}
2016-11-02 08:35:07 -07:00
>{'Cancel'}</Button>
2016-11-01 07:46:13 -07:00
{ ' ' }
2016-11-02 08:35:07 -07:00
<Button
2016-11-01 07:46:13 -07:00
id='btnSave'
2016-11-02 08:35:07 -07:00
className='navbar-btn'
2016-11-01 07:46:13 -07:00
bsStyle='primary'
onClick={this.handleSave}
disabled={this.state.teams.length === 0}
2016-11-02 08:35:07 -07:00
>{'Save'}</Button>
2016-11-01 07:46:13 -07:00
</div>
</Navbar>
</div>
);
}
});
module.exports = SettingsPage;