Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: sync state on undo when editor is unfocused #5737

Merged
merged 11 commits into from
Oct 16, 2024
5 changes: 5 additions & 0 deletions .changeset/curvy-seals-attack.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'slate-react': patch
---

fix: sync built-in state on undo when editor is unfocused
25 changes: 24 additions & 1 deletion packages/slate-react/src/components/editable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1042,8 +1042,31 @@ export const Editable = forwardRef(
op()
}
deferredOperations.current = []

// COMPAT: Since `beforeinput` doesn't fully `preventDefault`,
// there's a chance that content might be placed in the browser's undo stack.
// This means undo can be triggered even when the div is not focused,
// and it only triggers the input event for the node. (2024/10/09)
if (!ReactEditor.isFocused(editor)) {
const native = event.nativeEvent as InputEvent
const maybeHistoryEditor: any = editor
if (
native.inputType === 'historyUndo' &&
typeof maybeHistoryEditor.undo === 'function'
) {
maybeHistoryEditor.undo()
return
}
if (
native.inputType === 'historyRedo' &&
typeof maybeHistoryEditor.redo === 'function'
) {
maybeHistoryEditor.redo()
return
}
}
},
[attributes.onInput]
[attributes.onInput, editor]
)}
onBlur={useCallback(
(event: React.FocusEvent<HTMLDivElement>) => {
Expand Down
Loading