open-nomad/ui/app/mixins/with-watchers.js

48 lines
1.2 KiB
JavaScript

import Mixin from '@ember/object/mixin';
import { computed } from '@ember/object';
import { assert } from '@ember/debug';
import WithVisibilityDetection from './with-route-visibility-detection';
// eslint-disable-next-line ember/no-new-mixins
export default Mixin.create(WithVisibilityDetection, {
watchers: computed(function() {
return [];
}),
cancelAllWatchers() {
this.watchers.forEach(watcher => {
assert('Watchers must be Ember Concurrency Tasks.', !!watcher.cancelAll);
watcher.cancelAll();
});
},
startWatchers() {
assert('startWatchers needs to be overridden in the Route', false);
},
setupController() {
this.startWatchers(...arguments);
return this._super(...arguments);
},
visibilityHandler() {
if (document.hidden) {
this.cancelAllWatchers();
} else {
this.startWatchers(this.controller, this.controller.get('model'));
}
},
actions: {
willTransition(transition) {
// Don't cancel watchers if transitioning into a sub-route
if (!transition.intent.name || !transition.intent.name.startsWith(this.routeName)) {
this.cancelAllWatchers();
}
// Bubble the action up to the application route
return true;
},
},
});