diff --git a/browser/main/StatusBar/index.js b/browser/main/StatusBar/index.js index 2106a2305..49c1b40c9 100644 --- a/browser/main/StatusBar/index.js +++ b/browser/main/StatusBar/index.js @@ -63,7 +63,7 @@ class StatusBar extends React.Component { {status.updateReady ? + : null } diff --git a/browser/main/modals/PreferencesModal/ConfigTab.styl b/browser/main/modals/PreferencesModal/ConfigTab.styl index f9115c621..a488c4b31 100644 --- a/browser/main/modals/PreferencesModal/ConfigTab.styl +++ b/browser/main/modals/PreferencesModal/ConfigTab.styl @@ -76,8 +76,8 @@ color #1EC38B .error color red - - + .warning + color #FFA500 .group-control-leftButton colorDefaultButton() diff --git a/browser/main/modals/PreferencesModal/HotkeyTab.js b/browser/main/modals/PreferencesModal/HotkeyTab.js index 9a15e79f7..4b4a30606 100644 --- a/browser/main/modals/PreferencesModal/HotkeyTab.js +++ b/browser/main/modals/PreferencesModal/HotkeyTab.js @@ -32,6 +32,7 @@ class HotkeyTab extends React.Component { message: err.message != null ? err.message : 'Error occurs!' }}) } + this.oldHotkey = this.state.config.hotkey ipc.addListener('APP_SETTING_DONE', this.handleSettingDone) ipc.addListener('APP_SETTING_ERROR', this.handleSettingError) } @@ -53,6 +54,7 @@ class HotkeyTab extends React.Component { config: newConfig }) this.clearMessage() + this.props.haveToSave() } handleHintToggleButtonClick (e) { @@ -70,6 +72,15 @@ class HotkeyTab extends React.Component { this.setState({ config }) + if (_.isEqual(this.oldHotkey, config.hotkey)) { + this.props.haveToSave() + } else { + this.props.haveToSave({ + tab: 'Hotkey', + type: 'warning', + message: 'You have to save!' + }) + } } clearMessage () { @@ -161,7 +172,8 @@ class HotkeyTab extends React.Component { } HotkeyTab.propTypes = { - dispatch: PropTypes.func + dispatch: PropTypes.func, + haveToSave: PropTypes.func } export default CSSModules(HotkeyTab, styles) diff --git a/browser/main/modals/PreferencesModal/PreferencesModal.styl b/browser/main/modals/PreferencesModal/PreferencesModal.styl index b0d893126..697fb50de 100644 --- a/browser/main/modals/PreferencesModal/PreferencesModal.styl +++ b/browser/main/modals/PreferencesModal/PreferencesModal.styl @@ -42,6 +42,8 @@ top-bar--height = 50px background-color transparent color $ui-text-color font-size 16px + .saving--warning + haveToSave() .nav-button--active @extend .nav-button @@ -49,6 +51,8 @@ top-bar--height = 50px background-color $ui-button--active-backgroundColor &:hover color $ui-text-color + .saving--warning + haveToSave() .nav-button-icon display block diff --git a/browser/main/modals/PreferencesModal/Tab.styl b/browser/main/modals/PreferencesModal/Tab.styl index e5fc48da1..a316f3ebd 100644 --- a/browser/main/modals/PreferencesModal/Tab.styl +++ b/browser/main/modals/PreferencesModal/Tab.styl @@ -20,3 +20,8 @@ $tab--dark-text-color = #E5E5E5 body[data-theme="dark"] .header color $tab--dark-text-color + +haveToSave() + color #FFA500 + font-size 10px + margin-top 3px \ No newline at end of file diff --git a/browser/main/modals/PreferencesModal/UiTab.js b/browser/main/modals/PreferencesModal/UiTab.js index eebb2e0c3..d5d54b75e 100644 --- a/browser/main/modals/PreferencesModal/UiTab.js +++ b/browser/main/modals/PreferencesModal/UiTab.js @@ -7,11 +7,10 @@ import store from 'browser/main/store' import consts from 'browser/lib/consts' import ReactCodeMirror from 'react-codemirror' import CodeMirror from 'codemirror' +import _ from 'lodash' const OSX = global.process.platform === 'darwin' -import _ from 'lodash' - const electron = require('electron') const ipc = electron.ipcRenderer @@ -91,8 +90,19 @@ class UiTab extends React.Component { if (newCodemirrorTheme !== codemirrorTheme) { checkHighLight.setAttribute('href', `../node_modules/codemirror/theme/${newCodemirrorTheme.split(' ')[0]}.css`) } - - this.setState({ config: newConfig, codemirrorTheme: newCodemirrorTheme }) + this.setState({ config: newConfig, codemirrorTheme: newCodemirrorTheme }, () => { + const {ui, editor, preview} = this.props.config + this.currentConfig = {ui, editor, preview} + if (_.isEqual(this.currentConfig, this.state.config)) { + this.props.haveToSave() + } else { + this.props.haveToSave({ + tab: 'UI', + type: 'warning', + message: 'You have to save!' + }) + } + }) } handleSaveUIClick (e) { @@ -109,6 +119,7 @@ class UiTab extends React.Component { config: newConfig }) this.clearMessage() + this.props.haveToSave() } clearMessage () { @@ -346,7 +357,8 @@ UiTab.propTypes = { user: PropTypes.shape({ name: PropTypes.string }), - dispatch: PropTypes.func + dispatch: PropTypes.func, + haveToSave: PropTypes.func } export default CSSModules(UiTab, styles) diff --git a/browser/main/modals/PreferencesModal/index.js b/browser/main/modals/PreferencesModal/index.js index 2fff0364f..09885e1cd 100644 --- a/browser/main/modals/PreferencesModal/index.js +++ b/browser/main/modals/PreferencesModal/index.js @@ -17,7 +17,9 @@ class Preferences extends React.Component { super(props) this.state = { - currentTab: 'STORAGES' + currentTab: 'STORAGES', + UIAlert: '', + HotkeyAlert: '' } } @@ -58,6 +60,7 @@ class Preferences extends React.Component { this.setState({HotkeyAlert: alert})} /> ) case 'UI': @@ -65,6 +68,7 @@ class Preferences extends React.Component { this.setState({UIAlert: alert})} /> ) case 'CROWDFUNDING': @@ -94,19 +98,26 @@ class Preferences extends React.Component { return node.getBoundingClientRect() } + haveToSaveNotif (type, message) { + return ( +

{message}

+ ) + } + render () { const content = this.renderContent() const tabs = [ {target: 'STORAGES', label: 'Storages'}, - {target: 'HOTKEY', label: 'Hotkey'}, - {target: 'UI', label: 'UI'}, + {target: 'HOTKEY', label: 'Hotkey', Hotkey: this.state.HotkeyAlert}, + {target: 'UI', label: 'UI', UI: this.state.UIAlert}, {target: 'INFO', label: 'Community / Info'}, {target: 'CROWDFUNDING', label: 'Crowdfunding'} ] const navButtons = tabs.map((tab) => { const isActive = this.state.currentTab === tab.target + const isUiHotkeyTab = _.isObject(tab[tab.label]) && tab.label === tab[tab.label].tab return ( ) })