@@ -5,6 +5,8 @@ import ModalPortal from "./ModalPortal";
5
5
import * as ariaAppHider from "../helpers/ariaAppHider" ;
6
6
import SafeHTMLElement , { canUseDOM } from "../helpers/safeHTMLElement" ;
7
7
8
+ import polyfill from "react-lifecycles-compat" ;
9
+
8
10
export const portalClassName = "ReactModalPortal" ;
9
11
export const bodyOpenClassName = "ReactModal__Body--open" ;
10
12
@@ -14,10 +16,12 @@ const createPortal = isReact16
14
16
: ReactDOM . unstable_renderSubtreeIntoContainer ;
15
17
16
18
function getParentElement ( parentSelector ) {
17
- return parentSelector ( ) ;
19
+ return parentSelector ( ) || Modal . defaultProps . parentSelector ;
18
20
}
19
21
20
- export default class Modal extends Component {
22
+ class Modal extends Component {
23
+ state = Object . assign ( { } , Modal . defaultProps ) ;
24
+
21
25
static setAppElement ( element ) {
22
26
ariaAppHider . setElement ( element ) ;
23
27
}
@@ -76,9 +80,7 @@ export default class Modal extends Component {
76
80
shouldCloseOnEsc : true ,
77
81
shouldCloseOnOverlayClick : true ,
78
82
shouldReturnFocusAfterClose : true ,
79
- parentSelector ( ) {
80
- return document . body ;
81
- }
83
+ parentSelector : ( ) => document . body
82
84
} ;
83
85
84
86
static defaultStyles = {
@@ -120,30 +122,46 @@ export default class Modal extends Component {
120
122
! isReact16 && this . renderPortal ( this . props ) ;
121
123
}
122
124
123
- componentWillReceiveProps ( newProps ) {
124
- if ( ! canUseDOM ) return ;
125
+ static getDerivedStateFromProps ( newProps , prevState ) {
126
+ if ( ! canUseDOM ) return null ;
125
127
const { isOpen } = newProps ;
126
128
// Stop unnecessary renders if modal is remaining closed
127
- if ( ! this . props . isOpen && ! isOpen ) return ;
129
+ if ( prevState && ! prevState . isOpen && ! isOpen ) return null ;
128
130
129
- const currentParent = getParentElement ( this . props . parentSelector ) ;
131
+ const currentParent = getParentElement ( prevState . parentSelector ) ;
130
132
const newParent = getParentElement ( newProps . parentSelector ) ;
131
133
134
+ const enumeratedState = {
135
+ isOpen : newProps . isOpen ,
136
+ parentSelector : newProps . parentSelector ,
137
+ portalClassName : newProps . portalClassName
138
+ } ;
139
+
132
140
if ( newParent !== currentParent ) {
133
141
currentParent . removeChild ( this . node ) ;
134
142
newParent . appendChild ( this . node ) ;
135
143
}
136
144
145
+ const newState = Object . assign ( prevState , enumeratedState ) ;
137
146
! isReact16 && this . renderPortal ( newProps ) ;
147
+ return newState ;
138
148
}
139
149
140
- componentWillUpdate ( newProps ) {
141
- if ( ! canUseDOM ) return ;
142
- if ( newProps . portalClassName !== this . props . portalClassName ) {
143
- this . node . className = newProps . portalClassName ;
150
+ getSnapshotBeforeUpdate ( prevProps , prevState ) {
151
+ if ( ! canUseDOM ) {
152
+ return null ;
153
+ } else {
154
+ this . node . className = prevState . portalClassName ;
155
+ return prevState . portalClassName ;
144
156
}
145
157
}
146
158
159
+ /*eslint-disable no-unused-vars*/
160
+ componentDidUpdate ( prevProps , prevState ) {
161
+ // Just to satisfy polyfilling
162
+ }
163
+ /*eslint-enable no-unused-vars*/
164
+
147
165
componentWillUnmount ( ) {
148
166
if ( ! canUseDOM || ! this . node || ! this . portal ) return ;
149
167
@@ -203,3 +221,7 @@ export default class Modal extends Component {
203
221
) ;
204
222
}
205
223
}
224
+
225
+ polyfill ( Modal ) ;
226
+
227
+ export default Modal ;
0 commit comments