1b2d48ff22
Reduced time counter increment interval. Added badge service. Refactored user service. Replaced Google+ with People API.
92 lines
2.6 KiB
JavaScript
92 lines
2.6 KiB
JavaScript
import store from '../store';
|
|
import utils from './utils';
|
|
|
|
const refreshUserInfoAfter = 60 * 60 * 1000; // 60 minutes
|
|
|
|
const infoResolversByType = {};
|
|
const subPrefixesByType = {};
|
|
const typesBySubPrefix = {};
|
|
|
|
const lastInfosByUserId = {};
|
|
const infoPromisedByUserId = {};
|
|
|
|
const sanitizeUserId = (userId) => {
|
|
const prefix = userId[2] === ':' && userId.slice(0, 2);
|
|
if (typesBySubPrefix[prefix]) {
|
|
return userId;
|
|
}
|
|
return `go:${userId}`;
|
|
};
|
|
|
|
const parseUserId = userId => [typesBySubPrefix[userId.slice(0, 2)], userId.slice(3)];
|
|
|
|
const refreshUserInfos = () => {
|
|
if (store.state.offline) {
|
|
return;
|
|
}
|
|
|
|
Object.entries(lastInfosByUserId)
|
|
.filter(([userId, lastInfo]) => lastInfo === 0 && !infoPromisedByUserId[userId])
|
|
.forEach(async ([userId]) => {
|
|
const [type, sub] = parseUserId(userId);
|
|
const infoResolver = infoResolversByType[type];
|
|
if (infoResolver) {
|
|
try {
|
|
infoPromisedByUserId[userId] = true;
|
|
const userInfo = await infoResolver(sub);
|
|
store.commit('userInfo/setItem', userInfo);
|
|
} finally {
|
|
infoPromisedByUserId[userId] = false;
|
|
lastInfosByUserId[userId] = Date.now();
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
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;
|
|
},
|
|
sanitizeUserId,
|
|
addUserInfo(userInfo) {
|
|
store.commit('userInfo/setItem', userInfo);
|
|
lastInfosByUserId[userInfo.id] = Date.now();
|
|
},
|
|
addUserId(userId) {
|
|
if (userId) {
|
|
const sanitizedUserId = sanitizeUserId(userId);
|
|
const lastInfo = lastInfosByUserId[sanitizedUserId];
|
|
if (lastInfo === undefined) {
|
|
// Try to find a token with this sub to resolve name as soon as possible
|
|
const [type, sub] = parseUserId(sanitizedUserId);
|
|
const token = store.getters['data/tokensByType'][type][sub];
|
|
if (token) {
|
|
store.commit('userInfo/setItem', {
|
|
id: sanitizedUserId,
|
|
name: token.name,
|
|
});
|
|
}
|
|
}
|
|
|
|
if (lastInfo === undefined || lastInfo + refreshUserInfoAfter < Date.now()) {
|
|
lastInfosByUserId[sanitizedUserId] = 0;
|
|
refreshUserInfos();
|
|
}
|
|
}
|
|
},
|
|
};
|
|
|
|
// Get user info periodically
|
|
utils.setInterval(() => refreshUserInfos(), 60 * 1000);
|