UNPKG

@lyra/base

Version:

Lyra plugin containing the base components and roles for a Lyra configuration

92 lines (72 loc) 2.25 kB
'use strict'; 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 }) }; }