@@ -11,6 +11,7 @@ import {
11
11
} from "../../schema" ;
12
12
import { blockToNode } from "../nodeConversions/nodeConversions" ;
13
13
import { getNodeById } from "../nodeUtil" ;
14
+ import { Transaction } from "prosemirror-state" ;
14
15
15
16
export function insertBlocks <
16
17
BSchema extends BlockSchema ,
@@ -85,10 +86,19 @@ export function updateBlock<
85
86
editor . commands . BNUpdateBlock ( posBeforeNode + 1 , update ) ;
86
87
}
87
88
88
- export function removeBlocks (
89
+ function removeBlocksWithCallback (
89
90
blocksToRemove : BlockIdentifier [ ] ,
90
- editor : Editor
91
+ editor : Editor ,
92
+ // Should return new removedSize.
93
+ callback ?: (
94
+ node : Node ,
95
+ pos : number ,
96
+ tr : Transaction ,
97
+ removedSize : number
98
+ ) => number
91
99
) {
100
+ const tr = editor . state . tr ;
101
+
92
102
const idsOfBlocksToRemove = new Set < string > (
93
103
blocksToRemove . map ( ( block ) =>
94
104
typeof block === "string" ? block : block . id
@@ -111,12 +121,13 @@ export function removeBlocks(
111
121
return true ;
112
122
}
113
123
114
- idsOfBlocksToRemove . delete ( node . attrs . id ) ;
115
- const oldDocSize = editor . state . doc . nodeSize ;
124
+ removedSize = callback ?.( node , pos , tr , removedSize ) || removedSize ;
116
125
117
- editor . commands . BNDeleteBlock ( pos - removedSize + 1 ) ;
126
+ idsOfBlocksToRemove . delete ( node . attrs . id ) ;
118
127
119
- const newDocSize = editor . state . doc . nodeSize ;
128
+ const oldDocSize = tr . doc . nodeSize ;
129
+ tr . delete ( pos - removedSize - 1 , pos - removedSize + node . nodeSize + 1 ) ;
130
+ const newDocSize = tr . doc . nodeSize ;
120
131
removedSize += oldDocSize - newDocSize ;
121
132
122
133
return false ;
@@ -130,6 +141,15 @@ export function removeBlocks(
130
141
notFoundIds
131
142
) ;
132
143
}
144
+
145
+ editor . view . dispatch ( tr ) ;
146
+ }
147
+
148
+ export function removeBlocks (
149
+ blocksToRemove : BlockIdentifier [ ] ,
150
+ editor : Editor
151
+ ) {
152
+ removeBlocksWithCallback ( blocksToRemove , editor ) ;
133
153
}
134
154
135
155
export function replaceBlocks <
@@ -141,6 +161,33 @@ export function replaceBlocks<
141
161
blocksToInsert : PartialBlock < BSchema , I , S > [ ] ,
142
162
editor : BlockNoteEditor < BSchema , I , S >
143
163
) {
144
- insertBlocks ( blocksToInsert , blocksToRemove [ 0 ] , "before" , editor ) ;
145
- removeBlocks ( blocksToRemove , editor . _tiptapEditor ) ;
164
+ const ttEditor = editor . _tiptapEditor ;
165
+
166
+ const nodesToInsert : Node [ ] = [ ] ;
167
+ for ( const blockSpec of blocksToInsert ) {
168
+ nodesToInsert . push (
169
+ blockToNode ( blockSpec , ttEditor . schema , editor . styleSchema )
170
+ ) ;
171
+ }
172
+
173
+ const idOfFirstBlock =
174
+ typeof blocksToRemove [ 0 ] === "string"
175
+ ? blocksToRemove [ 0 ]
176
+ : blocksToRemove [ 0 ] . id ;
177
+
178
+ removeBlocksWithCallback (
179
+ blocksToRemove ,
180
+ ttEditor ,
181
+ ( node , pos , tr , removedSize ) => {
182
+ if ( node . attrs . id === idOfFirstBlock ) {
183
+ const oldDocSize = tr . doc . nodeSize ;
184
+ tr . insert ( pos , nodesToInsert ) ;
185
+ const newDocSize = tr . doc . nodeSize ;
186
+
187
+ return removedSize + oldDocSize - newDocSize ;
188
+ }
189
+
190
+ return removedSize ;
191
+ }
192
+ ) ;
146
193
}
0 commit comments