Skip to content

Commit c11755b

Browse files
committed
Fixed verse ref not being updated when a verse marker is created or deleted
1 parent d646252 commit c11755b

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

packages/platform/src/editor/ScriptureReferencePlugin.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
2+
import { mergeRegister } from "@lexical/utils";
23
import { SerializedVerseRef } from "@sillsdev/scripture";
34
import {
45
$getNodeByKey,
@@ -22,8 +23,9 @@ import {
2223
isVerseRange,
2324
removeNodeAndAfter,
2425
removeNodesBeforeNode,
26+
VerseNode,
2527
} from "shared";
26-
import { $findThisVerse, $findVerseOrPara } from "shared-react";
28+
import { $findThisVerse, $findVerseOrPara, ImmutableVerseNode } from "shared-react";
2729

2830
/**
2931
* A component (plugin) that keeps the Scripture reference updated.
@@ -101,6 +103,22 @@ export default function ScriptureReferencePlugin({
101103
[editor, book, chapterNum, verseNum, onScrRefChange],
102104
);
103105

106+
// Verse node destroyed - SELECTION_CHANGE_COMMAND won't fire if the cursor position didn't
107+
// change (e.g. cursor was at offset 0 of the node after the verse, and stays there after
108+
// deletion of the non-keyboard-selectable DecoratorNode).
109+
useEffect(() => {
110+
const onVerseDestroyed = (nodeMutations: Map<string, "created" | "updated" | "destroyed">) => {
111+
const hasDestroyedVerse = [...nodeMutations.values()].some(
112+
(m) => m === "created" || m === "destroyed",
113+
);
114+
if (hasDestroyedVerse) editor.dispatchCommand(SELECTION_CHANGE_COMMAND, undefined);
115+
};
116+
return mergeRegister(
117+
editor.registerMutationListener(ImmutableVerseNode, onVerseDestroyed),
118+
editor.registerMutationListener(VerseNode, onVerseDestroyed),
119+
);
120+
}, [editor]);
121+
104122
return null;
105123
}
106124

0 commit comments

Comments
 (0)