UNPKG

@atlaskit/editor-plugin-media

Version:

Media plugin for @atlaskit/editor-core

345 lines (343 loc) 17.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.updateMediaSingleWidthTr = exports.updateMediaSingleWidth = exports.toggleBorderMark = exports.setBorderMark = exports.removeInlineCardWithAnalytics = exports.removeInlineCard = exports.getNodeType = exports.changeMediaSingleToMediaInline = exports.changeMediaInlineToMediaSingle = exports.changeMediaCardToInline = exports.changeInlineToMediaCard = exports.DEFAULT_BORDER_SIZE = exports.DEFAULT_BORDER_COLOR = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _analytics = require("@atlaskit/editor-common/analytics"); var _editorAnalytics = require("@atlaskit/editor-common/editor-analytics"); var _mediaSingle = require("@atlaskit/editor-common/media-single"); var _model = require("@atlaskit/editor-prosemirror/model"); var _state = require("@atlaskit/editor-prosemirror/state"); var _utils = require("@atlaskit/editor-prosemirror/utils"); var _analytics2 = require("../../pm-plugins/utils/analytics"); var _currentMediaNode = require("../../pm-plugins/utils/current-media-node"); var _mediaCommon = require("../../pm-plugins/utils/media-common"); var _mediaSingle2 = require("../../pm-plugins/utils/media-single"); var _utils2 = require("./utils"); 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 DEFAULT_BORDER_COLOR = exports.DEFAULT_BORDER_COLOR = '#091e4224'; var DEFAULT_BORDER_SIZE = exports.DEFAULT_BORDER_SIZE = 2; var getNodeType = exports.getNodeType = function getNodeType(state) { var _state$schema$nodes = state.schema.nodes, mediaSingle = _state$schema$nodes.mediaSingle, mediaInline = _state$schema$nodes.mediaInline; return (0, _mediaCommon.isSelectionMediaSingleNode)(state) ? mediaSingle.name : mediaInline.name; }; var changeInlineToMediaCard = exports.changeInlineToMediaCard = function changeInlineToMediaCard(editorAnalyticsAPI, forceFocusSelector) { return function (state, dispatch) { var _findParentNodeCloses, _parent$content$first, _parent$content$lastC, _parent$content$lastC2; var _state$schema$nodes2 = state.schema.nodes, media = _state$schema$nodes2.media, mediaInline = _state$schema$nodes2.mediaInline, mediaGroup = _state$schema$nodes2.mediaGroup, paragraph = _state$schema$nodes2.paragraph, heading = _state$schema$nodes2.heading; var selectedNode = state.selection instanceof _state.NodeSelection && state.selection.node.type === mediaInline && state.selection.node; if (!selectedNode) { return false; } var _selectedNode$attrs = selectedNode.attrs, id = _selectedNode$attrs.id, type = _selectedNode$attrs.type, collection = _selectedNode$attrs.collection; var mediaNode = media.createChecked({ id: id, type: type, collection: collection }); var group = mediaGroup.createChecked({}, mediaNode); var parent = (_findParentNodeCloses = (0, _utils.findParentNodeClosestToPos)(state.selection.$from, function (node) { return node.type === paragraph || node.type === heading; })) === null || _findParentNodeCloses === void 0 ? void 0 : _findParentNodeCloses.node; var tr = state.tr; var insertPos; if (!!parent && parent.content.size === 2 && ((_parent$content$first = parent.content.firstChild) === null || _parent$content$first === void 0 ? void 0 : _parent$content$first.type.name) === 'mediaInline' && ((_parent$content$lastC = parent.content.lastChild) === null || _parent$content$lastC === void 0 ? void 0 : _parent$content$lastC.type.name) === 'text' && ((_parent$content$lastC2 = parent.content.lastChild) === null || _parent$content$lastC2 === void 0 || (_parent$content$lastC2 = _parent$content$lastC2.text) === null || _parent$content$lastC2 === void 0 ? void 0 : _parent$content$lastC2.trim()) === '') { /// Empty paragraph or empty heading /// Drop the corresponding card on the current line insertPos = state.tr.doc.resolve(state.selection.from).start() - 1; if (insertPos < 0) { return false; } tr = tr.delete(insertPos, insertPos + parent.nodeSize); tr = (0, _utils.safeInsert)(group, insertPos, false)(tr); } else { /// Non-empty paragraph, non-empty heading, or other nodes (e.g., action, list) /// Drop the corresponding card underneath the current line insertPos = state.tr.doc.resolve(state.selection.from).end(); tr = (0, _utils.removeSelectedNode)(tr); tr = (0, _utils.safeInsert)(group, insertPos, false)(tr); } if (dispatch) { editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({ action: _analytics.ACTION.CHANGED_TYPE, actionSubject: _analytics.ACTION_SUBJECT.MEDIA, eventType: _analytics.EVENT_TYPE.TRACK, attributes: { newType: _analytics.ACTION_SUBJECT_ID.MEDIA_GROUP, previousType: _analytics.ACTION_SUBJECT_ID.MEDIA_INLINE } })(tr); var $endOfNode = tr.doc.resolve(insertPos + 1); var newSelection = new _state.NodeSelection($endOfNode); tr.setSelection(newSelection); forceFocusSelector === null || forceFocusSelector === void 0 || forceFocusSelector(".thumbnail-appearance")(tr); dispatch(tr); } return true; }; }; var changeMediaCardToInline = exports.changeMediaCardToInline = function changeMediaCardToInline(editorAnalyticsAPI, forceFocusSelector) { return function (state, dispatch) { var _state$schema$nodes3 = state.schema.nodes, media = _state$schema$nodes3.media, mediaInline = _state$schema$nodes3.mediaInline, paragraph = _state$schema$nodes3.paragraph; var selectedNode = state.selection instanceof _state.NodeSelection && state.selection.node; // @ts-ignore - [unblock prosemirror bump] redundant check comparing boolean to media if (!selectedNode || !selectedNode.type === media) { return false; } var mediaInlineNode = mediaInline.create({ id: selectedNode.attrs.id, collection: selectedNode.attrs.collection }); var space = state.schema.text(' '); var content = _model.Fragment.from([mediaInlineNode, space]); var node = paragraph.createChecked({}, content); var nodePos = state.tr.doc.resolve(state.selection.from).start(); var tr = (0, _utils2.removeMediaGroupNode)(state); // Minus 1 to insert the node before the media group tr = (0, _utils.safeInsert)(node, nodePos - 1, false)(tr); if (dispatch) { editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({ action: _analytics.ACTION.CHANGED_TYPE, actionSubject: _analytics.ACTION_SUBJECT.MEDIA, eventType: _analytics.EVENT_TYPE.TRACK, attributes: { newType: _analytics.ACTION_SUBJECT_ID.MEDIA_INLINE, previousType: _analytics.ACTION_SUBJECT_ID.MEDIA_GROUP } })(tr); var newSelection = _state.NodeSelection.create(tr.doc, nodePos); tr.setSelection(newSelection); forceFocusSelector === null || forceFocusSelector === void 0 || forceFocusSelector(".inline-appearance")(tr); dispatch(tr); } return true; }; }; var changeMediaInlineToMediaSingle = exports.changeMediaInlineToMediaSingle = function changeMediaInlineToMediaSingle(editorAnalyticsAPI, widthPluginState, allowPixelResizing) { return function (state, dispatch, view) { var mediaInline = state.schema.nodes.mediaInline; var selectedNode = state.selection instanceof _state.NodeSelection && state.selection.node.type === mediaInline && state.selection.node; if (!selectedNode) { return false; } if (view) { return (0, _mediaSingle2.changeFromMediaInlineToMediaSingleNode)(view, selectedNode, widthPluginState, editorAnalyticsAPI, allowPixelResizing); } return true; }; }; var removeInlineCardWithAnalytics = exports.removeInlineCardWithAnalytics = function removeInlineCardWithAnalytics(editorAnalyticsAPI) { return (0, _editorAnalytics.withAnalytics)(editorAnalyticsAPI, { action: _analytics.ACTION.DELETED, actionSubject: _analytics.ACTION_SUBJECT.MEDIA_INLINE, attributes: { inputMethod: _analytics.INPUT_METHOD.FLOATING_TB }, eventType: _analytics.EVENT_TYPE.TRACK })(removeInlineCard); }; var removeInlineCard = exports.removeInlineCard = function removeInlineCard(state, dispatch) { if ((0, _utils.isNodeSelection)(state.selection)) { if (dispatch) { dispatch((0, _utils.removeSelectedNode)(state.tr)); } return true; } return false; }; var toggleBorderMark = exports.toggleBorderMark = function toggleBorderMark(editorAnalyticsAPI) { return function (state, dispatch) { var nodeWithPos = (0, _mediaSingle.currentMediaNodeWithPos)(state) || (0, _currentMediaNode.currentMediaInlineNodeWithPos)(state); if (!nodeWithPos) { return false; } var node = nodeWithPos.node, pos = nodeWithPos.pos; var borderMark = node.marks.find(function (m) { return m.type.name === 'border'; }); var marks = node.marks.filter(function (m) { return m.type.name !== 'border'; }).concat(borderMark ? [] : state.schema.marks.border.create({ color: DEFAULT_BORDER_COLOR, size: DEFAULT_BORDER_SIZE })); var tr = state.tr.setNodeMarkup(pos, node.type, node.attrs, marks); tr.setMeta('scrollIntoView', false); if (state.selection instanceof _state.NodeSelection) { if (state.selection.$anchor.pos === state.selection.from) { tr.setSelection(_state.NodeSelection.create(tr.doc, state.selection.from)); } } if (dispatch) { var type = getNodeType(state); if (borderMark !== null && borderMark !== void 0 && borderMark.attrs) { editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({ action: _analytics.ACTION.DELETED, actionSubject: _analytics.ACTION_SUBJECT.MEDIA, actionSubjectId: _analytics.ACTION_SUBJECT_ID.BORDER, eventType: _analytics.EVENT_TYPE.TRACK, attributes: { type: type, previousColor: borderMark.attrs.color, previousSize: borderMark.attrs.size, mediaType: node.attrs.type } })(tr); } else { editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({ action: _analytics.ACTION.ADDED, actionSubject: _analytics.ACTION_SUBJECT.MEDIA, actionSubjectId: _analytics.ACTION_SUBJECT_ID.BORDER, eventType: _analytics.EVENT_TYPE.TRACK, attributes: { type: type, color: DEFAULT_BORDER_COLOR, size: DEFAULT_BORDER_SIZE, mediaType: node.attrs.type } })(tr); } dispatch(tr); } return true; }; }; var setBorderMark = exports.setBorderMark = function setBorderMark(editorAnalyticsAPI) { return function (attrs) { return function (state, dispatch) { var _node$marks$find, _ref, _attrs$color, _ref2, _attrs$size; var nodeWithPos = (0, _mediaSingle.currentMediaNodeWithPos)(state) || (0, _currentMediaNode.currentMediaInlineNodeWithPos)(state); if (!nodeWithPos) { return false; } var node = nodeWithPos.node, pos = nodeWithPos.pos; var borderMark = (_node$marks$find = node.marks.find(function (m) { return m.type.name === 'border'; })) === null || _node$marks$find === void 0 ? void 0 : _node$marks$find.attrs; var color = (_ref = (_attrs$color = attrs.color) !== null && _attrs$color !== void 0 ? _attrs$color : borderMark === null || borderMark === void 0 ? void 0 : borderMark.color) !== null && _ref !== void 0 ? _ref : DEFAULT_BORDER_COLOR; var size = (_ref2 = (_attrs$size = attrs.size) !== null && _attrs$size !== void 0 ? _attrs$size : borderMark === null || borderMark === void 0 ? void 0 : borderMark.size) !== null && _ref2 !== void 0 ? _ref2 : DEFAULT_BORDER_SIZE; var marks = node.marks.filter(function (m) { return m.type.name !== 'border'; }).concat(state.schema.marks.border.create({ color: color, size: size })); var tr = state.tr.setNodeMarkup(pos, node.type, node.attrs, marks); tr.setMeta('scrollIntoView', false); if (state.selection instanceof _state.NodeSelection) { if (state.selection.$anchor.pos === state.selection.from) { tr.setSelection(_state.NodeSelection.create(tr.doc, state.selection.from)); } } if (dispatch) { editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({ action: _analytics.ACTION.UPDATED, actionSubject: _analytics.ACTION_SUBJECT.MEDIA, actionSubjectId: _analytics.ACTION_SUBJECT_ID.BORDER, eventType: _analytics.EVENT_TYPE.TRACK, attributes: { type: getNodeType(state), mediaType: node.attrs.type, previousColor: borderMark === null || borderMark === void 0 ? void 0 : borderMark.color, previousSize: borderMark === null || borderMark === void 0 ? void 0 : borderMark.size, newColor: color, newSize: size } })(tr); dispatch(tr); } return true; }; }; }; var updateMediaSingleWidthTr = exports.updateMediaSingleWidthTr = function updateMediaSingleWidthTr(editorAnalyticsAPI, state, width, validation, inputMethod, layout) { var selectedMediaSingleNode = (0, _utils2.getSelectedMediaSingle)(state); if (!selectedMediaSingleNode) { return null; } var tr = state.tr.setNodeMarkup(selectedMediaSingleNode.pos, undefined, _objectSpread(_objectSpread({}, selectedMediaSingleNode.node.attrs), {}, { width: width, widthType: 'pixel', layout: layout })); tr.setMeta('scrollIntoView', false); tr.setSelection(_state.NodeSelection.create(tr.doc, selectedMediaSingleNode.pos)); var $pos = state.doc.resolve(selectedMediaSingleNode.pos); var parentNodeType = $pos ? $pos.parent.type.name : undefined; var payload = (0, _analytics2.getMediaInputResizeAnalyticsEvent)('mediaSingle', { width: width, layout: layout, validation: validation, inputMethod: inputMethod, parentNode: parentNodeType }); if (payload) { editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent(payload)(tr); } return tr; }; var updateMediaSingleWidth = exports.updateMediaSingleWidth = function updateMediaSingleWidth(editorAnalyticsAPI) { return function (width, validation, inputMethod, layout) { return function (state, dispatch) { var tr = updateMediaSingleWidthTr(editorAnalyticsAPI, state, width, validation, inputMethod, layout); if (!tr) { return false; } if (dispatch) { dispatch(tr); } return true; }; }; }; var changeMediaSingleToMediaInline = exports.changeMediaSingleToMediaInline = function changeMediaSingleToMediaInline(editorAnalyticsAPI) { return function (state, dispatch) { var selectedNodeWithPos = (0, _utils2.getSelectedMediaSingle)(state); var _state$schema$nodes4 = state.schema.nodes, mediaInline = _state$schema$nodes4.mediaInline, paragraph = _state$schema$nodes4.paragraph; if (!selectedNodeWithPos) { return false; } var mediaSingleNode = selectedNodeWithPos.node; var mediaNode = mediaSingleNode.firstChild; if (!mediaNode) { return false; } var mediaInlineNode = mediaInline.create(_objectSpread(_objectSpread({}, mediaNode.attrs), {}, { type: 'image' }), null, mediaNode.marks); var space = state.schema.text(' '); var content = _model.Fragment.from([mediaInlineNode, space]); var node = paragraph.createChecked({}, content); var from = state.selection.from; var tr = state.tr; tr = (0, _utils.removeSelectedNode)(tr); tr = (0, _utils.safeInsert)(node, from, false)(tr); // 3 accounts for paragraph 1 + mediaInline size 1 + space 1 tr.setSelection(_state.TextSelection.create(tr.doc, from + 3)); if (dispatch) { editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent((0, _analytics2.getChangeMediaAnalytics)(_analytics.ACTION_SUBJECT_ID.MEDIA_SINGLE, _analytics.ACTION_SUBJECT_ID.MEDIA_INLINE, (0, _analytics2.findChangeFromLocation)(state.selection)))(tr); dispatch(tr); } return true; }; };