diff --git a/src/actions/service.js b/src/actions/service.js index 7f429ca32..cdd4bbf16 100644 --- a/src/actions/service.js +++ b/src/actions/service.js @@ -4,6 +4,8 @@ export default { setActive: { serviceId: PropTypes.string.isRequired, }, + setActiveNext: {}, + setActivePrev: {}, showAddServiceInterface: { recipeId: PropTypes.string.isRequired, }, diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js index a5e0839f2..42ec25204 100644 --- a/src/stores/AppStore.js +++ b/src/stores/AppStore.js @@ -125,6 +125,18 @@ export default class AppStore extends Store { this.actions.service.openDevToolsForActiveService(); }); + // Set active the next service + key( + '⌘+pagedown, ctrl+pagedown, ⌘+shift+tab, ctrl+shift+tab', () => { + this.actions.service.setActiveNext(); + }); + + // Set active the prev service + key( + '⌘+pageup, ctrl+pageup, ⌘+tab, ctrl+tab', () => { + this.actions.service.setActivePrev(); + }); + this.locale = this._getDefaultLocale(); this._healthCheck(); diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js index 77d2e7da4..19db05494 100644 --- a/src/stores/ServicesStore.js +++ b/src/stores/ServicesStore.js @@ -24,6 +24,8 @@ export default class ServicesStore extends Store { // Register action handlers this.actions.service.setActive.listen(this._setActive.bind(this)); + this.actions.service.setActiveNext.listen(this._setActiveNext.bind(this)); + this.actions.service.setActivePrev.listen(this._setActivePrev.bind(this)); this.actions.service.showAddServiceInterface.listen(this._showAddServiceInterface.bind(this)); this.actions.service.createService.listen(this._createService.bind(this)); this.actions.service.createFromLegacyService.listen(this._createFromLegacyService.bind(this)); @@ -206,6 +208,24 @@ export default class ServicesStore extends Store { service.isActive = true; } + @action _setActiveNext() { + const nextIndex = this._wrapIndex(this.enabled.findIndex(service => service.isActive), 1, this.enabled.length); + + this.all.forEach((s, index) => { + this.all[index].isActive = false; + }); + this.enabled[nextIndex].isActive = true; + } + + @action _setActivePrev() { + const prevIndex = this._wrapIndex(this.enabled.findIndex(service => service.isActive), -1, this.enabled.length); + + this.all.forEach((s, index) => { + this.all[index].isActive = false; + }); + this.enabled[prevIndex].isActive = true; + } + @action _setUnreadMessageCount({ serviceId, count }) { const service = this.one(serviceId); @@ -500,4 +520,8 @@ export default class ServicesStore extends Store { _reorderAnalytics = debounce(() => { gaEvent('Service', 'order'); }, 5000); + + _wrapIndex(index, delta, size) { + return (((index + delta) % size) + size) % size; + } }