Skip to content

Commit dd4de18

Browse files
authored
fix(Modal|Portal): fix an error with unsafe setState() (#4259)
1 parent ad83d82 commit dd4de18

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

src/addons/Portal/Portal.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,8 @@ class Portal extends Component {
196196
close = (e) => {
197197
debug('close()')
198198

199-
_.invoke(this.props, 'onClose', e, { ...this.props, open: false })
200199
this.setState({ open: false })
200+
_.invoke(this.props, 'onClose', e, { ...this.props, open: false })
201201
}
202202

203203
closeWithTimeout = (e, delay) => {

src/modules/Modal/Modal.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ class Modal extends Component {
5959
handleClose = (e) => {
6060
debug('close()')
6161

62-
_.invoke(this.props, 'onClose', e, { ...this.props, open: false })
6362
this.setState({ open: false })
63+
_.invoke(this.props, 'onClose', e, { ...this.props, open: false })
6464
}
6565

6666
handleDocumentMouseDown = (e) => {
@@ -80,8 +80,8 @@ class Modal extends Component {
8080
)
8181
return
8282

83-
_.invoke(this.props, 'onClose', e, { ...this.props, open: false })
8483
this.setState({ open: false })
84+
_.invoke(this.props, 'onClose', e, { ...this.props, open: false })
8585
}
8686

8787
handleIconOverrides = (predefinedProps) => ({

test/specs/modules/Modal/Modal-test.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,25 @@ describe('Modal', () => {
421421
domEvent.click(document.body)
422422
onClose.should.not.have.been.called()
423423
})
424+
425+
it('handles unmount without errors', () => {
426+
function ControlledExample() {
427+
const [open, setState] = React.useState(true)
428+
429+
return (
430+
<>
431+
{open && <Modal open onClose={() => setState(false)} />}
432+
<button id='close-button' />
433+
</>
434+
)
435+
}
436+
437+
wrapperMount(<ControlledExample />)
438+
assertBodyContains('.ui.modal')
439+
440+
domEvent.keyDown(document, { key: 'Escape' })
441+
assertBodyContains('.ui.modal', false)
442+
})
424443
})
425444

426445
describe('closeOnEscape', () => {

0 commit comments

Comments
 (0)