80 lines
2.0 KiB
JavaScript
80 lines
2.0 KiB
JavaScript
import store from '../store';
|
|
|
|
const infoPromisesByUserId = {};
|
|
const infoResolversByType = {};
|
|
const subPrefixesByType = {};
|
|
const typesBySubPrefix = {};
|
|
|
|
const parseUserId = (userId) => {
|
|
const prefix = userId[2] === ':' && userId.slice(0, 2);
|
|
const type = typesBySubPrefix[prefix];
|
|
return type ? [type, userId.slice(3)] : ['google', userId];
|
|
};
|
|
|
|
|
|
export default {
|
|
setInfoResolver(type, subPrefix, resolver) {
|
|
infoResolversByType[type] = resolver;
|
|
subPrefixesByType[type] = subPrefix;
|
|
typesBySubPrefix[subPrefix] = type;
|
|
},
|
|
getCurrentUserId() {
|
|
const loginToken = store.getters['workspace/loginToken'];
|
|
if (!loginToken) {
|
|
return null;
|
|
}
|
|
const loginType = store.getters['workspace/loginType'];
|
|
const prefix = subPrefixesByType[loginType];
|
|
return prefix ? `${prefix}:${loginToken.sub}` : loginToken.sub;
|
|
},
|
|
addInfo(info) {
|
|
infoPromisesByUserId[info.id] = Promise.resolve(info);
|
|
store.commit('userInfo/addItem', info);
|
|
},
|
|
async getInfo(userId) {
|
|
if (!userId) {
|
|
return {};
|
|
}
|
|
|
|
let infoPromise = infoPromisesByUserId[userId];
|
|
if (infoPromise) {
|
|
return infoPromise;
|
|
}
|
|
|
|
const [type, sub] = parseUserId(userId);
|
|
|
|
// Try to find a token with this sub to resolve name as soon as possible
|
|
const token = store.getters['data/tokensByType'][type][sub];
|
|
if (token) {
|
|
store.commit('userInfo/addItem', {
|
|
id: userId,
|
|
name: token.name,
|
|
});
|
|
}
|
|
|
|
if (store.state.offline) {
|
|
return {};
|
|
}
|
|
|
|
// Get user info from helper
|
|
infoPromise = new Promise(async (resolve) => {
|
|
const infoResolver = infoResolversByType[type];
|
|
if (infoResolver) {
|
|
try {
|
|
const userInfo = await infoResolver(sub);
|
|
this.addInfo(userInfo);
|
|
resolve(userInfo);
|
|
} catch (err) {
|
|
if (err && err.message === 'RETRY') {
|
|
infoPromisesByUserId[userId] = null;
|
|
}
|
|
resolve({});
|
|
}
|
|
}
|
|
});
|
|
|
|
infoPromisesByUserId[userId] = infoPromise;
|
|
return infoPromise;
|
|
},
|
|
};
|