UNPKG

@atlaskit/editor-plugin-card

Version:

Card plugin for @atlaskit/editor-core

193 lines (190 loc) • 10.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.InlineCard = void 0; var _react = _interopRequireWildcard(require("react")); var _rafSchd = _interopRequireDefault(require("raf-schd")); var _uuid = require("uuid"); var _enums = require("@atlaskit/editor-common/analytics/types/enums"); var _utils = require("@atlaskit/editor-common/Popup/utils"); var _isExperimentEnabled = require("@atlaskit/platform-feature-experiments/is-experiment-enabled"); var _lazy = require("@atlaskit/smart-card/card/lazy"); var _ssr = require("@atlaskit/smart-card/ssr"); var _editorExperiment = require("@atlaskit/tmp-editor-statsig/editor-experiment"); var _actions = require("../pm-plugins/actions"); var _toolbar = require("../ui/toolbar"); var _isIntersectionObserverSupported = require("./isIntersectionObserverSupported"); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } // eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead var InlineCard = exports.InlineCard = /*#__PURE__*/(0, _react.memo)(function (_ref) { var _cardContext$value; var node = _ref.node, cardContext = _ref.cardContext, actionOptions = _ref.actionOptions, useAlternativePreloader = _ref.useAlternativePreloader, view = _ref.view, getPos = _ref.getPos, propsOnClick = _ref.onClick, onRes = _ref.onResolve, isHovered = _ref.isHovered, showHoverPreview = _ref.showHoverPreview, hoverPreviewOptions = _ref.hoverPreviewOptions, isPageSSRed = _ref.isPageSSRed, pluginInjectionApi = _ref.pluginInjectionApi, disablePreviewPanel = _ref.disablePreviewPanel; var _node$attrs = node.attrs, url = _node$attrs.url, data = _node$attrs.data; // eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead var refId = (0, _react.useRef)((0, _uuid.v4)()); var removeCardDispatched = (0, _react.useRef)(false); var pendingRegisterCard = (0, _react.useRef)(null); (0, _react.useEffect)(function () { return function () { if ((0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_reduce_memory_leaks')) { var _pendingRegisterCard$; (_pendingRegisterCard$ = pendingRegisterCard.current) === null || _pendingRegisterCard$ === void 0 || _pendingRegisterCard$.cancel(); pendingRegisterCard.current = null; } }; }, []); var cardActions = pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : pluginInjectionApi.card.actions; var registerResolvedCard = cardActions === null || cardActions === void 0 ? void 0 : cardActions.registerCard; var removeRegisteredCard = cardActions === null || cardActions === void 0 ? void 0 : cardActions.removeRegisteredCard; var _ref2 = (cardContext === null || cardContext === void 0 || (_cardContext$value = cardContext.value) === null || _cardContext$value === void 0 ? void 0 : _cardContext$value.store) || {}, getSmartlinkState = _ref2.getState; var cardState = getSmartlinkState === null || getSmartlinkState === void 0 ? void 0 : getSmartlinkState()[url || '']; (0, _react.useEffect)(function () { var id = refId.current; removeCardDispatched.current = false; return function () { if ((0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_inline_card_dispatch_guard') && removeCardDispatched.current) { return; } removeCardDispatched.current = true; if ((0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_reduce_forced_layout_2')) { removeRegisteredCard === null || removeRegisteredCard === void 0 || removeRegisteredCard(id); } else { var tr = view.state.tr; (0, _actions.removeCard)({ id: id })(tr); view.dispatch(tr); } }; }, [getPos, (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_reduce_forced_layout_2') ? undefined : view, (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_reduce_forced_layout_2') ? removeRegisteredCard : undefined]); var scrollContainer = (0, _react.useMemo)(function () { return (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_reduce_forced_layout_2') && (0, _isIntersectionObserverSupported.isIntersectionObserverSupported)() ? undefined : // eslint-disable-next-line @atlaskit/editor/no-as-casting (0, _utils.findOverflowScrollParent)(view.dom) || undefined; }, [view.dom]); var onResolve = (0, _react.useCallback)(function (data) { if (!getPos || typeof getPos === 'boolean') { return; } var title = data.title, url = data.url; // don't dispatch immediately since we might be in the middle of // rendering a nodeview var scheduleRegisterCard = (0, _rafSchd.default)(function () { if ((0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_reduce_forced_layout_2')) { if (removeCardDispatched.current || getPos() === undefined) { return; } var id = refId.current; registerResolvedCard === null || registerResolvedCard === void 0 || registerResolvedCard({ id: id, title: title, url: url, getPos: getPos }); onRes === null || onRes === void 0 || onRes(undefined, title); } else { // prosemirror-bump-fix var pos = getPos(); if (typeof pos !== 'number') { return; } var tr = view.state.tr; (0, _actions.registerCard)({ title: title, url: url, pos: pos, id: refId.current })(tr); onRes === null || onRes === void 0 || onRes(tr, title); view.dispatch(tr); } }); if ((0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_reduce_memory_leaks')) { pendingRegisterCard.current = scheduleRegisterCard; } scheduleRegisterCard(); }, [getPos, (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_reduce_forced_layout_2') ? undefined : view, onRes, (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_reduce_forced_layout_2') ? registerResolvedCard : undefined]); var onError = (0, _react.useCallback)(function (data) { var url = data.url, err = data.err; if (err) { throw err; } onResolve({ url: url }); }, [onResolve]); var handleOnClick = (0, _react.useCallback)(function (event, data) { if (event.metaKey || event.ctrlKey) { var _pluginInjectionApi$a, _data$destinationUrl; var _ref3 = (_pluginInjectionApi$a = pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : pluginInjectionApi.analytics) !== null && _pluginInjectionApi$a !== void 0 ? _pluginInjectionApi$a : {}, editorAnalyticsApi = _ref3.actions; (0, _toolbar.visitCardLinkAnalytics)(editorAnalyticsApi, _enums.INPUT_METHOD.META_CLICK)(view.state, view.dispatch); window.open((_data$destinationUrl = data === null || data === void 0 ? void 0 : data.destinationUrl) !== null && _data$destinationUrl !== void 0 ? _data$destinationUrl : url, '_blank'); } else { // only trigger the provided onClick callback if the meta key or ctrl key is not pressed propsOnClick === null || propsOnClick === void 0 || propsOnClick(event); } }, [propsOnClick, url, view, pluginInjectionApi]); var onClick = (0, _editorExperiment.editorExperiment)('platform_editor_controls', 'variant1') ? handleOnClick : propsOnClick; var card = (0, _react.useMemo)(function () { if ((isPageSSRed || cardState) && url) { return /*#__PURE__*/_react.default.createElement(_ssr.CardSSR, { key: url, url: url, appearance: "inline", onClick: onClick, container: scrollContainer, onResolve: onResolve, onError: onError, inlinePreloaderStyle: useAlternativePreloader ? 'on-right-without-skeleton' : undefined, actionOptions: actionOptions, isHovered: isHovered, showHoverPreview: showHoverPreview, hoverPreviewOptions: hoverPreviewOptions, disablePreviewPanel: disablePreviewPanel, hideIconLoadingSkeleton: true }); } return /*#__PURE__*/_react.default.createElement(_lazy.Card, { key: url, url: url !== null && url !== void 0 ? url : data.url, appearance: "inline", onClick: onClick, container: scrollContainer, onResolve: onResolve, onError: onError, inlinePreloaderStyle: useAlternativePreloader ? 'on-right-without-skeleton' : undefined, actionOptions: actionOptions, isHovered: isHovered, showHoverPreview: showHoverPreview, hoverPreviewOptions: hoverPreviewOptions, disablePreviewPanel: disablePreviewPanel }); }, [url, data, onClick, scrollContainer, onResolve, onError, useAlternativePreloader, actionOptions, isHovered, showHoverPreview, hoverPreviewOptions, isPageSSRed, disablePreviewPanel, cardState]); // [WS-2307]: we only render card wrapped into a Provider when the value is ready, // otherwise if we got data, we can render the card directly since it doesn't need the Provider return cardContext && cardContext.value ? /*#__PURE__*/_react.default.createElement(cardContext.Provider, { value: cardContext.value }, card) : data ? card : null; });