@atlaskit/editor-plugin-card
Version:
Card plugin for @atlaskit/editor-core
89 lines (85 loc) • 4.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.resolveWithProvider = exports.handleProvider = void 0;
var _utils = require("@atlaskit/editor-common/utils");
var _actions = require("../actions");
var _doc = require("../doc");
var isFreshlyPastedOnNewLine = function isFreshlyPastedOnNewLine(view) {
var selection = view.state.selection;
var _ref = selection,
$cursor = _ref.$cursor,
$anchor = _ref.$anchor;
if (!$cursor) {
return false;
}
if (!(0, _utils.hasDocAsParent)($anchor)) {
return false;
}
var node = $cursor.node();
if (!node) {
return false;
}
if (node.type.name !== 'paragraph') {
return false;
}
return node.childCount === 1; // The pasted blue link itself
};
// ============================================================================ //
// ============================== PROVIDER UTILS ============================== //
// ============================================================================ //
// Used for all interactions with the EditorCardProvider.
// ============================================================================ //
var resolveWithProvider = exports.resolveWithProvider = function resolveWithProvider(view, provider, request, options, editorAnalyticsApi, createAnalyticsEvent, embedCardNodeTransformer) {
var isEmbedFriendlyLocation = isFreshlyPastedOnNewLine(view);
// When user manually changes appearance from blue link to smart link, we should respect that,
var shouldForceAppearance =
// This flag is set to true only in one place atm:
// packages/editor/editor-core/src/plugins/card/pm-plugins/doc.ts @ convertHyperlinkToSmartCard
// Which is used when user switching from URL to smart link appearance.
!!request.shouldReplaceLink;
var handleResolve = provider.resolve(request.url, request.appearance, shouldForceAppearance, isEmbedFriendlyLocation).then(handleResolved(view, request, editorAnalyticsApi, createAnalyticsEvent, options, embedCardNodeTransformer), handleRejected(view, request, editorAnalyticsApi));
return handleResolve;
};
var updateCardType = function updateCardType(resolvedCard, options) {
if (resolvedCard.type === 'blockCard' && 'datasource' in resolvedCard.attrs) {
var datasourceId = resolvedCard.attrs.datasource.id;
if (!options.allowDatasource || !(0, _utils.canRenderDatasource)(datasourceId)) {
delete resolvedCard.attrs.datasource;
resolvedCard.type = 'inlineCard';
return;
}
}
if ((resolvedCard === null || resolvedCard === void 0 ? void 0 : resolvedCard.type) === 'blockCard' && !options.allowBlockCards || (resolvedCard === null || resolvedCard === void 0 ? void 0 : resolvedCard.type) === 'embedCard' && !options.allowEmbeds) {
// clean out the 'layout' attr from an embedCard type that should be transformed into the inlineCard type.
if (resolvedCard.type === 'embedCard') {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
delete resolvedCard.attrs.layout;
}
resolvedCard.type = 'inlineCard';
}
};
var handleResolved = function handleResolved(view, request, editorAnalyticsApi, createAnalyticsEvent, options, embedCardNodeTransformer) {
return function (resolvedCard) {
updateCardType(resolvedCard, options);
(0, _doc.replaceQueuedUrlWithCard)(request.url, resolvedCard, request.analyticsAction, editorAnalyticsApi, createAnalyticsEvent, embedCardNodeTransformer)(view.state, view.dispatch);
return resolvedCard;
};
};
var handleRejected = function handleRejected(view, request, editorAnalyticsApi) {
return function () {
(0, _doc.handleFallbackWithAnalytics)(request, editorAnalyticsApi)(view.state, view.dispatch);
};
};
// listen for card provider changes
var handleProvider = exports.handleProvider = function handleProvider(_, provider, view) {
if (!provider) {
return;
}
provider.then(function (cardProvider) {
var state = view.state,
dispatch = view.dispatch;
dispatch((0, _actions.setProvider)(cardProvider)(state.tr));
});
};