From 1839eff4fcad186871672499b6c3cc68e9539ce2 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Thu, 9 Nov 2017 12:11:16 +0100 Subject: feat(Service): Add option to display disabled services in tabs --- src/components/services/content/ServiceDisabled.js | 48 +++++++++++++++++++ src/components/services/content/ServiceWebview.js | 56 ++++++++++++++-------- src/components/services/content/Services.js | 9 ++++ .../services/content/WebviewCrashHandler.js | 2 +- src/components/services/tabs/TabBarSortableList.js | 3 ++ src/components/services/tabs/TabItem.js | 11 ++++- src/components/services/tabs/Tabbar.js | 15 ++++-- .../settings/settings/EditSettingsForm.js | 6 +++ src/config.js | 3 +- src/containers/layout/AppLayoutContainer.js | 6 +-- src/containers/settings/EditSettingsScreen.js | 10 ++++ src/i18n/locales/en-US.json | 7 ++- src/stores/ServicesStore.js | 34 +++++++------ src/stores/SettingsStore.js | 3 +- src/styles/services.scss | 4 ++ src/styles/tabs.scss | 6 +++ 16 files changed, 172 insertions(+), 51 deletions(-) create mode 100644 src/components/services/content/ServiceDisabled.js diff --git a/src/components/services/content/ServiceDisabled.js b/src/components/services/content/ServiceDisabled.js new file mode 100644 index 000000000..732b6c003 --- /dev/null +++ b/src/components/services/content/ServiceDisabled.js @@ -0,0 +1,48 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { observer } from 'mobx-react'; +import { defineMessages, intlShape } from 'react-intl'; + +import Button from '../../ui/Button'; + +const messages = defineMessages({ + headline: { + id: 'service.disabledHandler.headline', + defaultMessage: '!!!{name} is disabled', + }, + action: { + id: 'service.disabledHandler.action', + defaultMessage: '!!!Enable {name}', + }, +}); + +@observer +export default class ServiceDisabled extends Component { + static propTypes = { + name: PropTypes.string.isRequired, + enable: PropTypes.func.isRequired, + }; + + static contextTypes = { + intl: intlShape, + }; + + countdownInterval = null; + countdownIntervalTimeout = 1000; + + render() { + const { name, enable } = this.props; + const { intl } = this.context; + + return ( +
+

{intl.formatMessage(messages.headline, { name })}

+
+ ); + } +} diff --git a/src/components/services/content/ServiceWebview.js b/src/components/services/content/ServiceWebview.js index cd59e0a8a..a71017a6e 100644 --- a/src/components/services/content/ServiceWebview.js +++ b/src/components/services/content/ServiceWebview.js @@ -8,6 +8,7 @@ import classnames from 'classnames'; import ServiceModel from '../../../models/Service'; import StatusBarTargetUrl from '../../ui/StatusBarTargetUrl'; import WebviewCrashHandler from './WebviewCrashHandler'; +import ServiceDisabled from './ServiceDisabled'; @observer export default class ServiceWebview extends Component { @@ -15,6 +16,7 @@ export default class ServiceWebview extends Component { service: PropTypes.instanceOf(ServiceModel).isRequired, setWebviewReference: PropTypes.func.isRequired, reload: PropTypes.func.isRequired, + enable: PropTypes.func.isRequired, }; static defaultProps = { @@ -56,6 +58,7 @@ export default class ServiceWebview extends Component { service, setWebviewReference, reload, + enable, } = this.props; const webviewClasses = classnames({ @@ -80,27 +83,38 @@ export default class ServiceWebview extends Component { reload={reload} /> )} - { this.webview = element; }} - - autosize - src={service.url} - preload="./webview/plugin.js" - partition={`persist:service-${service.id}`} - - onDidAttach={() => setWebviewReference({ - serviceId: service.id, - webview: this.webview.view, - })} - - onUpdateTargetUrl={this.updateTargetUrl} - - useragent={service.userAgent} - - disablewebsecurity - allowpopups - /> - {statusBar} + {!service.isEnabled && ( + + )} + {service.isEnabled && ( +
+ { this.webview = element; }} + + autosize + src={service.url} + preload="./webview/plugin.js" + partition={`persist:service-${service.id}`} + + onDidAttach={() => setWebviewReference({ + serviceId: service.id, + webview: this.webview.view, + })} + + onUpdateTargetUrl={this.updateTargetUrl} + + useragent={service.userAgent} + + disablewebsecurity + allowpopups + /> + {statusBar} +
+ )} ); } diff --git a/src/components/services/content/Services.js b/src/components/services/content/Services.js index bad525d22..5230508f7 100644 --- a/src/components/services/content/Services.js +++ b/src/components/services/content/Services.js @@ -26,6 +26,7 @@ export default class Services extends Component { handleIPCMessage: PropTypes.func.isRequired, openWindow: PropTypes.func.isRequired, reload: PropTypes.func.isRequired, + update: PropTypes.func.isRequired, }; static defaultProps = { @@ -44,6 +45,7 @@ export default class Services extends Component { setWebviewReference, openWindow, reload, + update, } = this.props; const { intl } = this.context; @@ -76,6 +78,13 @@ export default class Services extends Component { setWebviewReference={setWebviewReference} openWindow={openWindow} reload={() => reload({ serviceId: service.id })} + enable={() => update({ + serviceId: service.id, + serviceData: { + isEnabled: true, + }, + redirect: false, + })} /> ))} diff --git a/src/components/services/content/WebviewCrashHandler.js b/src/components/services/content/WebviewCrashHandler.js index 24903f3c5..d48152c18 100644 --- a/src/components/services/content/WebviewCrashHandler.js +++ b/src/components/services/content/WebviewCrashHandler.js @@ -25,7 +25,7 @@ const messages = defineMessages({ }); @observer -export default class ServiceWebview extends Component { +export default class WebviewCrashHandler extends Component { static propTypes = { name: PropTypes.string.isRequired, reload: PropTypes.func.isRequired, diff --git a/src/components/services/tabs/TabBarSortableList.js b/src/components/services/tabs/TabBarSortableList.js index e5ae36419..3340cbbbb 100644 --- a/src/components/services/tabs/TabBarSortableList.js +++ b/src/components/services/tabs/TabBarSortableList.js @@ -24,6 +24,7 @@ class TabBarSortableList extends Component { toggleNotifications: PropTypes.func.isRequired, deleteService: PropTypes.func.isRequired, disableService: PropTypes.func.isRequired, + enableService: PropTypes.func.isRequired, } static contextTypes = { @@ -38,6 +39,7 @@ class TabBarSortableList extends Component { toggleNotifications, deleteService, disableService, + enableService, openSettings, } = this.props; @@ -58,6 +60,7 @@ class TabBarSortableList extends Component { toggleNotifications={() => toggleNotifications({ serviceId: service.id })} deleteService={() => deleteService({ serviceId: service.id })} disableService={() => disableService({ serviceId: service.id })} + enableService={() => enableService({ serviceId: service.id })} openSettings={openSettings} /> ))} diff --git a/src/components/services/tabs/TabItem.js b/src/components/services/tabs/TabItem.js index 9e03d2e21..638e17d95 100644 --- a/src/components/services/tabs/TabItem.js +++ b/src/components/services/tabs/TabItem.js @@ -32,6 +32,10 @@ const messages = defineMessages({ id: 'tabs.item.disableService', defaultMessage: '!!!Disable Service', }, + enableService: { + id: 'tabs.item.enableService', + defaultMessage: '!!!Enable Service', + }, deleteService: { id: 'tabs.item.deleteService', defaultMessage: '!!!Delete Service', @@ -49,6 +53,7 @@ class TabItem extends Component { openSettings: PropTypes.func.isRequired, deleteService: PropTypes.func.isRequired, disableService: PropTypes.func.isRequired, + enableService: PropTypes.func.isRequired, }; static contextTypes = { @@ -64,6 +69,7 @@ class TabItem extends Component { toggleNotifications, deleteService, disableService, + enableService, openSettings, } = this.props; const { intl } = this.context; @@ -90,8 +96,8 @@ class TabItem extends Component { : intl.formatMessage(messages.enableNotifications), click: () => toggleNotifications(), }, { - label: intl.formatMessage(messages.disableService), - click: () => disableService(), + label: intl.formatMessage(service.isEnabled ? messages.disableService : messages.enableService), + click: () => (service.isEnabled ? disableService() : enableService()), }, { type: 'separator', }, { @@ -106,6 +112,7 @@ class TabItem extends Component { 'tab-item': true, 'is-active': service.isActive, 'has-custom-icon': service.hasCustomIcon, + 'is-disabled': !service.isEnabled, })} onClick={clickHandler} onContextMenu={() => menu.popup(remote.getCurrentWindow())} diff --git a/src/components/services/tabs/Tabbar.js b/src/components/services/tabs/Tabbar.js index fdb2c0a59..5f63aed16 100644 --- a/src/components/services/tabs/Tabbar.js +++ b/src/components/services/tabs/Tabbar.js @@ -29,20 +29,28 @@ export default class TabBar extends Component { reorder({ oldIndex, newIndex }); }; - disableService = ({ serviceId }) => { + toggleService = ({ serviceId, isEnabled }) => { const { updateService } = this.props; if (serviceId) { updateService({ serviceId, serviceData: { - isEnabled: false, + isEnabled, }, redirect: false, }); } } + disableService({ serviceId }) { + this.toggleService({ serviceId, isEnabled: false }); + } + + enableService({ serviceId }) { + this.toggleService({ serviceId, isEnabled: true }); + } + render() { const { services, @@ -64,7 +72,8 @@ export default class TabBar extends Component { reload={reload} toggleNotifications={toggleNotifications} deleteService={deleteService} - disableService={this.disableService} + disableService={args => this.disableService(args)} + enableService={args => this.enableService(args)} openSettings={openSettings} distance={20} axis="y" diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js index 5675fecf4..ba07b1a5b 100644 --- a/src/components/settings/settings/EditSettingsForm.js +++ b/src/components/settings/settings/EditSettingsForm.js @@ -26,6 +26,10 @@ const messages = defineMessages({ id: 'settings.app.headlineUpdates', defaultMessage: '!!!Updates', }, + headlineAppearance: { + id: 'settings.app.headlineAppearance', + defaultMessage: '!!!Appearance', + }, buttonSearchForUpdate: { id: 'settings.app.buttonSearchForUpdate', defaultMessage: '!!!Check for updates', @@ -119,6 +123,8 @@ export default class EditSettingsForm extends Component { {process.platform === 'win32' && ( )} +

{intl.formatMessage(messages.headlineAppearance)}

+

{intl.formatMessage(messages.headlineLanguage)}