Skip to content

Commit

Permalink
Fix double insertion due to insertTextData being called when it shoul…
Browse files Browse the repository at this point in the history
…d not (#4625)

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

* Document return type of insertTextData and insert FragmentData

* Add changeset
  • Loading branch information
echarles authored Oct 27, 2021
1 parent 02e9245 commit e54f2a0
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 13 deletions.
5 changes: 5 additions & 0 deletions .changeset/cool-forks-mix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'slate-react': minor
---

insertTextData and insertFragmentData return a boolean (true if some content has been effectively inserted)
4 changes: 2 additions & 2 deletions docs/libraries/slate-react.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,11 +142,11 @@ Insert data from a `DataTransfer` into the editor. This is a proxy method to cal

### `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)`

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)`

Expand Down
12 changes: 6 additions & 6 deletions packages/slate-react/src/plugin/react-editor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ import { IS_CHROME, IS_FIREFOX } from '../utils/environment'

export interface ReactEditor extends BaseEditor {
insertData: (data: DataTransfer) => void
insertFragmentData: (data: DataTransfer) => void
insertTextData: (data: DataTransfer) => void
insertFragmentData: (data: DataTransfer) => boolean
insertTextData: (data: DataTransfer) => boolean
setFragmentData: (data: DataTransfer) => void
hasRange: (editor: ReactEditor, range: Range) => boolean
}
Expand Down Expand Up @@ -237,16 +237,16 @@ export const ReactEditor = {
* Insert fragment data from a `DataTransfer` into the editor.
*/

insertFragmentData(editor: ReactEditor, data: DataTransfer): void {
editor.insertFragmentData(data)
insertFragmentData(editor: ReactEditor, data: DataTransfer): boolean {
return editor.insertFragmentData(data)
},

/**
* Insert text data from a `DataTransfer` into the editor.
*/

insertTextData(editor: ReactEditor, data: DataTransfer): void {
editor.insertTextData(data)
insertTextData(editor: ReactEditor, data: DataTransfer): boolean {
return editor.insertTextData(data)
},

/**
Expand Down
14 changes: 9 additions & 5 deletions packages/slate-react/src/plugin/with-react.ts
Original file line number Diff line number Diff line change
Expand Up @@ -195,11 +195,12 @@ export const withReact = <T extends Editor>(editor: T) => {
}

e.insertData = (data: DataTransfer) => {
e.insertFragmentData(data)
e.insertTextData(data)
if (!e.insertFragmentData(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
*/
Expand All @@ -211,11 +212,12 @@ export const withReact = <T extends Editor>(editor: T) => {
const decoded = decodeURIComponent(window.atob(fragment))
const parsed = JSON.parse(decoded) as Node[]
e.insertFragment(parsed)
return
return true
}
return false
}

e.insertTextData = (data: DataTransfer) => {
e.insertTextData = (data: DataTransfer): boolean => {
const text = data.getData('text/plain')

if (text) {
Expand All @@ -230,7 +232,9 @@ export const withReact = <T extends Editor>(editor: T) => {
e.insertText(line)
split = true
}
return true
}
return false
}

e.onChange = () => {
Expand Down

0 comments on commit e54f2a0

Please sign in to comment.