UNPKG

matrix-react-sdk

Version:
88 lines (85 loc) 16.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _matrix = require("matrix-js-sdk/src/matrix"); var _logger = require("matrix-js-sdk/src/logger"); var _close = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/close")); var _useStateToggle = require("../../../hooks/useStateToggle"); var _LinkPreviewWidget = _interopRequireDefault(require("./LinkPreviewWidget")); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _languageHandler = require("../../../languageHandler"); var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext")); var _useAsyncMemo = require("../../../hooks/useAsyncMemo"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /* Copyright 2024 New Vector Ltd. Copyright 2021 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const INITIAL_NUM_PREVIEWS = 2; const LinkPreviewGroup = ({ links, mxEvent, onCancelClick, onHeightChanged }) => { const cli = (0, _react.useContext)(_MatrixClientContext.default); const [expanded, toggleExpanded] = (0, _useStateToggle.useStateToggle)(); const ts = mxEvent.getTs(); const previews = (0, _useAsyncMemo.useAsyncMemo)(async () => { return fetchPreviews(cli, links, ts); }, [links, ts], []); (0, _react.useEffect)(() => { onHeightChanged?.(); }, [onHeightChanged, expanded, previews]); const showPreviews = expanded ? previews : previews.slice(0, INITIAL_NUM_PREVIEWS); let toggleButton; if (previews.length > INITIAL_NUM_PREVIEWS) { toggleButton = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: toggleExpanded }, expanded ? (0, _languageHandler._t)("action|collapse") : (0, _languageHandler._t)("timeline|url_preview|show_n_more", { count: previews.length - showPreviews.length })); } return /*#__PURE__*/_react.default.createElement("div", { className: "mx_LinkPreviewGroup" }, showPreviews.map(([link, preview], i) => /*#__PURE__*/_react.default.createElement(_LinkPreviewWidget.default, { key: link, link: link, preview: preview, mxEvent: mxEvent }, i === 0 ? /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_LinkPreviewGroup_hide", onClick: onCancelClick, "aria-label": (0, _languageHandler._t)("timeline|url_preview|close") }, /*#__PURE__*/_react.default.createElement(_close.default, { width: "20px", height: "20px" })) : undefined)), toggleButton); }; const fetchPreviews = (cli, links, ts) => { return Promise.all(links.map(async link => { try { const preview = await cli.getUrlPreview(link, ts); // Ensure at least one of the rendered fields is truthy if (preview?.["og:image"]?.startsWith("mxc://") || !!preview?.["og:description"] || !!preview?.["og:title"]) { return [link, preview]; } } catch (error) { if (error instanceof _matrix.MatrixError && error.httpStatus === 404) { // Quieten 404 Not found errors, not all URLs can have a preview generated _logger.logger.debug("Failed to get URL preview: ", error); } else { _logger.logger.error("Failed to get URL preview: ", error); } } })).then(a => a.filter(Boolean)); }; var _default = exports.default = LinkPreviewGroup; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbWF0cml4IiwiX2xvZ2dlciIsIl9jbG9zZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdXNlU3RhdGVUb2dnbGUiLCJfTGlua1ByZXZpZXdXaWRnZXQiLCJfQWNjZXNzaWJsZUJ1dHRvbiIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfTWF0cml4Q2xpZW50Q29udGV4dCIsIl91c2VBc3luY01lbW8iLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJJTklUSUFMX05VTV9QUkVWSUVXUyIsIkxpbmtQcmV2aWV3R3JvdXAiLCJsaW5rcyIsIm14RXZlbnQiLCJvbkNhbmNlbENsaWNrIiwib25IZWlnaHRDaGFuZ2VkIiwiY2xpIiwidXNlQ29udGV4dCIsIk1hdHJpeENsaWVudENvbnRleHQiLCJleHBhbmRlZCIsInRvZ2dsZUV4cGFuZGVkIiwidXNlU3RhdGVUb2dnbGUiLCJ0cyIsImdldFRzIiwicHJldmlld3MiLCJ1c2VBc3luY01lbW8iLCJmZXRjaFByZXZpZXdzIiwidXNlRWZmZWN0Iiwic2hvd1ByZXZpZXdzIiwic2xpY2UiLCJ0b2dnbGVCdXR0b24iLCJsZW5ndGgiLCJjcmVhdGVFbGVtZW50Iiwib25DbGljayIsIl90IiwiY291bnQiLCJjbGFzc05hbWUiLCJtYXAiLCJsaW5rIiwicHJldmlldyIsImtleSIsIndpZHRoIiwiaGVpZ2h0IiwidW5kZWZpbmVkIiwiUHJvbWlzZSIsImFsbCIsImdldFVybFByZXZpZXciLCJzdGFydHNXaXRoIiwiZXJyb3IiLCJNYXRyaXhFcnJvciIsImh0dHBTdGF0dXMiLCJsb2dnZXIiLCJkZWJ1ZyIsInRoZW4iLCJmaWx0ZXIiLCJCb29sZWFuIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3Mvcm9vbXMvTGlua1ByZXZpZXdHcm91cC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgTWF0cml4RXZlbnQsIE1hdHJpeEVycm9yLCBJUHJldmlld1VybFJlc3BvbnNlLCBNYXRyaXhDbGllbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5pbXBvcnQgQ2xvc2VJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy9jbG9zZVwiO1xuXG5pbXBvcnQgeyB1c2VTdGF0ZVRvZ2dsZSB9IGZyb20gXCIuLi8uLi8uLi9ob29rcy91c2VTdGF0ZVRvZ2dsZVwiO1xuaW1wb3J0IExpbmtQcmV2aWV3V2lkZ2V0IGZyb20gXCIuL0xpbmtQcmV2aWV3V2lkZ2V0XCI7XG5pbXBvcnQgQWNjZXNzaWJsZUJ1dHRvbiBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHsgdXNlQXN5bmNNZW1vIH0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZUFzeW5jTWVtb1wiO1xuXG5jb25zdCBJTklUSUFMX05VTV9QUkVWSUVXUyA9IDI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIGxpbmtzOiBzdHJpbmdbXTsgLy8gdGhlIFVSTHMgdG8gYmUgcHJldmlld2VkXG4gICAgbXhFdmVudDogTWF0cml4RXZlbnQ7IC8vIHRoZSBFdmVudCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZXZpZXdcbiAgICBvbkNhbmNlbENsaWNrKCk6IHZvaWQ7IC8vIGNhbGxlZCB3aGVuIHRoZSBwcmV2aWV3J3MgY2FuY2VsICgnaGlkZScpIGJ1dHRvbiBpcyBjbGlja2VkXG4gICAgb25IZWlnaHRDaGFuZ2VkPygpOiB2b2lkOyAvLyBjYWxsZWQgd2hlbiB0aGUgcHJldmlldydzIGNvbnRlbnRzIGhhcyBsb2FkZWRcbn1cblxuY29uc3QgTGlua1ByZXZpZXdHcm91cDogUmVhY3QuRkM8SVByb3BzPiA9ICh7IGxpbmtzLCBteEV2ZW50LCBvbkNhbmNlbENsaWNrLCBvbkhlaWdodENoYW5nZWQgfSkgPT4ge1xuICAgIGNvbnN0IGNsaSA9IHVzZUNvbnRleHQoTWF0cml4Q2xpZW50Q29udGV4dCk7XG4gICAgY29uc3QgW2V4cGFuZGVkLCB0b2dnbGVFeHBhbmRlZF0gPSB1c2VTdGF0ZVRvZ2dsZSgpO1xuXG4gICAgY29uc3QgdHMgPSBteEV2ZW50LmdldFRzKCk7XG4gICAgY29uc3QgcHJldmlld3MgPSB1c2VBc3luY01lbW88W3N0cmluZywgSVByZXZpZXdVcmxSZXNwb25zZV1bXT4oXG4gICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmZXRjaFByZXZpZXdzKGNsaSwgbGlua3MsIHRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgW2xpbmtzLCB0c10sXG4gICAgICAgIFtdLFxuICAgICk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBvbkhlaWdodENoYW5nZWQ/LigpO1xuICAgIH0sIFtvbkhlaWdodENoYW5nZWQsIGV4cGFuZGVkLCBwcmV2aWV3c10pO1xuXG4gICAgY29uc3Qgc2hvd1ByZXZpZXdzID0gZXhwYW5kZWQgPyBwcmV2aWV3cyA6IHByZXZpZXdzLnNsaWNlKDAsIElOSVRJQUxfTlVNX1BSRVZJRVdTKTtcblxuICAgIGxldCB0b2dnbGVCdXR0b246IEpTWC5FbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIGlmIChwcmV2aWV3cy5sZW5ndGggPiBJTklUSUFMX05VTV9QUkVWSUVXUykge1xuICAgICAgICB0b2dnbGVCdXR0b24gPSAoXG4gICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvbiBvbkNsaWNrPXt0b2dnbGVFeHBhbmRlZH0+XG4gICAgICAgICAgICAgICAge2V4cGFuZGVkXG4gICAgICAgICAgICAgICAgICAgID8gX3QoXCJhY3Rpb258Y29sbGFwc2VcIilcbiAgICAgICAgICAgICAgICAgICAgOiBfdChcInRpbWVsaW5lfHVybF9wcmV2aWV3fHNob3dfbl9tb3JlXCIsIHsgY291bnQ6IHByZXZpZXdzLmxlbmd0aCAtIHNob3dQcmV2aWV3cy5sZW5ndGggfSl9XG4gICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9MaW5rUHJldmlld0dyb3VwXCI+XG4gICAgICAgICAgICB7c2hvd1ByZXZpZXdzLm1hcCgoW2xpbmssIHByZXZpZXddLCBpKSA9PiAoXG4gICAgICAgICAgICAgICAgPExpbmtQcmV2aWV3V2lkZ2V0IGtleT17bGlua30gbGluaz17bGlua30gcHJldmlldz17cHJldmlld30gbXhFdmVudD17bXhFdmVudH0+XG4gICAgICAgICAgICAgICAgICAgIHtpID09PSAwID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9MaW5rUHJldmlld0dyb3VwX2hpZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2FuY2VsQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17X3QoXCJ0aW1lbGluZXx1cmxfcHJldmlld3xjbG9zZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2xvc2VJY29uIHdpZHRoPVwiMjBweFwiIGhlaWdodD1cIjIwcHhcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICApIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgIDwvTGlua1ByZXZpZXdXaWRnZXQ+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICAgIHt0b2dnbGVCdXR0b259XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59O1xuXG5jb25zdCBmZXRjaFByZXZpZXdzID0gKGNsaTogTWF0cml4Q2xpZW50LCBsaW5rczogc3RyaW5nW10sIHRzOiBudW1iZXIpOiBQcm9taXNlPFtzdHJpbmcsIElQcmV2aWV3VXJsUmVzcG9uc2VdW10+ID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGw8W3N0cmluZywgSVByZXZpZXdVcmxSZXNwb25zZV0gfCB2b2lkPihcbiAgICAgICAgbGlua3MubWFwKGFzeW5jIChsaW5rKTogUHJvbWlzZTxbc3RyaW5nLCBJUHJldmlld1VybFJlc3BvbnNlXSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aWV3ID0gYXdhaXQgY2xpLmdldFVybFByZXZpZXcobGluaywgdHMpO1xuICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJlbmRlcmVkIGZpZWxkcyBpcyB0cnV0aHlcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHByZXZpZXc/LltcIm9nOmltYWdlXCJdPy5zdGFydHNXaXRoKFwibXhjOi8vXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICEhcHJldmlldz8uW1wib2c6ZGVzY3JpcHRpb25cIl0gfHxcbiAgICAgICAgICAgICAgICAgICAgISFwcmV2aWV3Py5bXCJvZzp0aXRsZVwiXVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2xpbmssIHByZXZpZXddO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTWF0cml4RXJyb3IgJiYgZXJyb3IuaHR0cFN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFF1aWV0ZW4gNDA0IE5vdCBmb3VuZCBlcnJvcnMsIG5vdCBhbGwgVVJMcyBjYW4gaGF2ZSBhIHByZXZpZXcgZ2VuZXJhdGVkXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcIkZhaWxlZCB0byBnZXQgVVJMIHByZXZpZXc6IFwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRmFpbGVkIHRvIGdldCBVUkwgcHJldmlldzogXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICkudGhlbigoYSkgPT4gYS5maWx0ZXIoQm9vbGVhbikpIGFzIFByb21pc2U8W3N0cmluZywgSVByZXZpZXdVcmxSZXNwb25zZV1bXT47XG59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