@atlaskit/editor-core
Version:
A package contains Atlassian editor core functionality
104 lines • 3.99 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var utils_1 = require("../../utils");
var utils_2 = require("./utils");
var unsupported_1 = require("../../schema/unsupported");
var service_1 = require("../../analytics/service");
exports.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 (unsupported_1.unsupportedNodeTypesForMediaCards.has($to.parent.type.name)) {
service_1.default.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 (utils_1.atTheEndOfDoc(state) && (!utils_2.posOfPreceedingMediaGroup(state) || utils_2.isSelectionNonMediaBlockNode(state))) {
var paragraphInsertPos = utils_2.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 = utils_2.posOfMediaGroupNearby(state);
if (nearbyMediaGroupPos) {
return nearbyMediaGroupPos;
}
if (utils_2.isSelectionNonMediaBlockNode(state)) {
return $to.pos;
}
if (utils_1.atTheEndOfBlock(state)) {
return $to.pos + 1;
}
if (utils_1.atTheBeginningOfBlock(state)) {
return $from.pos - 1;
}
return $to.pos;
};
var findDeleteRange = function (state) {
var _a = state.selection, $from = _a.$from, $to = _a.$to;
if (utils_2.posOfParentMediaGroup(state)) {
return;
}
if (!utils_2.isInsidePotentialEmptyParagraph(state) || utils_2.posOfMediaGroupNearby(state)) {
return range($from.pos, $to.pos);
}
return range(utils_1.startPositionOfParent($from) - 1, utils_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 = utils_2.posOfMediaGroupNearby(state);
if (!mediaPos) {
return;
}
var $mediaPos = doc.resolve(mediaPos);
var endOfMediaGroup = utils_1.endPositionOfParent($mediaPos);
if (endOfMediaGroup + 1 >= doc.nodeSize - 1) {
// if nothing after the media group, fallback to select the newest uploaded media item
utils_1.setNodeSelection(view, mediaPos);
}
else {
utils_1.setTextSelection(view, endOfMediaGroup + 1);
}
};
//# sourceMappingURL=media-files.js.map