From 666ec21ac9e905ac4e56c177d84f5716de9eb0fd Mon Sep 17 00:00:00 2001 From: vantezzen Date: Wed, 25 Sep 2019 11:54:21 +0200 Subject: Implement #75 --- src/components/services/content/ServiceView.js | 74 ++++++++++++++++++--- .../settings/settings/EditSettingsForm.js | 1 + src/config.js | 1 + src/containers/settings/EditSettingsScreen.js | 10 +++ src/i18n/locales/defaultMessages.json | 77 +++++++++++++--------- src/i18n/locales/en-US.json | 1 + .../containers/settings/EditSettingsScreen.json | 77 +++++++++++++--------- 7 files changed, 169 insertions(+), 72 deletions(-) diff --git a/src/components/services/content/ServiceView.js b/src/components/services/content/ServiceView.js index 59d1c1dc3..c45acc961 100644 --- a/src/components/services/content/ServiceView.js +++ b/src/components/services/content/ServiceView.js @@ -1,8 +1,9 @@ import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; -import { autorun } from 'mobx'; -import { observer } from 'mobx-react'; +import { autorun, reaction } from 'mobx'; +import { observer, inject } from 'mobx-react'; import classnames from 'classnames'; +import ms from 'ms'; import ServiceModel from '../../../models/Service'; import StatusBarTargetUrl from '../../ui/StatusBarTargetUrl'; @@ -11,8 +12,9 @@ import WebviewCrashHandler from './WebviewCrashHandler'; import WebviewErrorHandler from './ErrorHandlers/WebviewErrorHandler'; import ServiceDisabled from './ServiceDisabled'; import ServiceWebview from './ServiceWebview'; +import SettingsStore from '../../../stores/SettingsStore'; -export default @observer class ServiceView extends Component { +export default @observer @inject('stores') class ServiceView extends Component { static propTypes = { service: PropTypes.instanceOf(ServiceModel).isRequired, setWebviewReference: PropTypes.func.isRequired, @@ -21,6 +23,9 @@ export default @observer class ServiceView extends Component { edit: PropTypes.func.isRequired, enable: PropTypes.func.isRequired, isActive: PropTypes.bool, + stores: PropTypes.shape({ + settings: PropTypes.instanceOf(SettingsStore).isRequired, + }).isRequired, }; static defaultProps = { @@ -31,12 +36,20 @@ export default @observer class ServiceView extends Component { forceRepaint: false, targetUrl: '', statusBarVisible: false, + hibernate: false, + hibernationTimer: null, }; autorunDisposer = null; forceRepaintTimeout = null; + constructor(props) { + super(props); + + this.startHibernationTimer = this.startHibernationTimer.bind(this); + } + componentDidMount() { this.autorunDisposer = autorun(() => { if (this.props.service.isActive) { @@ -46,6 +59,31 @@ export default @observer class ServiceView extends Component { }, 100); } }); + + reaction( + () => this.props.service.isActive, + () => { + if (!this.props.service.isActive && this.props.stores.settings.all.app.hibernate) { + // Service is inactive - start hibernation countdown + this.startHibernationTimer(); + } else { + if (this.state.hibernationTimer) { + // Service is active but we have an active hibernation timer: Clear timeout + clearTimeout(this.state.hibernationTimer); + } + + // Service is active, wake up service from hibernation + this.setState({ + hibernate: false, + }); + } + }, + ); + + // Start hibernation counter if we are in background + if (!this.props.service.isActive && this.props.stores.settings.all.app.hibernate) { + this.startHibernationTimer(); + } } componentWillUnmount() { @@ -64,6 +102,18 @@ export default @observer class ServiceView extends Component { }); }; + startHibernationTimer() { + const hibernationTimer = setTimeout(() => { + this.setState({ + hibernate: true, + }); + }, ms('5m')); + + this.setState({ + hibernationTimer, + }); + } + render() { const { detachService, @@ -127,11 +177,19 @@ export default @observer class ServiceView extends Component { ) : ( <> - + {!this.state.hibernate ? ( + + ) : ( +
+ 😴 + {' '} +This service is currently hibernating. If this page doesn't close soon, please try reloading Ferdi. +
+ )} )} {statusBar} diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js index 52bd18603..6552220f1 100644 --- a/src/components/settings/settings/EditSettingsForm.js +++ b/src/components/settings/settings/EditSettingsForm.js @@ -198,6 +198,7 @@ export default @observer class EditSettingsForm extends Component { + {process.platform === 'win32' && ( )} diff --git a/src/config.js b/src/config.js index 7de6b3e46..789e31fe3 100644 --- a/src/config.js +++ b/src/config.js @@ -62,6 +62,7 @@ export const DEFAULT_APP_SETTINGS = { scheduledDNDEnabled: false, scheduledDNDStart: '17:00', scheduledDNDEnd: '09:00', + hibernate: false, }; export const DEFAULT_FEATURES_CONFIG = { diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js index 0ae64b6ad..962dc1b65 100644 --- a/src/containers/settings/EditSettingsScreen.js +++ b/src/containers/settings/EditSettingsScreen.js @@ -49,6 +49,10 @@ const messages = defineMessages({ id: 'settings.app.form.privateNotifications', defaultMessage: '!!!Don\'t show message content in notifications', }, + hibernate: { + id: 'settings.app.form.hibernate', + defaultMessage: '!!!Enable service hibernation', + }, server: { id: 'settings.app.form.server', defaultMessage: '!!!Server', @@ -142,6 +146,7 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e enableSystemTray: settingsData.enableSystemTray, minimizeToSystemTray: settingsData.minimizeToSystemTray, privateNotifications: settingsData.privateNotifications, + hibernate: settingsData.hibernate, server: settingsData.server, todoServer: settingsData.todoServer, lockingFeatureEnabled: settingsData.lockingFeatureEnabled, @@ -229,6 +234,11 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e value: settings.all.app.privateNotifications, default: DEFAULT_APP_SETTINGS.privateNotifications, }, + hibernate: { + label: intl.formatMessage(messages.hibernate), + value: settings.all.app.hibernate, + default: DEFAULT_APP_SETTINGS.hibernate, + }, server: { label: intl.formatMessage(messages.server), value: settings.all.app.server || API, diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index ccb81a9f3..e1814cc6d 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3741,211 +3741,224 @@ } }, { - "defaultMessage": "!!!Server", + "defaultMessage": "!!!Enable service hibernation", "end": { "column": 3, "line": 55 }, "file": "src/containers/settings/EditSettingsScreen.js", + "id": "settings.app.form.hibernate", + "start": { + "column": 13, + "line": 52 + } + }, + { + "defaultMessage": "!!!Server", + "end": { + "column": 3, + "line": 59 + }, + "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.server", "start": { "column": 10, - "line": 52 + "line": 56 } }, { "defaultMessage": "!!!Todo Server", "end": { "column": 3, - "line": 59 + "line": 63 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.todoServer", "start": { "column": 14, - "line": 56 + "line": 60 } }, { "defaultMessage": "!!!Enable Ferdi password lock", "end": { "column": 3, - "line": 63 + "line": 67 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.enableLock", "start": { "column": 14, - "line": 60 + "line": 64 } }, { "defaultMessage": "!!!Ferdi Lock password", "end": { "column": 3, - "line": 67 + "line": 71 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.lockPassword", "start": { "column": 16, - "line": 64 + "line": 68 } }, { "defaultMessage": "!!!Enable scheduled Do-not-Disturb", "end": { "column": 3, - "line": 71 + "line": 75 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.scheduledDNDEnabled", "start": { "column": 23, - "line": 68 + "line": 72 } }, { "defaultMessage": "!!!From", "end": { "column": 3, - "line": 75 + "line": 79 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.scheduledDNDStart", "start": { "column": 21, - "line": 72 + "line": 76 } }, { "defaultMessage": "!!!To", "end": { "column": 3, - "line": 79 + "line": 83 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.scheduledDNDEnd", "start": { "column": 19, - "line": 76 + "line": 80 } }, { "defaultMessage": "!!!Language", "end": { "column": 3, - "line": 83 + "line": 87 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.language", "start": { "column": 12, - "line": 80 + "line": 84 } }, { "defaultMessage": "!!!Dark Mode", "end": { "column": 3, - "line": 87 + "line": 91 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.darkMode", "start": { "column": 12, - "line": 84 + "line": 88 } }, { "defaultMessage": "!!!Display disabled services tabs", "end": { "column": 3, - "line": 91 + "line": 95 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.showDisabledServices", "start": { "column": 24, - "line": 88 + "line": 92 } }, { "defaultMessage": "!!!Show unread message badge when notifications are disabled", "end": { "column": 3, - "line": 95 + "line": 99 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.showMessagesBadgesWhenMuted", "start": { "column": 29, - "line": 92 + "line": 96 } }, { "defaultMessage": "!!!Enable spell checking", "end": { "column": 3, - "line": 99 + "line": 103 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.enableSpellchecking", "start": { "column": 23, - "line": 96 + "line": 100 } }, { "defaultMessage": "!!!Enable GPU Acceleration", "end": { "column": 3, - "line": 103 + "line": 107 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.enableGPUAcceleration", "start": { "column": 25, - "line": 100 + "line": 104 } }, { "defaultMessage": "!!!Include beta versions", "end": { "column": 3, - "line": 107 + "line": 111 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.beta", "start": { "column": 8, - "line": 104 + "line": 108 } }, { "defaultMessage": "!!!Enable Franz Todos", "end": { "column": 3, - "line": 111 + "line": 115 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.enableTodos", "start": { "column": 15, - "line": 108 + "line": 112 } }, { "defaultMessage": "!!!Keep all workspaces loaded", "end": { "column": 3, - "line": 115 + "line": 119 }, "file": "src/containers/settings/EditSettingsScreen.js", "id": "settings.app.form.keepAllWorkspacesLoaded", "start": { "column": 27, - "line": 112 + "line": 116 } } ], diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 8997a1948..31e7259ca 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -226,6 +226,7 @@ "settings.app.form.enableSpellchecking": "Enable spell checking", "settings.app.form.enableSystemTray": "Show Ferdi in system tray", "settings.app.form.enableTodos": "Enable Ferdi Todos", + "settings.app.form.hibernate": "Enable service hibernation", "settings.app.form.keepAllWorkspacesLoaded": "Keep all workspaces loaded", "settings.app.form.language": "Language", "settings.app.form.lockPassword": "Ferdi Lock password", diff --git a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json index da3d8d7f4..dccf8b992 100644 --- a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json +++ b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json @@ -77,16 +77,29 @@ "column": 3 } }, + { + "id": "settings.app.form.hibernate", + "defaultMessage": "!!!Enable service hibernation", + "file": "src/containers/settings/EditSettingsScreen.js", + "start": { + "line": 52, + "column": 13 + }, + "end": { + "line": 55, + "column": 3 + } + }, { "id": "settings.app.form.server", "defaultMessage": "!!!Server", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 52, + "line": 56, "column": 10 }, "end": { - "line": 55, + "line": 59, "column": 3 } }, @@ -95,11 +108,11 @@ "defaultMessage": "!!!Todo Server", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 56, + "line": 60, "column": 14 }, "end": { - "line": 59, + "line": 63, "column": 3 } }, @@ -108,11 +121,11 @@ "defaultMessage": "!!!Enable Ferdi password lock", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 60, + "line": 64, "column": 14 }, "end": { - "line": 63, + "line": 67, "column": 3 } }, @@ -121,11 +134,11 @@ "defaultMessage": "!!!Ferdi Lock password", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 64, + "line": 68, "column": 16 }, "end": { - "line": 67, + "line": 71, "column": 3 } }, @@ -134,11 +147,11 @@ "defaultMessage": "!!!Enable scheduled Do-not-Disturb", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 68, + "line": 72, "column": 23 }, "end": { - "line": 71, + "line": 75, "column": 3 } }, @@ -147,11 +160,11 @@ "defaultMessage": "!!!From", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 72, + "line": 76, "column": 21 }, "end": { - "line": 75, + "line": 79, "column": 3 } }, @@ -160,11 +173,11 @@ "defaultMessage": "!!!To", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 76, + "line": 80, "column": 19 }, "end": { - "line": 79, + "line": 83, "column": 3 } }, @@ -173,11 +186,11 @@ "defaultMessage": "!!!Language", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 80, + "line": 84, "column": 12 }, "end": { - "line": 83, + "line": 87, "column": 3 } }, @@ -186,11 +199,11 @@ "defaultMessage": "!!!Dark Mode", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 84, + "line": 88, "column": 12 }, "end": { - "line": 87, + "line": 91, "column": 3 } }, @@ -199,11 +212,11 @@ "defaultMessage": "!!!Display disabled services tabs", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 88, + "line": 92, "column": 24 }, "end": { - "line": 91, + "line": 95, "column": 3 } }, @@ -212,11 +225,11 @@ "defaultMessage": "!!!Show unread message badge when notifications are disabled", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 92, + "line": 96, "column": 29 }, "end": { - "line": 95, + "line": 99, "column": 3 } }, @@ -225,11 +238,11 @@ "defaultMessage": "!!!Enable spell checking", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 96, + "line": 100, "column": 23 }, "end": { - "line": 99, + "line": 103, "column": 3 } }, @@ -238,11 +251,11 @@ "defaultMessage": "!!!Enable GPU Acceleration", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 100, + "line": 104, "column": 25 }, "end": { - "line": 103, + "line": 107, "column": 3 } }, @@ -251,11 +264,11 @@ "defaultMessage": "!!!Include beta versions", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 104, + "line": 108, "column": 8 }, "end": { - "line": 107, + "line": 111, "column": 3 } }, @@ -264,11 +277,11 @@ "defaultMessage": "!!!Enable Franz Todos", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 108, + "line": 112, "column": 15 }, "end": { - "line": 111, + "line": 115, "column": 3 } }, @@ -277,11 +290,11 @@ "defaultMessage": "!!!Keep all workspaces loaded", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 112, + "line": 116, "column": 27 }, "end": { - "line": 115, + "line": 119, "column": 3 } } -- cgit v1.2.3-54-g00ecf