1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-08-23 23:42:56 +02:00

Fix double insertion due to insertTextData being called when it should not (#4625)

* fix double paste due to insertTextData being called when it should not

* Document return type of insertTextData and insert FragmentData

* Add changeset
This commit is contained in:
Eric Charles
2021-10-27 06:09:36 +02:00
committed by GitHub
parent 02e9245646
commit e54f2a0ea0
4 changed files with 22 additions and 13 deletions

View File

@@ -0,0 +1,5 @@
---
'slate-react': minor
---
insertTextData and insertFragmentData return a boolean (true if some content has been effectively inserted)

View File

@@ -142,11 +142,11 @@ Insert data from a `DataTransfer` into the editor. This is a proxy method to cal
### `insertFragmentData(editor: ReactEditor, data: DataTransfer)` ### `insertFragmentData(editor: ReactEditor, data: DataTransfer)`
Insert fragment data from a `DataTransfer` into the editor. Insert fragment data from a `DataTransfer` into the editor. Returns true if some content has been effectively inserted.
### `insertTextData(editor: ReactEditor, data: DataTransfer)` ### `insertTextData(editor: ReactEditor, data: DataTransfer)`
Insert text data from a `DataTransfer` into the editor. Insert text data from a `DataTransfer` into the editor. Returns true if some content has been effectively inserted.
### `setFragmentData(editor: ReactEditor, data: DataTransfer)` ### `setFragmentData(editor: ReactEditor, data: DataTransfer)`

View File

@@ -32,8 +32,8 @@ import { IS_CHROME, IS_FIREFOX } from '../utils/environment'
export interface ReactEditor extends BaseEditor { export interface ReactEditor extends BaseEditor {
insertData: (data: DataTransfer) => void insertData: (data: DataTransfer) => void
insertFragmentData: (data: DataTransfer) => void insertFragmentData: (data: DataTransfer) => boolean
insertTextData: (data: DataTransfer) => void insertTextData: (data: DataTransfer) => boolean
setFragmentData: (data: DataTransfer) => void setFragmentData: (data: DataTransfer) => void
hasRange: (editor: ReactEditor, range: Range) => boolean hasRange: (editor: ReactEditor, range: Range) => boolean
} }
@@ -237,16 +237,16 @@ export const ReactEditor = {
* Insert fragment data from a `DataTransfer` into the editor. * Insert fragment data from a `DataTransfer` into the editor.
*/ */
insertFragmentData(editor: ReactEditor, data: DataTransfer): void { insertFragmentData(editor: ReactEditor, data: DataTransfer): boolean {
editor.insertFragmentData(data) return editor.insertFragmentData(data)
}, },
/** /**
* Insert text data from a `DataTransfer` into the editor. * Insert text data from a `DataTransfer` into the editor.
*/ */
insertTextData(editor: ReactEditor, data: DataTransfer): void { insertTextData(editor: ReactEditor, data: DataTransfer): boolean {
editor.insertTextData(data) return editor.insertTextData(data)
}, },
/** /**

View File

@@ -195,11 +195,12 @@ export const withReact = <T extends Editor>(editor: T) => {
} }
e.insertData = (data: DataTransfer) => { e.insertData = (data: DataTransfer) => {
e.insertFragmentData(data) if (!e.insertFragmentData(data)) {
e.insertTextData(data) e.insertTextData(data)
}
} }
e.insertFragmentData = (data: DataTransfer) => { e.insertFragmentData = (data: DataTransfer): boolean => {
/** /**
* Checking copied fragment from application/x-slate-fragment or data-slate-fragment * Checking copied fragment from application/x-slate-fragment or data-slate-fragment
*/ */
@@ -211,11 +212,12 @@ export const withReact = <T extends Editor>(editor: T) => {
const decoded = decodeURIComponent(window.atob(fragment)) const decoded = decodeURIComponent(window.atob(fragment))
const parsed = JSON.parse(decoded) as Node[] const parsed = JSON.parse(decoded) as Node[]
e.insertFragment(parsed) e.insertFragment(parsed)
return return true
} }
return false
} }
e.insertTextData = (data: DataTransfer) => { e.insertTextData = (data: DataTransfer): boolean => {
const text = data.getData('text/plain') const text = data.getData('text/plain')
if (text) { if (text) {
@@ -230,7 +232,9 @@ export const withReact = <T extends Editor>(editor: T) => {
e.insertText(line) e.insertText(line)
split = true split = true
} }
return true
} }
return false
} }
e.onChange = () => { e.onChange = () => {