UNPKG

@atlaskit/editor-core

Version:

A package contains Atlassian editor core functionality

102 lines 4.04 kB
import { atTheEndOfDoc, atTheEndOfBlock, atTheBeginningOfBlock, endPositionOfParent, startPositionOfParent, setNodeSelection, setTextSelection, } from '../../utils'; import { posOfPreceedingMediaGroup, posOfMediaGroupNearby, posOfParentMediaGroup, isSelectionNonMediaBlockNode, isInsidePotentialEmptyParagraph, } from './utils'; import { unsupportedNodeTypesForMediaCards } from '../../schema/unsupported'; import analyticsService from '../../analytics/service'; export var insertFile = function (view, mediaState, collection) { var state = view.state, dispatch = view.dispatch; var $to = state.selection.$to; var tr = state.tr, schema = state.schema; var _a = schema.nodes, media = _a.media, paragraph = _a.paragraph; if (!collection || !media) { return; } // Don't support media in unsupported node types if (unsupportedNodeTypesForMediaCards.has($to.parent.type.name)) { analyticsService.trackEvent('atlassian.editor.media.file.unsupported.node'); return; } var node = createMediaFileNode(mediaState, collection, media); // insert a paragraph after if reach the end of doc // and there is no media group in the front or selection is a non media block node if (atTheEndOfDoc(state) && (!posOfPreceedingMediaGroup(state) || isSelectionNonMediaBlockNode(state))) { var paragraphInsertPos = isSelectionNonMediaBlockNode(state) ? $to.pos : $to.pos + 1; tr.insert(paragraphInsertPos, paragraph.create()); } var mediaInsertPos = findMediaInsertPos(state); // delete the selection or empty paragraph var deleteRange = findDeleteRange(state); if (!deleteRange) { tr.insert(mediaInsertPos, node); } else if (mediaInsertPos <= deleteRange.start) { tr.deleteRange(deleteRange.start, deleteRange.end).insert(mediaInsertPos, node); } else { tr.insert(mediaInsertPos, node).deleteRange(deleteRange.start, deleteRange.end); } dispatch(tr); setSelectionAfterMediaInsertion(view, mediaInsertPos); }; var createMediaFileNode = function (mediaState, collection, media) { var id = mediaState.id; var node = media.create({ id: id, type: 'file', collection: collection }); ['fileName', 'fileSize', 'fileMimeType'].forEach(function (key) { if (mediaState[key]) { node.attrs["__" + key] = mediaState[key]; } }); return node; }; var findMediaInsertPos = function (state) { var _a = state.selection, $from = _a.$from, $to = _a.$to; var nearbyMediaGroupPos = posOfMediaGroupNearby(state); if (nearbyMediaGroupPos) { return nearbyMediaGroupPos; } if (isSelectionNonMediaBlockNode(state)) { return $to.pos; } if (atTheEndOfBlock(state)) { return $to.pos + 1; } if (atTheBeginningOfBlock(state)) { return $from.pos - 1; } return $to.pos; }; var findDeleteRange = function (state) { var _a = state.selection, $from = _a.$from, $to = _a.$to; if (posOfParentMediaGroup(state)) { return; } if (!isInsidePotentialEmptyParagraph(state) || posOfMediaGroupNearby(state)) { return range($from.pos, $to.pos); } return range(startPositionOfParent($from) - 1, endPositionOfParent($to)); }; var range = function (start, end) { if (end === void 0) { end = start; } return { start: start, end: end }; }; var setSelectionAfterMediaInsertion = function (view, insertPos) { var state = view.state; var doc = state.doc; var mediaPos = posOfMediaGroupNearby(state); if (!mediaPos) { return; } var $mediaPos = doc.resolve(mediaPos); var endOfMediaGroup = endPositionOfParent($mediaPos); if (endOfMediaGroup + 1 >= doc.nodeSize - 1) { // if nothing after the media group, fallback to select the newest uploaded media item setNodeSelection(view, mediaPos); } else { setTextSelection(view, endOfMediaGroup + 1); } }; //# sourceMappingURL=media-files.js.map