synapse-react-client
Version:
[](https://travis-ci.com/Sage-Bionetworks/Synapse-React-Client) [](https://badge.fury.io/js/synaps
158 lines • 8.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var react_1 = require("react");
var SynapseClient_1 = require("../SynapseClient");
var getUserData_1 = require("../functions/getUserData");
var __1 = require("..");
var lodash_es_1 = require("lodash-es");
var use_deep_compare_effect_1 = (0, tslib_1.__importDefault)(require("use-deep-compare-effect"));
var SynapseContext_1 = require("../SynapseContext");
var UserProfileTemplate = {
ownerId: '',
firstName: 'Unknown',
lastName: 'Unknown',
userName: 'Unknown', // A name chosen by the user that uniquely identifies them
};
var entityHeaderTemplate = {
name: 'Unknown',
id: 'unknown',
type: 'org.sagebionetworks.repo.model.FileEntity',
versionNumber: 0,
versionLabel: 'placeholder',
benefactorId: 0,
createdOn: 'null',
modifiedOn: 'null',
createdBy: 'null',
modifiedBy: 'null', // The ID of the user that last modified this entity.
};
var getEntityHeaderItems = function (lookupList, token) { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () {
var newData, notFound, notFoundPlaceholders;
return (0, tslib_1.__generator)(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, (0, SynapseClient_1.getEntityHeaders)(lookupList, token)];
case 1:
newData = _a.sent();
notFound = lookupList.filter(function (item) { return newData.results.map(function (item) { return item.id; }).indexOf(item.targetId) === -1; });
notFoundPlaceholders = notFound.map(function (item) { return ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, entityHeaderTemplate), { id: item.targetId, name: "" + item.targetId })); });
return [2 /*return*/, (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], newData.results, true), notFoundPlaceholders, true)];
}
});
}); };
var getUserProfileItems = function (lookupList) { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () {
var newData, notFound, notFoundPlaceholders;
return (0, tslib_1.__generator)(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, (0, getUserData_1.getUserProfileWithProfilePicAttached)(lookupList)];
case 1:
newData = _a.sent();
notFound = lookupList.filter(function (item) { return newData.list.map(function (item) { return item.ownerId; }).indexOf(item) === -1; });
notFoundPlaceholders = notFound.map(function (item) { return ((0, tslib_1.__assign)((0, tslib_1.__assign)({}, UserProfileTemplate), { ownerId: item, name: "Unknown User (" + item + ")" })); });
return [2 /*return*/, (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], newData.list, true), notFoundPlaceholders, true)];
}
});
}); };
// React hook to get user profiles or entities
//******************************************************************************************* */
function useGetInfoFromIds(props) {
var _this = this;
var ids = props.ids, type = props.type;
var accessToken = (0, SynapseContext_1.useSynapseContext)().accessToken;
var _a = (0, react_1.useState)([]), data = _a[0], setData = _a[1];
var idProp = function (type) {
return type === 'USER_PROFILE' ? 'ownerId' : 'id';
};
var storageKey = function (type) {
return type === 'USER_PROFILE'
? __1.SynapseConstants.USER_PROFILE_STORAGE_KEY
: __1.SynapseConstants.ENTITY_HEADER_STORAGE_KEY;
};
// look at current list of data, see if incoming ids has new data,
// if so grab those ids
var curList = data.map(function (el) { return el[idProp(type)]; });
var incomingList = ids.filter(function (el) { return el !== __1.SynapseConstants.VALUE_NOT_SET; });
var newValues = (0, lodash_es_1.uniq)(lodash_es_1.without.apply(void 0, (0, tslib_1.__spreadArray)([incomingList], curList, false)));
var saveToSessionStorage = function (data, type) {
if (!data.length) {
return;
}
//get what's there
var dataInStorage = sessionStorage.getItem(storageKey(type));
try {
var dataInStorageAsObjectArr = dataInStorage
? JSON.parse(dataInStorage)
: [];
//get an array of ids for items already in storage
var ids_1 = dataInStorageAsObjectArr.map(function (item) { return item[idProp(type)]; });
//push all the new data if ids are new
for (var _i = 0, data_1 = data; _i < data_1.length; _i++) {
var dataObject = data_1[_i];
if (!ids_1.includes(dataObject[idProp(type)])) {
dataInStorageAsObjectArr.push(dataObject);
}
}
sessionStorage.setItem(storageKey(type), JSON.stringify(dataInStorageAsObjectArr));
}
catch (e) {
sessionStorage.setItem(storageKey(type), JSON.stringify(data));
}
};
// Alina TODO: check if the items are already in Local Storage before making server call.
// Michael TODO: There's a bug where the data held in useGetInfoFromIds will be stale if the user token changes,
// this can be solved by using the useCompare hook on the token to track when it changes
(0, use_deep_compare_effect_1.default)(function () {
var getData = function () { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
var newIds, newReferences, newReferencesChunks, totalData_1, _i, newReferencesChunks_1, newReferences_1, newData, _a, error_1;
return (0, tslib_1.__generator)(this, function (_b) {
switch (_b.label) {
case 0:
if (!(newValues.length > 0)) return [3 /*break*/, 10];
_b.label = 1;
case 1:
_b.trys.push([1, 9, , 10]);
newIds = Array.from(newValues);
newReferences = type === 'USER_PROFILE'
? newIds
: newIds.map(function (el) { return ({ targetId: el }); });
newReferencesChunks = (0, lodash_es_1.chunk)(newReferences, 45);
totalData_1 = [];
_i = 0, newReferencesChunks_1 = newReferencesChunks;
_b.label = 2;
case 2:
if (!(_i < newReferencesChunks_1.length)) return [3 /*break*/, 8];
newReferences_1 = newReferencesChunks_1[_i];
if (!(type === 'USER_PROFILE')) return [3 /*break*/, 4];
return [4 /*yield*/, getUserProfileItems(newReferences_1)];
case 3:
_a = _b.sent();
return [3 /*break*/, 6];
case 4: return [4 /*yield*/, getEntityHeaderItems(newReferences_1, accessToken)];
case 5:
_a = _b.sent();
_b.label = 6;
case 6:
newData = _a;
totalData_1.push.apply(totalData_1, newData);
_b.label = 7;
case 7:
_i++;
return [3 /*break*/, 2];
case 8:
setData(function (oldData) { return oldData.concat.apply(oldData, totalData_1); });
return [3 /*break*/, 10];
case 9:
error_1 = _b.sent();
console.error('Error on data retrieval', error_1);
return [3 /*break*/, 10];
case 10:
saveToSessionStorage(data, type);
return [2 /*return*/];
}
});
}); };
getData();
}, [accessToken, type, newValues]);
return data;
}
exports.default = useGetInfoFromIds;
//# sourceMappingURL=useGetInfoFromIds.js.map