synapse-react-client
Version:
[](https://travis-ci.com/Sage-Bionetworks/Synapse-React-Client) [](https://badge.fury.io/js/synaps
156 lines • 8.19 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var react_1 = (0, tslib_1.__importStar)(require("react"));
var utils_1 = require("./row_renderers/utils");
var synapseTypes_1 = require("../utils/synapseTypes");
var SynapseClient_1 = require("../utils/SynapseClient");
var IconSvg_1 = (0, tslib_1.__importDefault)(require("./IconSvg"));
var react_intersection_observer_1 = require("react-intersection-observer");
var SynapseContext_1 = require("../utils/SynapseContext");
var react_tooltip_1 = (0, tslib_1.__importDefault)(require("react-tooltip"));
var SynapseTableConstants_1 = require("./table/SynapseTableConstants");
var DirectDownload = function (props) {
var accessToken = (0, SynapseContext_1.useSynapseContext)().accessToken;
var associatedObjectId = props.associatedObjectId, entityVersionNumber = props.entityVersionNumber, associatedObjectType = props.associatedObjectType, fileHandleId = props.fileHandleId, displayFileName = props.displayFileName, onClickCallback = props.onClickCallback;
var _a = (0, react_intersection_observer_1.useInView)(), ref = _a.ref, inView = _a.inView;
var _b = (0, react_1.useState)(false), isExternalFile = _b[0], setIsExternalFile = _b[1];
var _c = (0, react_1.useState)(false), hasFileAccess = _c[0], setHasFileAccess = _c[1];
var _d = (0, react_1.useState)(), fileEntity = _d[0], setFileEntity = _d[1];
var _e = (0, react_1.useState)(), externalURL = _e[0], setExternalURL = _e[1];
var _f = (0, react_1.useState)(''), fileName = _f[0], setFileName = _f[1];
var mounted = true;
(0, react_1.useEffect)(function () {
if (mounted && inView) {
getFileEntityFileHandle();
}
return function () {
mounted = false;
};
}, [accessToken, inView]);
var getDownloadLink = function () { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () {
var preSignedURL, files, file, e_1;
return (0, tslib_1.__generator)(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 5, , 6]);
if (!(associatedObjectType === synapseTypes_1.FileHandleAssociateType.TableEntity)) return [3 /*break*/, 2];
return [4 /*yield*/, getTableEntityFileHandle(true)];
case 1:
files = _a.sent();
preSignedURL = files.requestedFiles[0].preSignedURL;
return [3 /*break*/, 4];
case 2: return [4 /*yield*/, (0, SynapseClient_1.getFileResult)(fileEntity, accessToken, false, true)];
case 3:
file = _a.sent();
preSignedURL = file.preSignedURL;
_a.label = 4;
case 4: return [3 /*break*/, 6];
case 5:
e_1 = _a.sent();
console.log('Fail to get file download link: ', e_1);
return [3 /*break*/, 6];
case 6:
if (!preSignedURL) {
console.log('Fail to get file download link');
}
else {
window.open(preSignedURL);
if (onClickCallback) {
onClickCallback();
}
}
return [2 /*return*/];
}
});
}); };
var hasFileHandle = function (fh) {
if (fh && !fh['isPreview']) {
setHasFileAccess(true);
return true;
}
else {
setHasFileAccess(false);
return false;
}
};
var getTableEntityFileHandle = function (includePreSignedURLs) {
if (includePreSignedURLs === void 0) { includePreSignedURLs = false; }
var fileHandleAssociationList = [
{
associateObjectId: associatedObjectId,
associateObjectType: associatedObjectType,
fileHandleId: fileHandleId,
},
];
var batchFileRequest = {
includeFileHandles: true,
includePreSignedURLs: includePreSignedURLs,
includePreviewPreSignedURLs: false,
requestedFiles: fileHandleAssociationList,
};
return (0, SynapseClient_1.getFiles)(batchFileRequest, accessToken);
};
var getFileEntityFileHandle = function () {
return (0, SynapseClient_1.getEntity)(accessToken, associatedObjectId, entityVersionNumber)
.then(function (entity) { return (0, tslib_1.__awaiter)(void 0, void 0, void 0, function () {
var files, fh;
return (0, tslib_1.__generator)(this, function (_a) {
switch (_a.label) {
case 0:
if (!entity.hasOwnProperty('dataFileHandleId')) return [3 /*break*/, 1];
// looks like a FileEntity, get the FileHandle
setFileEntity(entity);
return [2 /*return*/, (0, SynapseClient_1.getFileResult)(
// TODO: Why can we just use getFiles here?
entity, accessToken, true)
.then(function (data) {
var fh = data.fileHandle;
if (fh && hasFileHandle(fh)) {
// have file access and not file preview
if ((0, synapseTypes_1.implementsExternalFileHandleInterface)(fh)) {
setIsExternalFile(true);
setExternalURL(fh['externalURL']);
}
}
})
.catch(function (err) {
console.log('Error on getFileEntityFileHandle = ', err);
})];
case 1:
if (!(associatedObjectType === synapseTypes_1.FileHandleAssociateType.TableEntity)) return [3 /*break*/, 3];
return [4 /*yield*/, getTableEntityFileHandle()];
case 2:
files = _a.sent();
fh = files.requestedFiles[0].fileHandle;
if (displayFileName && fh && hasFileHandle(fh)) {
setFileName(fh.fileName);
}
_a.label = 3;
case 3: return [2 /*return*/, Promise.resolve()];
}
});
}); })
.catch(function (err) {
console.log('Error on getEntity = ', err);
});
};
var getIcon = function () {
if (isExternalFile) {
return (react_1.default.createElement("button", { className: 'btn-download-icon', onClick: onClickCallback },
react_1.default.createElement("a", { className: "ignoreLink", rel: "noreferrer", href: externalURL, target: "_blank" },
react_1.default.createElement(utils_1.Icon, { type: "externallink" }))));
}
if (hasFileAccess) {
return (react_1.default.createElement("button", { className: 'btn-download-icon', onClick: getDownloadLink },
react_1.default.createElement(IconSvg_1.default, { options: { icon: 'download' } }),
displayFileName && fileName ? fileName : ''));
}
return react_1.default.createElement(react_1.default.Fragment, null);
};
return (react_1.default.createElement("span", { ref: ref, "data-for": associatedObjectId + "-direct-download-tooltip", "data-tip": "Download this file individually" },
react_1.default.createElement(react_tooltip_1.default, { delayShow: SynapseTableConstants_1.TOOLTIP_DELAY_SHOW, place: "left", type: "dark", effect: "solid", id: associatedObjectId + "-direct-download-tooltip" }),
getIcon()));
};
exports.default = DirectDownload;
//# sourceMappingURL=DirectDownload.js.map