@lyra/base
Version:
Lyra plugin containing the base components and roles for a Lyra configuration
92 lines (72 loc) • 2.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createLocationStore;
var _rxjs = require('rxjs');
var _operators = require('rxjs/operators');
var _Location = require('../utils/Location');
var _Location2 = _interopRequireDefault(_Location);
var _createBrowserHistory = require('history/createBrowserHistory');
var _createBrowserHistory2 = _interopRequireDefault(_createBrowserHistory);
var _createActions = require('../utils/createActions');
var _createActions2 = _interopRequireDefault(_createActions);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const noop = () => {}; // eslint-disable-line no-empty-function
const history = (0, _createBrowserHistory2.default)();
function readLocation() {
return _Location2.default.parse(document.location.href);
}
const interceptors = [];
function navigate(nextUrl, options = {}) {
if (interceptors.length > 0) {
let cancelled = false;
const nextNavigation = {
nextUrl: nextUrl,
cancel() {
cancelled = true;
}
};
interceptors.some(interceptor => {
interceptor(nextNavigation);
return !cancelled;
});
if (cancelled) {
return { progress: new _rxjs.Observable(noop) };
}
}
if (options.replace) {
history.replace(nextUrl);
} else {
history.push(nextUrl);
}
return { progress: new _rxjs.Observable(noop) };
}
const locationChange$ = new _rxjs.Observable(observer => {
return history.listen(() => observer.next(readLocation()));
}).pipe((0, _operators.map)(location => ({
type: 'change',
location: location
})), (0, _operators.share)());
function createLocationStore(options = {}) {
const eventStream = new _rxjs.Observable(observer => {
const subscription = locationChange$.subscribe(observer);
observer.next({
type: 'snapshot',
location: readLocation()
});
return subscription;
});
return {
state: eventStream,
intercept(interceptor) {
interceptors.push(interceptor);
return () => {
interceptors.splice(interceptors.indexOf(interceptor), 1);
};
},
actions: (0, _createActions2.default)({
navigate
})
};
}