@atlaskit/editor-core
Version:
A package contains Atlassian editor core functionality
102 lines • 4.04 kB
JavaScript
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