@atlaskit/editor-plugin-media
Version:
Media plugin for @atlaskit/editor-core
181 lines (176 loc) • 7.35 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.unlink = exports.showLinkingToolbarWithMediaTypeCheck = exports.showLinkingToolbar = exports.setUrlToMedia = exports.hideLinkingToolbar = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _analytics = require("@atlaskit/editor-common/analytics");
var _commands = require("@atlaskit/editor-common/commands");
var _utils = require("@atlaskit/editor-common/utils");
var _linking = require("../pm-plugins/linking");
var _actions = require("../pm-plugins/linking/actions");
var _main = require("../pm-plugins/main");
var _checkMediaType = require("../utils/check-media-type");
var _currentMediaNode = require("../utils/current-media-node");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var showLinkingToolbar = exports.showLinkingToolbar = (0, _linking.createMediaLinkingCommand)(function (state) {
var mediaLinkingState = (0, _linking.getMediaLinkingState)(state);
if (mediaLinkingState && mediaLinkingState.mediaPos !== null) {
var mediaSingle = state.doc.nodeAt(mediaLinkingState.mediaPos);
if (mediaSingle) {
return {
type: _actions.MediaLinkingActionsTypes.showToolbar
};
}
}
return false;
});
var showLinkingToolbarWithMediaTypeCheck = exports.showLinkingToolbarWithMediaTypeCheck = function showLinkingToolbarWithMediaTypeCheck(editorState, dispatch, editorView) {
if (dispatch && editorView) {
var mediaNode = (0, _currentMediaNode.currentMediaNode)(editorState);
if (!mediaNode) {
return false;
}
var _getMediaPluginState = (0, _main.getMediaPluginState)(editorState),
mediaClientConfig = _getMediaPluginState.mediaClientConfig;
if (!mediaClientConfig) {
return false;
}
(0, _checkMediaType.checkMediaType)(mediaNode, mediaClientConfig).then(function (mediaType) {
if ((mediaType === 'external' || mediaType === 'image') &&
// We make sure the selection and the node hasn't changed.
(0, _currentMediaNode.currentMediaNode)(editorView.state) === mediaNode) {
dispatch(editorView.state.tr.setMeta(_linking.mediaLinkingPluginKey, {
type: _actions.MediaLinkingActionsTypes.showToolbar
}));
}
});
}
return true;
};
var hideLinkingToolbarCommand = (0, _linking.createMediaLinkingCommand)({
type: _actions.MediaLinkingActionsTypes.hideToolbar
});
var hideLinkingToolbar = exports.hideLinkingToolbar = function hideLinkingToolbar(state, dispatch, view, focusFloatingToolbar) {
hideLinkingToolbarCommand(state, dispatch, view);
// restore focus on the editor so keyboard shortcuts aren't lost to the browser
if (view && !focusFloatingToolbar) {
view.focus();
}
};
function getCurrentUrl(state) {
var linkType = state.schema.marks.link;
var mediaLinkingState = (0, _linking.getMediaLinkingState)(state);
if (!mediaLinkingState || mediaLinkingState.mediaPos === null) {
return;
}
var $pos = state.doc.resolve(mediaLinkingState.mediaPos);
var node = state.doc.nodeAt($pos.pos);
if (!node) {
return;
}
var hasLink = linkType.isInSet(node.marks);
if (!hasLink) {
return;
}
var link = node.marks.find(function (mark) {
return mark.type === linkType;
}); // Already check exist
var url = link.attrs.href;
return url;
}
function toggleLinkMark(tr, state, _ref) {
var _ref$forceRemove = _ref.forceRemove,
forceRemove = _ref$forceRemove === void 0 ? false : _ref$forceRemove,
url = _ref.url;
var mediaLinkingState = (0, _linking.getMediaLinkingState)(state);
if (!mediaLinkingState || mediaLinkingState.mediaPos === null) {
return tr;
}
var $pos = state.doc.resolve(mediaLinkingState.mediaPos);
var node = state.doc.nodeAt($pos.pos);
if (!node) {
return tr;
}
var linkMark = state.schema.marks.link;
var media = state.schema.nodes.media;
var toggleBlockLinkMark = (0, _commands.createToggleBlockMarkOnRange)(linkMark, function (prevAttrs, node) {
// Only add mark to media
if (!node || node.type !== media) {
return; //No op
}
if (forceRemove) {
return false;
}
var href = (0, _utils.normalizeUrl)(url);
if (prevAttrs && prevAttrs.href === href) {
return; //No op
}
if (href.trim() === '') {
return false; // remove
}
return _objectSpread(_objectSpread({}, prevAttrs), {}, {
href: href
});
}, [media]);
toggleBlockLinkMark($pos.pos, $pos.pos + node.nodeSize, tr, state);
return tr;
}
var fireAnalyticForMediaLink = function fireAnalyticForMediaLink(tr, action) {
var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
var editorAnalyticsAPI = arguments.length > 3 ? arguments[3] : undefined;
editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({
action: action,
eventType: _analytics.EVENT_TYPE.TRACK,
actionSubject: _analytics.ACTION_SUBJECT.MEDIA,
actionSubjectId: _analytics.ACTION_SUBJECT_ID.LINK,
attributes: attributes
})(tr);
return tr;
};
var unlink = exports.unlink = function unlink(editorAnalyticsAPI) {
return (0, _linking.createMediaLinkingCommand)({
type: _actions.MediaLinkingActionsTypes.unlink
}, function (tr, state) {
var transaction = toggleLinkMark(tr, state, {
forceRemove: true
});
return fireAnalyticForMediaLink(transaction, _analytics.ACTION.DELETED, undefined, editorAnalyticsAPI);
});
};
var getAction = function getAction(newUrl, state) {
var currentUrl = getCurrentUrl(state);
if (!currentUrl) {
return _analytics.ACTION.ADDED;
} else if (newUrl !== currentUrl) {
return _analytics.ACTION.EDITED;
}
return undefined;
};
var setUrlToMedia = exports.setUrlToMedia = function setUrlToMedia(url, inputMethod, editorAnalyticsAPI) {
return (0, _linking.createMediaLinkingCommand)({
type: _actions.MediaLinkingActionsTypes.setUrl,
payload: (0, _utils.normalizeUrl)(url)
}, function (tr, state) {
var action = getAction(url, state);
if (!action) {
return tr;
}
try {
var toggleLinkMarkResult = toggleLinkMark(tr, state, {
url: url
});
fireAnalyticForMediaLink(tr, action, action === _analytics.ACTION.ADDED ? {
inputMethod: inputMethod
} : undefined, editorAnalyticsAPI);
return toggleLinkMarkResult;
} catch (e) {
fireAnalyticForMediaLink(tr, _analytics.ACTION.ERRORED, {
action: action
}, editorAnalyticsAPI);
throw e;
}
});
};