@lyra/base
Version:
Lyra plugin containing the base components and roles for a Lyra configuration
99 lines (73 loc) • 2.43 kB
JavaScript
;
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
};
}