UNPKG

5.29 kBJavaScriptView Raw
1/**
2 * Copyright (c) Facebook, Inc. and its affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * @format
8 *
9 * @emails oncall+draft_js
10 */
11'use strict';
12
13function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
14
15function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
16
17var BlockMapBuilder = require("./BlockMapBuilder");
18
19var CharacterMetadata = require("./CharacterMetadata");
20
21var ContentBlock = require("./ContentBlock");
22
23var ContentBlockNode = require("./ContentBlockNode");
24
25var DraftModifier = require("./DraftModifier");
26
27var EditorState = require("./EditorState");
28
29var generateRandomKey = require("./generateRandomKey");
30
31var gkx = require("./gkx");
32
33var Immutable = require("immutable");
34
35var moveBlockInContentState = require("./moveBlockInContentState");
36
37var experimentalTreeDataSupport = gkx('draft_tree_data_support');
38var ContentBlockRecord = experimentalTreeDataSupport ? ContentBlockNode : ContentBlock;
39var List = Immutable.List,
40 Repeat = Immutable.Repeat;
41var AtomicBlockUtils = {
42 insertAtomicBlock: function insertAtomicBlock(editorState, entityKey, character) {
43 var contentState = editorState.getCurrentContent();
44 var selectionState = editorState.getSelection();
45 var afterRemoval = DraftModifier.removeRange(contentState, selectionState, 'backward');
46 var targetSelection = afterRemoval.getSelectionAfter();
47 var afterSplit = DraftModifier.splitBlock(afterRemoval, targetSelection);
48 var insertionTarget = afterSplit.getSelectionAfter();
49 var asAtomicBlock = DraftModifier.setBlockType(afterSplit, insertionTarget, 'atomic');
50 var charData = CharacterMetadata.create({
51 entity: entityKey
52 });
53 var atomicBlockConfig = {
54 key: generateRandomKey(),
55 type: 'atomic',
56 text: character,
57 characterList: List(Repeat(charData, character.length))
58 };
59 var atomicDividerBlockConfig = {
60 key: generateRandomKey(),
61 type: 'unstyled'
62 };
63
64 if (experimentalTreeDataSupport) {
65 atomicBlockConfig = _objectSpread({}, atomicBlockConfig, {
66 nextSibling: atomicDividerBlockConfig.key
67 });
68 atomicDividerBlockConfig = _objectSpread({}, atomicDividerBlockConfig, {
69 prevSibling: atomicBlockConfig.key
70 });
71 }
72
73 var fragmentArray = [new ContentBlockRecord(atomicBlockConfig), new ContentBlockRecord(atomicDividerBlockConfig)];
74 var fragment = BlockMapBuilder.createFromArray(fragmentArray);
75 var withAtomicBlock = DraftModifier.replaceWithFragment(asAtomicBlock, insertionTarget, fragment);
76 var newContent = withAtomicBlock.merge({
77 selectionBefore: selectionState,
78 selectionAfter: withAtomicBlock.getSelectionAfter().set('hasFocus', true)
79 });
80 return EditorState.push(editorState, newContent, 'insert-fragment');
81 },
82 moveAtomicBlock: function moveAtomicBlock(editorState, atomicBlock, targetRange, insertionMode) {
83 var contentState = editorState.getCurrentContent();
84 var selectionState = editorState.getSelection();
85 var withMovedAtomicBlock;
86
87 if (insertionMode === 'before' || insertionMode === 'after') {
88 var targetBlock = contentState.getBlockForKey(insertionMode === 'before' ? targetRange.getStartKey() : targetRange.getEndKey());
89 withMovedAtomicBlock = moveBlockInContentState(contentState, atomicBlock, targetBlock, insertionMode);
90 } else {
91 var afterRemoval = DraftModifier.removeRange(contentState, targetRange, 'backward');
92 var selectionAfterRemoval = afterRemoval.getSelectionAfter();
93
94 var _targetBlock = afterRemoval.getBlockForKey(selectionAfterRemoval.getFocusKey());
95
96 if (selectionAfterRemoval.getStartOffset() === 0) {
97 withMovedAtomicBlock = moveBlockInContentState(afterRemoval, atomicBlock, _targetBlock, 'before');
98 } else if (selectionAfterRemoval.getEndOffset() === _targetBlock.getLength()) {
99 withMovedAtomicBlock = moveBlockInContentState(afterRemoval, atomicBlock, _targetBlock, 'after');
100 } else {
101 var afterSplit = DraftModifier.splitBlock(afterRemoval, selectionAfterRemoval);
102 var selectionAfterSplit = afterSplit.getSelectionAfter();
103
104 var _targetBlock2 = afterSplit.getBlockForKey(selectionAfterSplit.getFocusKey());
105
106 withMovedAtomicBlock = moveBlockInContentState(afterSplit, atomicBlock, _targetBlock2, 'before');
107 }
108 }
109
110 var newContent = withMovedAtomicBlock.merge({
111 selectionBefore: selectionState,
112 selectionAfter: withMovedAtomicBlock.getSelectionAfter().set('hasFocus', true)
113 });
114 return EditorState.push(editorState, newContent, 'move-block');
115 }
116};
117module.exports = AtomicBlockUtils;
\No newline at end of file