draft-js-modifiers
Version:
Modular state modifiers for Draft.js
47 lines (43 loc) • 1.82 kB
JavaScript
import { EditorState, ContentBlock, CharacterMetadata, genKey } from 'draft-js';
import { Map, List, Repeat } from 'immutable';
import getCurrentBlock from './utils/getCurrentBlock';
var insertNewBlock = function insertNewBlock(editorState) {
var blockType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'unstyled';
var text = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
var data = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
var content = editorState.getCurrentContent();
var selection = editorState.getSelection();
var currentBlock = getCurrentBlock(editorState);
var emptyBlockKey = genKey();
var emptyBlock = new ContentBlock({
key: emptyBlockKey,
type: blockType,
text: text,
characterList: List(Repeat(CharacterMetadata.create(), text.length)),
data: Map().merge(data)
});
var blockMap = content.getBlockMap();
var blocksBefore = blockMap.toSeq().takeUntil(function (value) {
return value === currentBlock;
});
var blocksAfter = blockMap.toSeq().skipUntil(function (value) {
return value === currentBlock;
}).rest();
var augmentedBlocks = [[currentBlock.getKey(), currentBlock], [emptyBlockKey, emptyBlock]];
var newBlocks = blocksBefore.concat(augmentedBlocks, blocksAfter).toOrderedMap();
var focusKey = emptyBlockKey;
var newContent = content.merge({
blockMap: newBlocks,
selectionBefore: selection,
selectionAfter: selection.merge({
anchorKey: focusKey,
anchorOffset: 0,
focusKey: focusKey,
focusOffset: 0,
isBackward: false
})
});
var newState = EditorState.push(editorState, newContent, 'split-block');
return EditorState.forceSelection(newState, newContent.getSelectionAfter());
};
export default insertNewBlock;