UNPKG

@lyra/base

Version:

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

99 lines (73 loc) 2.43 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = createUserStore; var _rxjs = require('rxjs'); var _createActions = require('../utils/createActions'); var _createActions2 = _interopRequireDefault(_createActions); var _nanoPubsub = require('nano-pubsub'); var _nanoPubsub2 = _interopRequireDefault(_nanoPubsub); var _authenticationFetcher = require('part:@lyra/base/authentication-fetcher'); var _authenticationFetcher2 = _interopRequireDefault(_authenticationFetcher); var _client = require('part:@lyra/base/client'); var _client2 = _interopRequireDefault(_client); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const userChannel = (0, _nanoPubsub2.default)(); const errorChannel = (0, _nanoPubsub2.default)(); let _initialFetched = false; let _currentUser = null; let _currentError = null; userChannel.subscribe(val => { _currentUser = val; }); errorChannel.subscribe(val => { _currentError = val; }); function fetchInitial() { return _authenticationFetcher2.default.getCurrentUser().then(user => userChannel.publish(user), err => errorChannel.publish(err)); } function logout() { return _authenticationFetcher2.default.logout().then(() => userChannel.publish(null), err => errorChannel.publish(err)); } const currentUser = new _rxjs.Observable(observer => { if (_initialFetched) { const emitter = _currentError ? emitError : emitSnapshot; emitter(_currentError || _currentUser); } else { _initialFetched = true; fetchInitial(); } const unsubUser = userChannel.subscribe(nextUser => emitSnapshot(nextUser)); const unsubError = errorChannel.subscribe(err => emitError(err)); const unsubscribe = () => { unsubUser(); unsubError(); }; return unsubscribe; function emitError(error) { observer.next({ type: 'error', error }); } function emitSnapshot(user) { observer.next({ type: 'snapshot', user }); } }); const userCache = {}; const getUser = id => { if (!userCache[id]) { userCache[id] = _client2.default.request({ uri: `/users/${id}`, withCredentials: true }).then(user => { return user && user.id ? user : null; }); } return userCache[id]; }; function createUserStore(options = {}) { return { actions: (0, _createActions2.default)({ logout, retry: fetchInitial }), currentUser, getUser }; }