UNPKG

matrix-react-sdk

Version:
83 lines (78 loc) 10.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.tooltipifyLinks = tooltipifyLinks; exports.unmountTooltips = unmountTooltips; var _react = _interopRequireDefault(require("react")); var _reactDom = _interopRequireDefault(require("react-dom")); var _compoundWeb = require("@vector-im/compound-web"); var _PlatformPeg = _interopRequireDefault(require("../PlatformPeg")); var _LinkWithTooltip = _interopRequireDefault(require("../components/views/elements/LinkWithTooltip")); /* Copyright 2024 New Vector Ltd. Copyright 2022 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. */ /** * If the platform enabled needsUrlTooltips, recurses depth-first through a DOM tree, adding tooltip previews * for link elements. Otherwise, does nothing. * * @param {Element[]} rootNodes - a list of sibling DOM nodes to traverse to try * to add tooltips. * @param {Element[]} ignoredNodes: a list of nodes to not recurse into. * @param {Element[]} containers: an accumulator of the DOM nodes which contain * React components that have been mounted by this function. The initial caller * should pass in an empty array to seed the accumulator. */ function tooltipifyLinks(rootNodes, ignoredNodes, containers) { if (!_PlatformPeg.default.get()?.needsUrlTooltips()) { return; } let node = rootNodes[0]; while (node) { if (ignoredNodes.includes(node) || containers.includes(node)) { node = node.nextSibling; continue; } if (node.tagName === "A" && node.getAttribute("href") && node.getAttribute("href") !== node.textContent?.trim()) { let href = node.getAttribute("href"); try { href = new URL(href, window.location.href).toString(); } catch (e) { // Not all hrefs will be valid URLs } // The node's innerHTML was already sanitized before being rendered in the first place, here we are just // wrapping the link with the LinkWithTooltip component, keeping the same children. Ideally we'd do this // without the superfluous span but this is not something React trivially supports at this time. const tooltip = /*#__PURE__*/_react.default.createElement(_compoundWeb.TooltipProvider, null, /*#__PURE__*/_react.default.createElement(_LinkWithTooltip.default, { tooltip: href }, /*#__PURE__*/_react.default.createElement("span", { dangerouslySetInnerHTML: { __html: node.innerHTML } }))); _reactDom.default.render(tooltip, node); containers.push(node); } else if (node.childNodes?.length) { tooltipifyLinks(node.childNodes, ignoredNodes, containers); } node = node.nextSibling; } } /** * Unmount tooltip containers created by tooltipifyLinks. * * It's critical to call this after tooltipifyLinks, otherwise * tooltips will leak. * * @param {Element[]} containers - array of tooltip containers to unmount */ function unmountTooltips(containers) { for (const container of containers) { _reactDom.default.unmountComponentAtNode(container); } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdERvbSIsIl9jb21wb3VuZFdlYiIsIl9QbGF0Zm9ybVBlZyIsIl9MaW5rV2l0aFRvb2x0aXAiLCJ0b29sdGlwaWZ5TGlua3MiLCJyb290Tm9kZXMiLCJpZ25vcmVkTm9kZXMiLCJjb250YWluZXJzIiwiUGxhdGZvcm1QZWciLCJnZXQiLCJuZWVkc1VybFRvb2x0aXBzIiwibm9kZSIsImluY2x1ZGVzIiwibmV4dFNpYmxpbmciLCJ0YWdOYW1lIiwiZ2V0QXR0cmlidXRlIiwidGV4dENvbnRlbnQiLCJ0cmltIiwiaHJlZiIsIlVSTCIsIndpbmRvdyIsImxvY2F0aW9uIiwidG9TdHJpbmciLCJlIiwidG9vbHRpcCIsImRlZmF1bHQiLCJjcmVhdGVFbGVtZW50IiwiVG9vbHRpcFByb3ZpZGVyIiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJfX2h0bWwiLCJpbm5lckhUTUwiLCJSZWFjdERPTSIsInJlbmRlciIsInB1c2giLCJjaGlsZE5vZGVzIiwibGVuZ3RoIiwidW5tb3VudFRvb2x0aXBzIiwiY29udGFpbmVyIiwidW5tb3VudENvbXBvbmVudEF0Tm9kZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy90b29sdGlwaWZ5LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMiBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3RET00gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgVG9vbHRpcFByb3ZpZGVyIH0gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtd2ViXCI7XG5cbmltcG9ydCBQbGF0Zm9ybVBlZyBmcm9tIFwiLi4vUGxhdGZvcm1QZWdcIjtcbmltcG9ydCBMaW5rV2l0aFRvb2x0aXAgZnJvbSBcIi4uL2NvbXBvbmVudHMvdmlld3MvZWxlbWVudHMvTGlua1dpdGhUb29sdGlwXCI7XG5cbi8qKlxuICogSWYgdGhlIHBsYXRmb3JtIGVuYWJsZWQgbmVlZHNVcmxUb29sdGlwcywgcmVjdXJzZXMgZGVwdGgtZmlyc3QgdGhyb3VnaCBhIERPTSB0cmVlLCBhZGRpbmcgdG9vbHRpcCBwcmV2aWV3c1xuICogZm9yIGxpbmsgZWxlbWVudHMuIE90aGVyd2lzZSwgZG9lcyBub3RoaW5nLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudFtdfSByb290Tm9kZXMgLSBhIGxpc3Qgb2Ygc2libGluZyBET00gbm9kZXMgdG8gdHJhdmVyc2UgdG8gdHJ5XG4gKiAgIHRvIGFkZCB0b29sdGlwcy5cbiAqIEBwYXJhbSB7RWxlbWVudFtdfSBpZ25vcmVkTm9kZXM6IGEgbGlzdCBvZiBub2RlcyB0byBub3QgcmVjdXJzZSBpbnRvLlxuICogQHBhcmFtIHtFbGVtZW50W119IGNvbnRhaW5lcnM6IGFuIGFjY3VtdWxhdG9yIG9mIHRoZSBET00gbm9kZXMgd2hpY2ggY29udGFpblxuICogICBSZWFjdCBjb21wb25lbnRzIHRoYXQgaGF2ZSBiZWVuIG1vdW50ZWQgYnkgdGhpcyBmdW5jdGlvbi4gVGhlIGluaXRpYWwgY2FsbGVyXG4gKiAgIHNob3VsZCBwYXNzIGluIGFuIGVtcHR5IGFycmF5IHRvIHNlZWQgdGhlIGFjY3VtdWxhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9vbHRpcGlmeUxpbmtzKHJvb3ROb2RlczogQXJyYXlMaWtlPEVsZW1lbnQ+LCBpZ25vcmVkTm9kZXM6IEVsZW1lbnRbXSwgY29udGFpbmVyczogRWxlbWVudFtdKTogdm9pZCB7XG4gICAgaWYgKCFQbGF0Zm9ybVBlZy5nZXQoKT8ubmVlZHNVcmxUb29sdGlwcygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbm9kZSA9IHJvb3ROb2Rlc1swXTtcblxuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChpZ25vcmVkTm9kZXMuaW5jbHVkZXMobm9kZSkgfHwgY29udGFpbmVycy5pbmNsdWRlcyhub2RlKSkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcgYXMgRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgbm9kZS50YWdOYW1lID09PSBcIkFcIiAmJlxuICAgICAgICAgICAgbm9kZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpICYmXG4gICAgICAgICAgICBub2RlLmdldEF0dHJpYnV0ZShcImhyZWZcIikgIT09IG5vZGUudGV4dENvbnRlbnQ/LnRyaW0oKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBocmVmID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpITtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaHJlZiA9IG5ldyBVUkwoaHJlZiwgd2luZG93LmxvY2F0aW9uLmhyZWYpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gTm90IGFsbCBocmVmcyB3aWxsIGJlIHZhbGlkIFVSTHNcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVGhlIG5vZGUncyBpbm5lckhUTUwgd2FzIGFscmVhZHkgc2FuaXRpemVkIGJlZm9yZSBiZWluZyByZW5kZXJlZCBpbiB0aGUgZmlyc3QgcGxhY2UsIGhlcmUgd2UgYXJlIGp1c3RcbiAgICAgICAgICAgIC8vIHdyYXBwaW5nIHRoZSBsaW5rIHdpdGggdGhlIExpbmtXaXRoVG9vbHRpcCBjb21wb25lbnQsIGtlZXBpbmcgdGhlIHNhbWUgY2hpbGRyZW4uIElkZWFsbHkgd2UnZCBkbyB0aGlzXG4gICAgICAgICAgICAvLyB3aXRob3V0IHRoZSBzdXBlcmZsdW91cyBzcGFuIGJ1dCB0aGlzIGlzIG5vdCBzb21ldGhpbmcgUmVhY3QgdHJpdmlhbGx5IHN1cHBvcnRzIGF0IHRoaXMgdGltZS5cbiAgICAgICAgICAgIGNvbnN0IHRvb2x0aXAgPSAoXG4gICAgICAgICAgICAgICAgPFRvb2x0aXBQcm92aWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPExpbmtXaXRoVG9vbHRpcCB0b29sdGlwPXtocmVmfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogbm9kZS5pbm5lckhUTUwgfX0gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9MaW5rV2l0aFRvb2x0aXA+XG4gICAgICAgICAgICAgICAgPC9Ub29sdGlwUHJvdmlkZXI+XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBSZWFjdERPTS5yZW5kZXIodG9vbHRpcCwgbm9kZSk7XG4gICAgICAgICAgICBjb250YWluZXJzLnB1c2gobm9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZE5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRvb2x0aXBpZnlMaW5rcyhub2RlLmNoaWxkTm9kZXMgYXMgTm9kZUxpc3RPZjxFbGVtZW50PiwgaWdub3JlZE5vZGVzLCBjb250YWluZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nIGFzIEVsZW1lbnQ7XG4gICAgfVxufVxuXG4vKipcbiAqIFVubW91bnQgdG9vbHRpcCBjb250YWluZXJzIGNyZWF0ZWQgYnkgdG9vbHRpcGlmeUxpbmtzLlxuICpcbiAqIEl0J3MgY3JpdGljYWwgdG8gY2FsbCB0aGlzIGFmdGVyIHRvb2x0aXBpZnlMaW5rcywgb3RoZXJ3aXNlXG4gKiB0b29sdGlwcyB3aWxsIGxlYWsuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50W119IGNvbnRhaW5lcnMgLSBhcnJheSBvZiB0b29sdGlwIGNvbnRhaW5lcnMgdG8gdW5tb3VudFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5tb3VudFRvb2x0aXBzKGNvbnRhaW5lcnM6IEVsZW1lbnRbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIGNvbnRhaW5lcnMpIHtcbiAgICAgICAgUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxZQUFBLEdBQUFGLE9BQUE7QUFFQSxJQUFBRyxZQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxnQkFBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNLLGVBQWVBLENBQUNDLFNBQTZCLEVBQUVDLFlBQXVCLEVBQUVDLFVBQXFCLEVBQVE7RUFDakgsSUFBSSxDQUFDQyxvQkFBVyxDQUFDQyxHQUFHLENBQUMsQ0FBQyxFQUFFQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUU7SUFDeEM7RUFDSjtFQUVBLElBQUlDLElBQUksR0FBR04sU0FBUyxDQUFDLENBQUMsQ0FBQztFQUV2QixPQUFPTSxJQUFJLEVBQUU7SUFDVCxJQUFJTCxZQUFZLENBQUNNLFFBQVEsQ0FBQ0QsSUFBSSxDQUFDLElBQUlKLFVBQVUsQ0FBQ0ssUUFBUSxDQUFDRCxJQUFJLENBQUMsRUFBRTtNQUMxREEsSUFBSSxHQUFHQSxJQUFJLENBQUNFLFdBQXNCO01BQ2xDO0lBQ0o7SUFFQSxJQUNJRixJQUFJLENBQUNHLE9BQU8sS0FBSyxHQUFHLElBQ3BCSCxJQUFJLENBQUNJLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFDekJKLElBQUksQ0FBQ0ksWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLSixJQUFJLENBQUNLLFdBQVcsRUFBRUMsSUFBSSxDQUFDLENBQUMsRUFDeEQ7TUFDRSxJQUFJQyxJQUFJLEdBQUdQLElBQUksQ0FBQ0ksWUFBWSxDQUFDLE1BQU0sQ0FBRTtNQUNyQyxJQUFJO1FBQ0FHLElBQUksR0FBRyxJQUFJQyxHQUFHLENBQUNELElBQUksRUFBRUUsTUFBTSxDQUFDQyxRQUFRLENBQUNILElBQUksQ0FBQyxDQUFDSSxRQUFRLENBQUMsQ0FBQztNQUN6RCxDQUFDLENBQUMsT0FBT0MsQ0FBQyxFQUFFO1FBQ1I7TUFBQTs7TUFHSjtNQUNBO01BQ0E7TUFDQSxNQUFNQyxPQUFPLGdCQUNUM0IsTUFBQSxDQUFBNEIsT0FBQSxDQUFBQyxhQUFBLENBQUN6QixZQUFBLENBQUEwQixlQUFlLHFCQUNaOUIsTUFBQSxDQUFBNEIsT0FBQSxDQUFBQyxhQUFBLENBQUN2QixnQkFBQSxDQUFBc0IsT0FBZTtRQUFDRCxPQUFPLEVBQUVOO01BQUssZ0JBQzNCckIsTUFBQSxDQUFBNEIsT0FBQSxDQUFBQyxhQUFBO1FBQU1FLHVCQUF1QixFQUFFO1VBQUVDLE1BQU0sRUFBRWxCLElBQUksQ0FBQ21CO1FBQVU7TUFBRSxDQUFFLENBQy9DLENBQ0osQ0FDcEI7TUFFREMsaUJBQVEsQ0FBQ0MsTUFBTSxDQUFDUixPQUFPLEVBQUViLElBQUksQ0FBQztNQUM5QkosVUFBVSxDQUFDMEIsSUFBSSxDQUFDdEIsSUFBSSxDQUFDO0lBQ3pCLENBQUMsTUFBTSxJQUFJQSxJQUFJLENBQUN1QixVQUFVLEVBQUVDLE1BQU0sRUFBRTtNQUNoQy9CLGVBQWUsQ0FBQ08sSUFBSSxDQUFDdUIsVUFBVSxFQUF5QjVCLFlBQVksRUFBRUMsVUFBVSxDQUFDO0lBQ3JGO0lBRUFJLElBQUksR0FBR0EsSUFBSSxDQUFDRSxXQUFzQjtFQUN0QztBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTdUIsZUFBZUEsQ0FBQzdCLFVBQXFCLEVBQVE7RUFDekQsS0FBSyxNQUFNOEIsU0FBUyxJQUFJOUIsVUFBVSxFQUFFO0lBQ2hDd0IsaUJBQVEsQ0FBQ08sc0JBQXNCLENBQUNELFNBQVMsQ0FBQztFQUM5QztBQUNKIiwiaWdub3JlTGlzdCI6W119