From 012e55ebf87559f2d782e5400fb885df8b80a445 Mon Sep 17 00:00:00 2001 From: kytwb <412895+kytwb@users.noreply.github.com> Date: Fri, 23 Jul 2021 10:04:43 +0100 Subject: Fix hibernation mode (#1486) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Use hibernation strategy from settings instead of hardcoded 5 minutes * Fix conditions with isHibernationEnabled, previously disableHibernation * Make service hibernation obey global setting Also refactors hibernation to move some hibernation enablement logic into the Service model * Remove global hibernation enable switch Implements option 4 from https://github.com/getferdi/ferdi/pull/1486#issuecomment-860290992 according to https://github.com/getferdi/ferdi/pull/1486#issuecomment-876558694 * Implements #865 : Add 'hibernate service' and 'wake up service' in the sidebar context menu. * Removed 'hibernationEnabled' check on main settings screen Since this is an (imo) incongruous behavior for the first time user. They will see a message, but with no ability to choose the hibernation strategy. * Autogenerated files from conflict fixes Co-authored-by: Kristóf Marussy Co-authored-by: Vijay A --- src/components/layout/Sidebar.js | 12 ++ src/components/services/content/ServiceView.js | 16 ++- src/components/services/tabs/TabBarSortableList.js | 6 + src/components/services/tabs/TabItem.js | 18 ++- src/components/services/tabs/Tabbar.js | 16 +++ .../settings/services/EditServiceForm.js | 14 +-- .../settings/settings/EditSettingsForm.js | 11 +- src/containers/layout/AppLayoutContainer.js | 4 + src/containers/settings/EditServiceScreen.js | 3 +- src/containers/settings/EditSettingsScreen.js | 10 -- src/environment.js | 1 - src/i18n/locales/defaultMessages.json | 34 +++++- src/i18n/locales/en-US.json | 2 + .../src/components/services/tabs/TabItem.json | 34 +++++- .../containers/settings/EditSettingsScreen.json | 129 +++++++++------------ .../workspaces/components/WorkspaceDrawer.json | 2 +- src/models/Service.js | 21 ++-- src/stores/ServicesStore.js | 14 ++- 18 files changed, 211 insertions(+), 136 deletions(-) diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js index 802538eba..9f3cacd38 100644 --- a/src/components/layout/Sidebar.js +++ b/src/components/layout/Sidebar.js @@ -58,6 +58,18 @@ const messages = defineMessages({ export default @inject('stores', 'actions') @observer class Sidebar extends Component { static propTypes = { openSettings: PropTypes.func.isRequired, + closeSettings: PropTypes.func.isRequired, + setActive: PropTypes.func.isRequired, + reorder: PropTypes.func.isRequired, + reload: PropTypes.func.isRequired, + toggleNotifications: PropTypes.func.isRequired, + toggleAudio: PropTypes.func.isRequired, + showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired, + showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired, + deleteService: PropTypes.func.isRequired, + updateService: PropTypes.func.isRequired, + hibernateService: PropTypes.func.isRequired, + wakeUpService: PropTypes.func.isRequired, toggleMuteApp: PropTypes.func.isRequired, isAppMuted: PropTypes.bool.isRequired, isWorkspaceDrawerOpen: PropTypes.bool.isRequired, diff --git a/src/components/services/content/ServiceView.js b/src/components/services/content/ServiceView.js index 17d2db5a0..3fc084ff0 100644 --- a/src/components/services/content/ServiceView.js +++ b/src/components/services/content/ServiceView.js @@ -145,19 +145,17 @@ export default @inject('stores', 'actions') @observer class ServiceView extends ) : ( <> - {(!service.isHibernating || service.isHibernationEnabled) ? ( + {!service.isHibernating ? ( <> {showNavBar && ( )} - {!service.isHibernating && ( - - )} + ) : (
diff --git a/src/components/services/tabs/TabBarSortableList.js b/src/components/services/tabs/TabBarSortableList.js index 489027d57..f12d90602 100644 --- a/src/components/services/tabs/TabBarSortableList.js +++ b/src/components/services/tabs/TabBarSortableList.js @@ -17,6 +17,8 @@ class TabBarSortableList extends Component { deleteService: PropTypes.func.isRequired, disableService: PropTypes.func.isRequired, enableService: PropTypes.func.isRequired, + hibernateService: PropTypes.func.isRequired, + wakeUpService: PropTypes.func.isRequired, showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired, showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired, } @@ -31,6 +33,8 @@ class TabBarSortableList extends Component { deleteService, disableService, enableService, + hibernateService, + wakeUpService, openSettings, showMessageBadgeWhenMutedSetting, showMessageBadgesEvenWhenMuted, @@ -53,6 +57,8 @@ class TabBarSortableList extends Component { deleteService={() => deleteService({ serviceId: service.id })} disableService={() => disableService({ serviceId: service.id })} enableService={() => enableService({ serviceId: service.id })} + hibernateService={() => hibernateService({ serviceId: service.id })} + wakeUpService={() => wakeUpService({ serviceId: service.id })} openSettings={openSettings} showMessageBadgeWhenMutedSetting={showMessageBadgeWhenMutedSetting} showMessageBadgesEvenWhenMuted={showMessageBadgesEvenWhenMuted} diff --git a/src/components/services/tabs/TabItem.js b/src/components/services/tabs/TabItem.js index 5c3149a11..ccf3333f8 100644 --- a/src/components/services/tabs/TabItem.js +++ b/src/components/services/tabs/TabItem.js @@ -49,6 +49,14 @@ const messages = defineMessages({ id: 'tabs.item.enableService', defaultMessage: '!!!Enable Service', }, + hibernateService: { + id: 'tabs.item.hibernateService', + defaultMessage: '!!!Hibernate Service', + }, + wakeUpService: { + id: 'tabs.item.wakeUpService', + defaultMessage: '!!!Wake Up Service', + }, deleteService: { id: 'tabs.item.deleteService', defaultMessage: '!!!Delete Service', @@ -101,6 +109,8 @@ const styles = { deleteService: PropTypes.func.isRequired, disableService: PropTypes.func.isRequired, enableService: PropTypes.func.isRequired, + hibernateService: PropTypes.func.isRequired, + wakeUpService: PropTypes.func.isRequired, showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired, showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired, }; @@ -145,6 +155,8 @@ const styles = { deleteService, disableService, enableService, + hibernateService, + wakeUpService, openSettings, showMessageBadgeWhenMutedSetting, showMessageBadgesEvenWhenMuted, @@ -180,6 +192,10 @@ const styles = { }, { label: intl.formatMessage(service.isEnabled ? messages.disableService : messages.enableService), click: () => (service.isEnabled ? disableService() : enableService()), + }, { + label: intl.formatMessage(service.isHibernating ? messages.wakeUpService : messages.hibernateService), + click: () => (service.isHibernating ? wakeUpService() : hibernateService()), + enabled: service.canHibernate, }, { type: 'separator', }, { @@ -217,7 +233,7 @@ const styles = { • )} - {service.isHibernating && !service.isHibernationEnabled && ( + {service.isHibernating && ( diff --git a/src/components/services/tabs/Tabbar.js b/src/components/services/tabs/Tabbar.js index 5e8260ad0..db7a69bfc 100644 --- a/src/components/services/tabs/Tabbar.js +++ b/src/components/services/tabs/Tabbar.js @@ -17,6 +17,8 @@ export default @observer class TabBar extends Component { toggleAudio: PropTypes.func.isRequired, deleteService: PropTypes.func.isRequired, updateService: PropTypes.func.isRequired, + hibernateService: PropTypes.func.isRequired, + wakeUpService: PropTypes.func.isRequired, showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired, showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired, }; @@ -55,6 +57,18 @@ export default @observer class TabBar extends Component { this.toggleService({ serviceId, isEnabled: true }); } + hibernateService({ serviceId }) { + if (serviceId) { + this.props.hibernateService({ serviceId }); + } + } + + wakeUpService({ serviceId }) { + if (serviceId) { + this.props.wakeUpService({ serviceId }); + } + } + render() { const { services, @@ -83,6 +97,8 @@ export default @observer class TabBar extends Component { deleteService={deleteService} disableService={args => this.disableService(args)} enableService={args => this.enableService(args)} + hibernateService={args => this.hibernateService(args)} + wakeUpService={args => this.wakeUpService(args)} openSettings={openSettings} distance={20} axis="y" diff --git a/src/components/settings/services/EditServiceForm.js b/src/components/settings/services/EditServiceForm.js index 0f7c29de5..56e5f9c94 100644 --- a/src/components/settings/services/EditServiceForm.js +++ b/src/components/settings/services/EditServiceForm.js @@ -145,7 +145,6 @@ export default @observer class EditServiceForm extends Component { isSaving: PropTypes.bool.isRequired, isDeleting: PropTypes.bool.isRequired, isProxyFeatureEnabled: PropTypes.bool.isRequired, - isHibernationFeatureActive: PropTypes.bool.isRequired, }; static defaultProps = { @@ -208,7 +207,6 @@ export default @observer class EditServiceForm extends Component { onDelete, openRecipeFile, isProxyFeatureEnabled, - isHibernationFeatureActive, } = this.props; const { intl } = this.context; @@ -341,14 +339,10 @@ export default @observer class EditServiceForm extends Component {

{intl.formatMessage(messages.headlineGeneral)}

- {isHibernationFeatureActive && ( - <> - -

- {intl.formatMessage(messages.isHibernationEnabledInfo)} -

- - )} + +

+ {intl.formatMessage(messages.isHibernationEnabledInfo)} +

{form.$('isDarkModeEnabled').value && ( diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js index a8ba8748d..d2a9eb6e0 100644 --- a/src/components/settings/settings/EditSettingsForm.js +++ b/src/components/settings/settings/EditSettingsForm.js @@ -171,7 +171,6 @@ export default @observer class EditSettingsForm extends Component { isTodosActivated: PropTypes.bool.isRequired, isWorkspaceEnabled: PropTypes.bool.isRequired, automaticUpdates: PropTypes.bool.isRequired, - hibernationEnabled: PropTypes.bool.isRequired, isDarkmodeEnabled: PropTypes.bool.isRequired, isAdaptableDarkModeEnabled: PropTypes.bool.isRequired, isNightlyEnabled: PropTypes.bool.isRequired, @@ -225,7 +224,6 @@ export default @observer class EditSettingsForm extends Component { isTodosEnabled, isWorkspaceEnabled, automaticUpdates, - hibernationEnabled, isDarkmodeEnabled, isTodosActivated, isNightlyEnabled, @@ -336,13 +334,8 @@ export default @observer class EditSettingsForm extends Component {
- - {hibernationEnabled && ( - <> - +

this.deleteService()} openRecipeFile={file => this.openRecipeFile(file)} isProxyFeatureEnabled={proxyFeature.isEnabled} - isHibernationFeatureActive={settings.app.hibernate} /> ); diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js index 3b8f03ae4..5f29ee385 100644 --- a/src/containers/settings/EditSettingsScreen.js +++ b/src/containers/settings/EditSettingsScreen.js @@ -87,10 +87,6 @@ const messages = defineMessages({ id: 'settings.app.form.sentry', defaultMessage: '!!!Send telemetry data', }, - hibernate: { - id: 'settings.app.form.hibernate', - defaultMessage: '!!!Enable service hibernation', - }, hibernateOnStartup: { id: 'settings.app.form.hibernateOnStartup', defaultMessage: '!!!Keep services in hibernation on startup', @@ -432,11 +428,6 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e value: settings.all.app.sentry, default: DEFAULT_APP_SETTINGS.sentry, }, - hibernate: { - label: intl.formatMessage(messages.hibernate), - value: settings.all.app.hibernate, - default: DEFAULT_APP_SETTINGS.hibernate, - }, hibernateOnStartup: { label: intl.formatMessage(messages.hibernateOnStartup), value: settings.all.app.hibernateOnStartup, @@ -653,7 +644,6 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e isWorkspaceEnabled={workspaces.isFeatureActive} lockingFeatureEnabled={lockingFeatureEnabled} automaticUpdates={this.props.stores.settings.app.automaticUpdates} - hibernationEnabled={this.props.stores.settings.app.hibernate} isDarkmodeEnabled={this.props.stores.settings.app.darkMode} isAdaptableDarkModeEnabled={this.props.stores.settings.app.adaptableDarkMode} isTodosActivated={this.props.stores.todos.isFeatureEnabledByUser} diff --git a/src/environment.js b/src/environment.js index e13e5f676..6a126e0c6 100644 --- a/src/environment.js +++ b/src/environment.js @@ -132,7 +132,6 @@ export const DEFAULT_APP_SETTINGS = { scheduledDNDEnabled: false, scheduledDNDStart: '17:00', scheduledDNDEnd: '09:00', - hibernate: false, hibernateOnStartup: true, hibernationStrategy: 300, inactivityLock: 0, diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 0cedeb4cb..7d4a0fe06 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -1867,29 +1867,55 @@ } }, { - "defaultMessage": "!!!Delete Service", + "defaultMessage": "!!!Hibernate Service", "end": { "column": 3, "line": 55 }, "file": "src/components/services/tabs/TabItem.js", + "id": "tabs.item.hibernateService", + "start": { + "column": 20, + "line": 52 + } + }, + { + "defaultMessage": "!!!Wake Up Service", + "end": { + "column": 3, + "line": 59 + }, + "file": "src/components/services/tabs/TabItem.js", + "id": "tabs.item.wakeUpService", + "start": { + "column": 17, + "line": 56 + } + }, + { + "defaultMessage": "!!!Delete Service", + "end": { + "column": 3, + "line": 63 + }, + "file": "src/components/services/tabs/TabItem.js", "id": "tabs.item.deleteService", "start": { "column": 17, - "line": 52 + "line": 60 } }, { "defaultMessage": "!!!Do you really want to delete the {serviceName} service?", "end": { "column": 3, - "line": 59 + "line": 67 }, "file": "src/components/services/tabs/TabItem.js", "id": "tabs.item.confirmDeleteService", "start": { "column": 24, - "line": 56 + "line": 64 } } ], diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 5ff146ea5..76fc7cfc2 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -453,7 +453,9 @@ "tabs.item.enableAudio": "Enable audio", "tabs.item.enableNotification": "Enable notifications", "tabs.item.enableService": "Enable service", + "tabs.item.hibernateService": "Hibernate service", "tabs.item.reload": "Reload", + "tabs.item.wakeUpService": "Wake up service", "validation.email": "{field} is not valid", "validation.minLength": "{field} should be at least {length} characters long", "validation.oneRequired": "At least one is required", diff --git a/src/i18n/messages/src/components/services/tabs/TabItem.json b/src/i18n/messages/src/components/services/tabs/TabItem.json index a1b0d2435..6d4d5f6fd 100644 --- a/src/i18n/messages/src/components/services/tabs/TabItem.json +++ b/src/i18n/messages/src/components/services/tabs/TabItem.json @@ -103,16 +103,42 @@ "column": 3 } }, + { + "id": "tabs.item.hibernateService", + "defaultMessage": "!!!Hibernate Service", + "file": "src/components/services/tabs/TabItem.js", + "start": { + "line": 52, + "column": 20 + }, + "end": { + "line": 55, + "column": 3 + } + }, + { + "id": "tabs.item.wakeUpService", + "defaultMessage": "!!!Wake Up Service", + "file": "src/components/services/tabs/TabItem.js", + "start": { + "line": 56, + "column": 17 + }, + "end": { + "line": 59, + "column": 3 + } + }, { "id": "tabs.item.deleteService", "defaultMessage": "!!!Delete Service", "file": "src/components/services/tabs/TabItem.js", "start": { - "line": 52, + "line": 60, "column": 17 }, "end": { - "line": 55, + "line": 63, "column": 3 } }, @@ -121,11 +147,11 @@ "defaultMessage": "!!!Do you really want to delete the {serviceName} service?", "file": "src/components/services/tabs/TabItem.js", "start": { - "line": 56, + "line": 64, "column": 24 }, "end": { - "line": 59, + "line": 67, "column": 3 } } diff --git a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json index 5c15933e4..33bcde0de 100644 --- a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json +++ b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json @@ -194,29 +194,16 @@ "column": 3 } }, - { - "id": "settings.app.form.hibernate", - "defaultMessage": "!!!Enable service hibernation", - "file": "src/containers/settings/EditSettingsScreen.js", - "start": { - "line": 90, - "column": 13 - }, - "end": { - "line": 93, - "column": 3 - } - }, { "id": "settings.app.form.hibernateOnStartup", "defaultMessage": "!!!Keep services in hibernation on startup", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 94, + "line": 90, "column": 22 }, "end": { - "line": 97, + "line": 93, "column": 3 } }, @@ -225,11 +212,11 @@ "defaultMessage": "!!!Hibernation strategy", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 98, + "line": 94, "column": 23 }, "end": { - "line": 101, + "line": 97, "column": 3 } }, @@ -238,11 +225,11 @@ "defaultMessage": "!!!Todo Server", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 102, + "line": 98, "column": 24 }, "end": { - "line": 105, + "line": 101, "column": 3 } }, @@ -251,11 +238,11 @@ "defaultMessage": "!!!Custom TodoServer", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 106, + "line": 102, "column": 20 }, "end": { - "line": 109, + "line": 105, "column": 3 } }, @@ -264,11 +251,11 @@ "defaultMessage": "!!!Enable Password Lock", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 110, + "line": 106, "column": 14 }, "end": { - "line": 113, + "line": 109, "column": 3 } }, @@ -277,11 +264,11 @@ "defaultMessage": "!!!Password", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 114, + "line": 110, "column": 16 }, "end": { - "line": 117, + "line": 113, "column": 3 } }, @@ -290,11 +277,11 @@ "defaultMessage": "!!!Allow using Touch ID to unlock", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 118, + "line": 114, "column": 22 }, "end": { - "line": 121, + "line": 117, "column": 3 } }, @@ -303,11 +290,11 @@ "defaultMessage": "!!!Lock after inactivity", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 122, + "line": 118, "column": 18 }, "end": { - "line": 125, + "line": 121, "column": 3 } }, @@ -316,11 +303,11 @@ "defaultMessage": "!!!Enable scheduled Do-not-Disturb", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 126, + "line": 122, "column": 23 }, "end": { - "line": 129, + "line": 125, "column": 3 } }, @@ -329,11 +316,11 @@ "defaultMessage": "!!!From", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 130, + "line": 126, "column": 21 }, "end": { - "line": 133, + "line": 129, "column": 3 } }, @@ -342,11 +329,11 @@ "defaultMessage": "!!!To", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 134, + "line": 130, "column": 19 }, "end": { - "line": 137, + "line": 133, "column": 3 } }, @@ -355,11 +342,11 @@ "defaultMessage": "!!!Language", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 138, + "line": 134, "column": 12 }, "end": { - "line": 141, + "line": 137, "column": 3 } }, @@ -368,11 +355,11 @@ "defaultMessage": "!!!Dark Mode", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 142, + "line": 138, "column": 12 }, "end": { - "line": 145, + "line": 141, "column": 3 } }, @@ -381,11 +368,11 @@ "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 146, + "line": 142, "column": 21 }, "end": { - "line": 149, + "line": 145, "column": 3 } }, @@ -394,11 +381,11 @@ "defaultMessage": "!!!Enable universal Dark Mode", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 150, + "line": 146, "column": 21 }, "end": { - "line": 153, + "line": 149, "column": 3 } }, @@ -407,11 +394,11 @@ "defaultMessage": "!!!Sidebar width", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 154, + "line": 150, "column": 22 }, "end": { - "line": 157, + "line": 153, "column": 3 } }, @@ -420,11 +407,11 @@ "defaultMessage": "!!!Service icon size", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 158, + "line": 154, "column": 12 }, "end": { - "line": 161, + "line": 157, "column": 3 } }, @@ -433,11 +420,11 @@ "defaultMessage": "!!!Use vertical style", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 162, + "line": 158, "column": 20 }, "end": { - "line": 165, + "line": 161, "column": 3 } }, @@ -446,11 +433,11 @@ "defaultMessage": "!!!Always show workspace drawer", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 166, + "line": 162, "column": 24 }, "end": { - "line": 169, + "line": 165, "column": 3 } }, @@ -459,11 +446,11 @@ "defaultMessage": "!!!Accent color", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 170, + "line": 166, "column": 15 }, "end": { - "line": 173, + "line": 169, "column": 3 } }, @@ -472,11 +459,11 @@ "defaultMessage": "!!!Display disabled services tabs", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 174, + "line": 170, "column": 24 }, "end": { - "line": 177, + "line": 173, "column": 3 } }, @@ -485,11 +472,11 @@ "defaultMessage": "!!!Show unread message badge when notifications are disabled", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 178, + "line": 174, "column": 29 }, "end": { - "line": 181, + "line": 177, "column": 3 } }, @@ -498,11 +485,11 @@ "defaultMessage": "!!!Show draggable area on window", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 182, + "line": 178, "column": 16 }, "end": { - "line": 185, + "line": 181, "column": 3 } }, @@ -511,11 +498,11 @@ "defaultMessage": "!!!Enable spell checking", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 186, + "line": 182, "column": 23 }, "end": { - "line": 189, + "line": 185, "column": 3 } }, @@ -524,11 +511,11 @@ "defaultMessage": "!!!Enable GPU Acceleration", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 190, + "line": 186, "column": 25 }, "end": { - "line": 193, + "line": 189, "column": 3 } }, @@ -537,11 +524,11 @@ "defaultMessage": "!!!Include beta versions", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 194, + "line": 190, "column": 8 }, "end": { - "line": 197, + "line": 193, "column": 3 } }, @@ -550,11 +537,11 @@ "defaultMessage": "!!!Enable updates", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 198, + "line": 194, "column": 20 }, "end": { - "line": 201, + "line": 197, "column": 3 } }, @@ -563,11 +550,11 @@ "defaultMessage": "!!!Enable Franz Todos", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 202, + "line": 198, "column": 15 }, "end": { - "line": 205, + "line": 201, "column": 3 } }, @@ -576,11 +563,11 @@ "defaultMessage": "!!!Keep all workspaces loaded", "file": "src/containers/settings/EditSettingsScreen.js", "start": { - "line": 206, + "line": 202, "column": 27 }, "end": { - "line": 209, + "line": 205, "column": 3 } } diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json index a8ccb5a39..431f12710 100644 --- a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json +++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json @@ -64,4 +64,4 @@ "column": 3 } } -] +] \ No newline at end of file diff --git a/src/models/Service.js b/src/models/Service.js index 397950787..162dcea65 100644 --- a/src/models/Service.js +++ b/src/models/Service.js @@ -37,8 +37,6 @@ export default class Service { @observable isMuted = false; - @observable isHibernating = false; - @observable team = ''; @observable customUrl = ''; @@ -77,7 +75,7 @@ export default class Service { @observable isHibernationEnabled = false; - @observable isHibernating = false; + @observable isHibernationRequested = false; @observable lastUsed = Date.now(); // timestamp @@ -145,14 +143,11 @@ export default class Service { this.recipe = recipe; // Check if "Hibernate on Startup" is enabled and hibernate all services except active one - const { - hibernate, - hibernateOnStartup, - } = window.ferdi.stores.settings.app; + const { hibernateOnStartup } = window.ferdi.stores.settings.app; // The service store is probably not loaded yet so we need to use localStorage data to get active service const isActive = window.localStorage.service && JSON.parse(window.localStorage.service).activeService === this.id; - if (hibernate && hibernateOnStartup && !isActive) { - this.isHibernating = true; + if (hibernateOnStartup && !isActive) { + this.isHibernationRequested = true; } autorun(() => { @@ -185,6 +180,14 @@ export default class Service { return this.recipe.id === todosStore.todoRecipeId; } + @computed get canHibernate() { + return this.isHibernationEnabled; + } + + @computed get isHibernating() { + return this.canHibernate && this.isHibernationRequested; + } + get webview() { if (this.isTodosService) { return todosStore.webview; diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js index 9521f8493..6064b9929 100644 --- a/src/stores/ServicesStore.js +++ b/src/stores/ServicesStore.js @@ -166,8 +166,8 @@ export default class ServicesStore extends Store { _serviceMaintenance() { this.all.forEach((service) => { // Defines which services should be hibernated. - if (!service.isActive && (Date.now() - service.lastUsed > ms('5m'))) { - // If service is stale for 5 min, hibernate it. + if (!service.isActive && (Date.now() - service.lastUsed > ms(`${this.stores.settings.all.app.hibernationStrategy}s`))) { + // If service is stale, hibernate it. this._hibernate({ serviceId: service.id }); } @@ -820,19 +820,23 @@ export default class ServicesStore extends Store { @action _hibernate({ serviceId }) { const service = this.one(serviceId); - if (service.isActive || !service.isHibernationEnabled) { + if (!service.canHibernate) { + return; + } + if (service.isActive) { debug('Skipping service hibernation'); return; } debug(`Hibernate ${service.name}`); - service.isHibernating = true; + service.isHibernationRequested = true; } @action _awake({ serviceId }) { + debug('Waking up from service hibernation'); const service = this.one(serviceId); - service.isHibernating = false; + service.isHibernationRequested = false; service.liveFrom = Date.now(); } -- cgit v1.2.3-70-g09d2