UNPKG

@atlaskit/editor-plugin-media

Version:

Media plugin for @atlaskit/editor-core

300 lines (290 loc) 12.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.splitMediaGroup = exports.removeMediaNode = exports.posOfPrecedingMediaGroup = exports.posOfParentMediaGroup = exports.posOfMediaGroupNearby = exports.isSelectionNonMediaBlockNode = exports.isSelectionMediaSingleNode = exports.isNodeDoubleClickSupportedInLivePagesViewMode = exports.isMediaSingleOrInlineNodeSelected = exports.isMediaBlobUrlFromAttrs = exports.isInsidePotentialEmptyParagraph = exports.getMediaSingleOrInlineNodeFromSelection = exports.getMediaNodeFromSelection = exports.getMediaFromSupportedMediaNodesFromSelection = exports.getIdentifier = exports.extractMediaNodes = exports.createMediaIdentifierArray = exports.copyOptionalAttrsFromMediaState = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _selection = require("@atlaskit/editor-common/selection"); var _utils = require("@atlaskit/editor-common/utils"); var _commands = require("@atlaskit/editor-prosemirror/commands"); var _state = require("@atlaskit/editor-prosemirror/state"); var _utils2 = require("@atlaskit/editor-prosemirror/utils"); var _mediaClient = require("@atlaskit/media-client"); var _utils3 = require("../../ui/toolbar/utils"); var _main = require("../main"); var _mediaSingle = require("./media-single"); var isTemporary = function isTemporary(id) { return id.indexOf('temporary:') === 0; }; var isMediaBlobUrlFromAttrs = exports.isMediaBlobUrlFromAttrs = function isMediaBlobUrlFromAttrs(attrs) { return !!(attrs && attrs.type === 'external' && (0, _mediaClient.isMediaBlobUrl)(attrs.url)); }; var posOfMediaGroupNearby = exports.posOfMediaGroupNearby = function posOfMediaGroupNearby(state) { return posOfParentMediaGroup(state) || posOfFollowingMediaGroup(state) || posOfPrecedingMediaGroup(state) || posOfMediaGroupNextToGapCursor(state); }; var isSelectionNonMediaBlockNode = exports.isSelectionNonMediaBlockNode = function isSelectionNonMediaBlockNode(state) { var _ref = state.selection, node = _ref.node; return node && node.type !== state.schema.nodes.media && node.isBlock; }; var isSelectionMediaSingleNode = exports.isSelectionMediaSingleNode = function isSelectionMediaSingleNode(state) { var _ref2 = state.selection, node = _ref2.node; return node && node.type === state.schema.nodes.mediaSingle; }; var isSelectionMediaInlineNode = function isSelectionMediaInlineNode(state) { var _ref3 = state.selection, node = _ref3.node; return node && node.type === state.schema.nodes.mediaInline; }; var posOfPrecedingMediaGroup = exports.posOfPrecedingMediaGroup = function posOfPrecedingMediaGroup(state) { if (!(0, _selection.atTheBeginningOfBlock)(state)) { return; } return posOfMediaGroupAbove(state, state.selection.$from); }; var posOfMediaGroupNextToGapCursor = function posOfMediaGroupNextToGapCursor(state) { var selection = state.selection; if (selection instanceof _selection.GapCursorSelection) { var $pos = state.selection.$from; var mediaGroupType = state.schema.nodes.mediaGroup; return posOfImmediatePrecedingMediaGroup($pos, mediaGroupType) || posOfImmediateFollowingMediaGroup($pos, mediaGroupType); } }; var posOfImmediatePrecedingMediaGroup = function posOfImmediatePrecedingMediaGroup($pos, mediaGroupType) { if ($pos.nodeBefore && $pos.nodeBefore.type === mediaGroupType) { return $pos.pos - $pos.nodeBefore.nodeSize + 1; } }; var posOfImmediateFollowingMediaGroup = function posOfImmediateFollowingMediaGroup($pos, mediaGroupType) { if ($pos.nodeAfter && $pos.nodeAfter.type === mediaGroupType) { return $pos.pos + 1; } }; var posOfFollowingMediaGroup = function posOfFollowingMediaGroup(state) { if (!(0, _selection.atTheEndOfBlock)(state)) { return; } return posOfMediaGroupBelow(state, state.selection.$to); }; var posOfMediaGroupAbove = function posOfMediaGroupAbove(state, $pos) { var adjacentPos; var adjacentNode; if (isSelectionNonMediaBlockNode(state)) { adjacentPos = $pos.pos; adjacentNode = $pos.nodeBefore; } else { adjacentPos = (0, _selection.startPositionOfParent)($pos) - 1; adjacentNode = state.doc.resolve(adjacentPos).nodeBefore; } if (adjacentNode && adjacentNode.type === state.schema.nodes.mediaGroup) { return adjacentPos - adjacentNode.nodeSize + 1; } return; }; /** * Determine whether the cursor is inside empty paragraph * or the selection is the entire paragraph */ var isInsidePotentialEmptyParagraph = exports.isInsidePotentialEmptyParagraph = function isInsidePotentialEmptyParagraph(state) { var $from = state.selection.$from; return $from.parent.type === state.schema.nodes.paragraph && (0, _selection.atTheBeginningOfBlock)(state) && (0, _selection.atTheEndOfBlock)(state); }; var posOfMediaGroupBelow = function posOfMediaGroupBelow(state, $pos) { var prepend = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; var adjacentPos; var adjacentNode; if (isSelectionNonMediaBlockNode(state)) { adjacentPos = $pos.pos; adjacentNode = $pos.nodeAfter; } else { adjacentPos = (0, _selection.endPositionOfParent)($pos); adjacentNode = state.doc.nodeAt(adjacentPos); } if (adjacentNode && adjacentNode.type === state.schema.nodes.mediaGroup) { return prepend ? adjacentPos + 1 : adjacentPos + adjacentNode.nodeSize - 1; } return; }; var posOfParentMediaGroup = exports.posOfParentMediaGroup = function posOfParentMediaGroup(state, $pos) { var prepend = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var $from = state.selection.$from; $pos = $pos || $from; if ($pos.parent.type === state.schema.nodes.mediaGroup) { return prepend ? (0, _selection.startPositionOfParent)($pos) : (0, _selection.endPositionOfParent)($pos) - 1; } return; }; var removeMediaNode = exports.removeMediaNode = function removeMediaNode(view, node, getPos) { var id = node.attrs.id; var state = view.state; var tr = state.tr, selection = state.selection, doc = state.doc; var currentMediaNodePos = getPos(); if (typeof currentMediaNodePos !== 'number') { return; } tr.deleteRange(currentMediaNodePos, currentMediaNodePos + node.nodeSize); if (isTemporary(id)) { tr.setMeta('addToHistory', false); } var $currentMediaNodePos = doc.resolve(currentMediaNodePos); var nodeBefore = $currentMediaNodePos.nodeBefore, parent = $currentMediaNodePos.parent; var isLastMediaNode = $currentMediaNodePos.index() === parent.childCount - 1; // If deleting a selected media node, we need to tell where the cursor to go next. // Prosemirror didn't gave us the behaviour of moving left if the media node is not the last one. // So we handle it ourselves. if (selection.from === currentMediaNodePos && !isLastMediaNode && !(0, _selection.atTheBeginningOfDoc)(state) && nodeBefore && nodeBefore.type.name === 'media') { var _nodeBefore = (0, _utils2.findPositionOfNodeBefore)(tr.selection); if (_nodeBefore) { tr.setSelection(_state.NodeSelection.create(tr.doc, _nodeBefore)); } } view.dispatch(tr); }; var splitMediaGroup = exports.splitMediaGroup = function splitMediaGroup(view) { var selection = view.state.selection; // if selection is not a media node, do nothing. if (!(selection instanceof _state.NodeSelection) || selection.node.type !== view.state.schema.nodes.media) { return false; } (0, _commands.deleteSelection)(view.state, view.dispatch); if (selection.$to.nodeAfter) { (0, _commands.splitBlock)(view.state, view.dispatch); (0, _utils.createParagraphNear)(false)(view.state, view.dispatch); } else { (0, _utils.createNewParagraphBelow)(view.state, view.dispatch); } return true; }; var isOptionalAttr = function isOptionalAttr(attr) { return attr.length > 1 && attr[0] === '_' && attr[1] === '_'; }; var copyOptionalAttrsFromMediaState = exports.copyOptionalAttrsFromMediaState = function copyOptionalAttrsFromMediaState(mediaState, node) { Object.keys(node.attrs).filter(isOptionalAttr).forEach(function (key) { var mediaStateKey = key.substring(2); var attrValue = mediaState[mediaStateKey]; if (attrValue !== undefined) { // @ts-ignore - [unblock prosemirror bump] assigning to readonly prop node.attrs[key] = attrValue; } }); }; var getMediaNodeFromSelection = exports.getMediaNodeFromSelection = function getMediaNodeFromSelection(state) { if (!isSelectionMediaSingleNode(state)) { return null; } var tr = state.tr; var pos = tr.selection.from + 1; var mediaNode = tr.doc.nodeAt(pos); if (mediaNode && mediaNode.type === state.schema.nodes.media) { return mediaNode; } return null; }; var getMediaInlineNodeFromSelection = function getMediaInlineNodeFromSelection(state) { if (!isSelectionMediaInlineNode(state)) { return null; } var tr = state.tr; var pos = tr.selection.from; var mediaNode = tr.doc.nodeAt(pos); return mediaNode; }; var isMediaSingleOrInlineNodeSelected = exports.isMediaSingleOrInlineNodeSelected = function isMediaSingleOrInlineNodeSelected(state) { var _getMediaPluginState = (0, _main.getMediaPluginState)(state), allowInlineImages = _getMediaPluginState.allowInlineImages; return isSelectionMediaSingleNode(state) || allowInlineImages && isSelectionMediaInlineNode(state); }; var getMediaSingleOrInlineNodeFromSelection = exports.getMediaSingleOrInlineNodeFromSelection = function getMediaSingleOrInlineNodeFromSelection(state) { var _getMediaPluginState2 = (0, _main.getMediaPluginState)(state), allowInlineImages = _getMediaPluginState2.allowInlineImages; var mediaNode = getMediaNodeFromSelection(state) || allowInlineImages && getMediaInlineNodeFromSelection(state); return mediaNode || null; }; var getMediaFromSupportedMediaNodesFromSelection = exports.getMediaFromSupportedMediaNodesFromSelection = function getMediaFromSupportedMediaNodesFromSelection(state) { var _ref4 = state.selection, node = _ref4.node; // Specifically for media supported nodes, double click could have been initiated on the media caption if (!node) { return null; } switch (node.type) { case node.type.schema.nodes.media: case node.type.schema.nodes.mediaInline: return node; case node.type.schema.nodes.mediaSingle: case node.type.schema.nodes.mediaGroup: return node.firstChild; default: return null; } }; var isNodeDoubleClickSupportedInLivePagesViewMode = exports.isNodeDoubleClickSupportedInLivePagesViewMode = function isNodeDoubleClickSupportedInLivePagesViewMode(isViewMode, node) { if (!node) { return false; } // Double Click is not supported for video nodes on both views if ((0, _mediaSingle.isVideo)(node.attrs.__fileMimeType)) { return false; } // Double click is supported for all editor media nodes if (!isViewMode) { return true; } // Double Click is not supported for mediaGroup and mediaInline nodes that are file if (node.type === node.type.schema.nodes.mediaGroup || node.type === node.type.schema.nodes.mediaInline && node.attrs.type === 'file') { return false; } // Double Click supported for all other media nodes return true; }; var getIdentifier = exports.getIdentifier = function getIdentifier(attrs) { if ((0, _utils3.isExternalMedia)(attrs)) { return { mediaItemType: 'external-image', dataURI: attrs.url }; } else { var id = attrs.id, _attrs$collection = attrs.collection, collection = _attrs$collection === void 0 ? '' : _attrs$collection; return { id: id, mediaItemType: 'file', collectionName: collection }; } }; var extractMediaNodes = exports.extractMediaNodes = function extractMediaNodes(doc) { var mediaNodes = []; doc.descendants(function (node) { if (node.type.name === 'media' || node.type.name === 'mediaInline') { mediaNodes.push(node); } }); return mediaNodes; }; // eslint-disable-next-line @typescript-eslint/no-explicit-any var createMediaIdentifierArray = exports.createMediaIdentifierArray = function createMediaIdentifierArray(mediaNodes) { var mediaIdentifierMap = new Map(); mediaNodes.forEach(function (item) { var attrs = item.attrs; if (!attrs) { return; } if ((0, _mediaSingle.isVideo)(attrs.__fileMimeType)) { return; } var identifier = getIdentifier(attrs); // Add only if not already processed var idKey = (0, _mediaClient.isExternalImageIdentifier)(identifier) ? identifier.dataURI : identifier.id; if (!mediaIdentifierMap.has(idKey)) { mediaIdentifierMap.set(idKey, identifier); } }); return (0, _toConsumableArray2.default)(mediaIdentifierMap.values()); };