diff --git a/.changeset/fix-list-item-stale-positions.md b/.changeset/fix-list-item-stale-positions.md new file mode 100644 index 00000000000..f79eb69e1d5 --- /dev/null +++ b/.changeset/fix-list-item-stale-positions.md @@ -0,0 +1,5 @@ +--- +'@milkdown/components': patch +--- + +Resolve deferred list item block selections against the current document. diff --git a/packages/components/src/list-item-block/view.ts b/packages/components/src/list-item-block/view.ts index ab2de092386..807c55849a8 100644 --- a/packages/components/src/list-item-block/view.ts +++ b/packages/components/src/list-item-block/view.ts @@ -49,14 +49,16 @@ export const listItemBlockView = $view( const { anchor, head } = view.state.selection div.appendChild(contentDOM) // put the cursor to the new created list item - const anchorPos = view.state.doc.resolve(anchor) - const headPos = view.state.doc.resolve(head) raf = requestAnimationFrame(() => { raf = 0 if (view.isDestroyed) return - if (!anchorPos.doc.eq(view.state.doc)) return + const { state } = view + const docSize = state.doc.content.size + if (anchor > docSize || head > docSize) return + const anchorPos = state.doc.resolve(anchor) + const headPos = state.doc.resolve(head) const selection = new TextSelection(anchorPos, headPos) - view.dispatch(view.state.tr.setSelection(selection)) + view.dispatch(state.tr.setSelection(selection)) }) }