import Service, { inject as service } from '@ember/service'; import { set } from '@ember/object'; import callableType from 'consul-ui/utils/callable-type'; const TYPE_SUCCESS = 'success'; const TYPE_ERROR = 'error'; const defaultStatus = function(type, obj) { return type; }; const notificationDefaults = function() { return { timeout: 6000, extendedTimeout: 300, }; }; export default Service.extend({ notify: service('flashMessages'), logger: service('logger'), execute: function(handle, action, status = defaultStatus, controller) { set(controller, 'isLoading', true); const getAction = callableType(action); const getStatus = callableType(status); const notify = this.notify; return ( handle() //TODO: pass this through to getAction.. .then(item => { // returning exactly `false` for a feedback action means even though // its successful, please skip this notification and don't display it if (item !== false) { notify.clearMessages(); // TODO right now the majority of `item` is a Transition // but you can resolve an object notify.add({ ...notificationDefaults(), type: getStatus(TYPE_SUCCESS), // here.. action: getAction(), item: item, }); } }) .catch(e => { notify.clearMessages(); this.logger.execute(e); if (e.name === 'TransitionAborted') { notify.add({ ...notificationDefaults(), type: getStatus(TYPE_SUCCESS), // and here action: getAction(), }); } else { notify.add({ ...notificationDefaults(), type: getStatus(TYPE_ERROR, e), action: getAction(), error: e, }); } }) .finally(function() { set(controller, 'isLoading', false); }) ); }, });