@atlaskit/editor-plugin-card
Version:
Card plugin for @atlaskit/editor-core
193 lines (190 loc) • 10.1 kB
JavaScript
"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;
});