Stackedit/src/services/userSvc.js
Benoit Schweblin 1b2d48ff22 Removed monetizejs sponsorship support.
Reduced time counter increment interval.
Added badge service.
Refactored user service.
Replaced Google+ with People API.
2019-06-22 22:19:01 +01:00

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);