Skip to content

Commit

Permalink
fix: call setState before callbacks (#690)
Browse files Browse the repository at this point in the history
  • Loading branch information
leogiertz authored and rolandjitsu committed Oct 13, 2018
1 parent f37fb5b commit b6aab86
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 13 deletions.
26 changes: 13 additions & 13 deletions src/index.js
Expand Up @@ -222,22 +222,22 @@ class Dropzone extends React.Component {
rejectedFiles.push(...acceptedFiles.splice(0))
}

if (onDrop) {
onDrop.call(this, acceptedFiles, rejectedFiles, evt)
}

if (rejectedFiles.length > 0 && onDropRejected) {
onDropRejected.call(this, rejectedFiles, evt)
}

if (acceptedFiles.length > 0 && onDropAccepted) {
onDropAccepted.call(this, acceptedFiles, evt)
}

// Update `acceptedFiles` and `rejectedFiles` state
// This will make children render functions receive the appropriate
// values
this.setState({ acceptedFiles, rejectedFiles })
this.setState({ acceptedFiles, rejectedFiles }, () => {
if (onDrop) {
onDrop.call(this, acceptedFiles, rejectedFiles, evt)
}

if (rejectedFiles.length > 0 && onDropRejected) {
onDropRejected.call(this, rejectedFiles, evt)
}

if (acceptedFiles.length > 0 && onDropAccepted) {
onDropAccepted.call(this, acceptedFiles, evt)
}
})
})
}

Expand Down
15 changes: 15 additions & 0 deletions src/index.spec.js
Expand Up @@ -1292,4 +1292,19 @@ describe('Dropzone', () => {
expect(props.onDrop).not.toHaveBeenCalled()
})
})

it('should not set state after onDrop callbacks', async () => {
const onDrop = () => {
jest.resetAllMocks()
}
let dropzone = mount(
<Dropzone accept="image/*" onDrop={onDrop}>
{props => <DummyChildComponent {...props} />}
</Dropzone>
)
const setState = jest.spyOn(dropzone.instance(), 'setState')
dropzone.simulate('drop', { dataTransfer: { files: images } })
dropzone = await flushPromises(dropzone)
expect(setState).not.toHaveBeenCalled()
})
})

0 comments on commit b6aab86

Please sign in to comment.