router5-plugin-listeners
Version:
Router5 browser plugin
74 lines (69 loc) • 3.22 kB
JavaScript
;
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var transitionPath = _interopDefault(require('router5-transition-path'));
var defaultOptions = {
autoCleanUp: true
};
var listenersPluginFactory = function (options) {
if (options === void 0) { options = defaultOptions; }
return function listenersPlugin(router) {
var listeners = {};
function removeListener(name, cb) {
if (cb) {
if (listeners[name])
listeners[name] = listeners[name].filter(function (callback) { return callback !== cb; });
}
else {
listeners[name] = [];
}
return router;
}
function addListener(name, cb, replace) {
var normalizedName = name.replace(/^(\*|\^|=)/, '');
if (normalizedName && !/^\$/.test(name)) {
//@ts-ignore
var segments = router.rootNode.getSegmentsByName(normalizedName);
if (!segments)
console.warn("No route found for " + normalizedName + ", listener might never be called!");
}
if (!listeners[name])
listeners[name] = [];
listeners[name] = (replace ? [] : listeners[name]).concat(cb);
return router;
}
router.getListeners = function () { return listeners; };
router.addListener = function (cb) { return addListener('*', cb); };
router.removeListener = function (cb) { return removeListener('*', cb); };
router.addNodeListener = function (name, cb) { return addListener('^' + name, cb, true); };
router.removeNodeListener = function (name, cb) { return removeListener('^' + name, cb); };
router.addRouteListener = function (name, cb) { return addListener('=' + name, cb); };
router.removeRouteListener = function (name, cb) {
return removeListener('=' + name, cb);
};
function invokeListeners(name, toState, fromState) {
(listeners[name] || []).forEach(function (cb) {
if (listeners[name].indexOf(cb) !== -1) {
cb(toState, fromState);
}
});
}
function onTransitionSuccess(toState, fromState, opts) {
var _a = transitionPath(toState, fromState), intersection = _a.intersection, toDeactivate = _a.toDeactivate;
var intersectionNode = opts.reload ? '' : intersection;
var name = toState.name;
if (options.autoCleanUp) {
toDeactivate.forEach(function (name) { return removeListener('^' + name); });
}
invokeListeners('^' + intersectionNode, toState, fromState);
invokeListeners('=' + name, toState, fromState);
invokeListeners('*', toState, fromState);
}
return {
onTransitionSuccess: onTransitionSuccess,
teardown: function () {
listeners = {};
}
};
};
};
module.exports = listenersPluginFactory;