const React = require('react'); const ReactDOM = require('react-dom'); const {Button, Checkbox, Col, FormGroup, FormControl, ControlLabel, Grid, Navbar, Row} = require('react-bootstrap'); 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() { remote.getCurrentWindow().loadURL('file://' + __dirname + '/index.html'); } 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; return initialState; }, componentDidMount() { if (process.platform === 'win32' || process.platform === 'linux') { var self = this; appLauncher.isEnabled().then((enabled) => { self.setState({ autostart: enabled }); }); } }, handleTeamsChange(teams) { this.setState({ showAddTeamForm: false, teams }); }, handleSave() { var config = { teams: this.state.teams, hideMenuBar: this.state.hideMenuBar, showTrayIcon: this.state.showTrayIcon, trayIconTheme: this.state.trayIconTheme, disablewebsecurity: this.state.disablewebsecurity, version: settings.version, minimizeToTray: this.state.minimizeToTray, toggleWindowOnTrayIconClick: this.state.toggleWindowOnTrayIconClick, notifications: { flashWindow: this.state.notifications.flashWindow }, showUnreadBadge: this.state.showUnreadBadge }; settings.writeFileSync(this.props.configFile, config); if (process.platform === 'win32' || process.platform === 'linux') { var currentWindow = remote.getCurrentWindow(); currentWindow.setAutoHideMenuBar(config.hideMenuBar); currentWindow.setMenuBarVisibility(!config.hideMenuBar); 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(); }, handleClose(e) { let savedConfig; try { savedConfig = settings.readFileSync(this.props.configFile); } catch (err) { savedConfig = settings.loadDefault(); } if (savedConfig.teams.length === 0) { e.preventDefault(); } else { backToIndex(); } }, handleChangeDisableWebSecurity() { this.setState({ disablewebsecurity: !this.refs.disablewebsecurity.props.checked }); }, handleChangeHideMenuBar() { this.setState({ hideMenuBar: !this.refs.hideMenuBar.props.checked }); }, handleChangeShowTrayIcon() { var shouldShowTrayIcon = !this.refs.showTrayIcon.props.checked; this.setState({ showTrayIcon: shouldShowTrayIcon }); if (process.platform === 'darwin' && !shouldShowTrayIcon) { this.setState({ minimizeToTray: false }); } }, handleChangeTrayIconTheme() { this.setState({ trayIconTheme: ReactDOM.findDOMNode(this.refs.trayIconTheme).value }); }, handleChangeAutoStart() { this.setState({ autostart: !this.refs.autostart.props.checked }); }, handleChangeMinimizeToTray() { const shouldMinimizeToTray = this.state.showTrayIcon && !this.refs.minimizeToTray.props.checked; this.setState({ minimizeToTray: shouldMinimizeToTray }); }, handleChangeToggleWindowOnTrayIconClick() { this.setState({ toggleWindowOnTrayIconClick: !this.refs.toggleWindowOnTrayIconClick.props.checked }); }, toggleShowTeamForm() { this.setState({ showAddTeamForm: !this.state.showAddTeamForm }); }, handleFlashWindow() { this.setState({ notifications: { flashWindow: this.refs.flashWindow.props.checked ? 0 : 2 } }); }, handleShowUnreadBadge() { this.setState({ showUnreadBadge: !this.refs.showUnreadBadge.props.checked }); }, render() { var teamsRow = ( ); var options = []; if (process.platform === 'win32' || process.platform === 'linux') { options.push( {'Hide menu bar (Press Alt to show menu bar)'}); } if (process.platform === 'darwin' || process.platform === 'linux') { options.push( {process.platform === 'darwin' ? 'Show icon on menu bar (need to restart the application)' : 'Show icon in notification area (need to restart the application)'}); } if (process.platform === 'linux') { options.push( {'Icon theme (Need to restart the application)'} ); } options.push( {'Allow mixed content (Enabling allows both secure and insecure content, images and scripts to render and execute. Disabling allows only secure content.)'}); //OSX has an option in the Dock, to set the app to autostart, so we choose to not support this option for OSX if (process.platform === 'win32' || process.platform === 'linux') { options.push( {'Start app on login.'}); } if (process.platform === 'darwin' || process.platform === 'linux') { options.push( {this.state.trayWasVisible || !this.state.showTrayIcon ? 'Leave app running in notification area when the window is closed' : 'Leave app running in notification area when the window is closed (available on next restart)'}); } if (process.platform === 'win32') { options.push( {'Toggle window visibility when clicking on the tray icon.'}); } if (process.platform === 'darwin' || process.platform === 'win32') { options.push( {'Show red badge on taskbar icon to indicate unread messages. Regardless of this setting, mentions are always indicated with a red badge and item count on the taskbar icon.'}); } if (process.platform === 'win32' || process.platform === 'linux') { options.push( {'Flash the taskbar icon when a new message is received.'}); } const settingsPage = { navbar: { backgroundColor: '#fff' }, close: { position: 'absolute', right: '0', top: '10px', fontSize: '35px', fontWeight: 'normal', color: '#bbb', cursor: 'pointer' }, 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) ? (

{'App options'}

{ options.map((opt, i) => ( {opt} )) }
) : null; return (

{'Settings'}

{'×'}

{'Server Management'}

{'⊞ Add new server'}

{ teamsRow }
{ optionsRow }
{ ' ' }
); } }); module.exports = SettingsPage;