UNPKG

synapse-react-client

Version:

[![Build Status](https://travis-ci.com/Sage-Bionetworks/Synapse-React-Client.svg?branch=main)](https://travis-ci.com/Sage-Bionetworks/Synapse-React-Client) [![npm version](https://badge.fury.io/js/synapse-react-client.svg)](https://badge.fury.io/js/synaps

156 lines 8.19 kB
"use strict"; 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