@@ -48,17 +48,14 @@ class SplitPane extends React.Component {
48
48
49
49
// order of setting panel sizes.
50
50
// 1. size
51
- // 2. defaultSize
52
- // 3. minSize
51
+ // 2. getDefaultSize(defaultSize, minsize, maxSize)
53
52
54
- const { size, defaultSize, minSize, primary } = props ;
53
+ const { size, defaultSize, minSize, maxSize , primary } = props ;
55
54
56
55
const initialSize =
57
56
size !== undefined
58
57
? size
59
- : defaultSize !== undefined
60
- ? defaultSize
61
- : minSize ;
58
+ : getDefaultSize ( defaultSize , minSize , maxSize , null ) ;
62
59
63
60
this . state = {
64
61
active : false ,
@@ -69,15 +66,19 @@ class SplitPane extends React.Component {
69
66
// previous props that we need in static methods
70
67
instanceProps : {
71
68
primary,
69
+ size,
70
+ defaultSize,
71
+ minSize,
72
+ maxSize,
72
73
} ,
73
74
} ;
74
75
}
75
76
76
77
componentDidMount ( ) {
77
- this . setState ( SplitPane . setSize ( this . props , this . state ) ) ;
78
78
document . addEventListener ( 'mouseup' , this . onMouseUp ) ;
79
79
document . addEventListener ( 'mousemove' , this . onMouseMove ) ;
80
80
document . addEventListener ( 'touchmove' , this . onTouchMove ) ;
81
+ this . setState ( SplitPane . setSize ( this . props , this . state ) ) ;
81
82
}
82
83
83
84
static getDerivedStateFromProps ( nextProps , prevState ) {
@@ -207,9 +208,11 @@ class SplitPane extends React.Component {
207
208
}
208
209
}
209
210
211
+ // TODO: find a more elegant way to fix this. memoize calls to setSize?
212
+ // we have to check values since gDSFP is called on every render
210
213
static setSize ( props , state ) {
214
+ const { instanceProps } = state ;
211
215
const newState = { } ;
212
- const isPanel1Primary = props . primary === 'first' ;
213
216
214
217
const newSize =
215
218
props . size !== undefined
@@ -221,17 +224,44 @@ class SplitPane extends React.Component {
221
224
state . draggedSize
222
225
) ;
223
226
224
- newState [ isPanel1Primary ? 'pane1Size' : 'pane2Size' ] = newSize ;
227
+ const defaultSizeChanged =
228
+ props . defaultSize !== instanceProps . defaultSize ||
229
+ props . minSize !== instanceProps . minSize ||
230
+ props . maxSize !== instanceProps . maxSize ;
225
231
226
- if ( props . size !== undefined && props . size !== state . draggedSize ) {
232
+ const shouldUpdateSize =
233
+ props . size !== undefined
234
+ ? props . size !== instanceProps . size
235
+ : defaultSizeChanged ;
236
+
237
+ if (
238
+ props . size !== undefined &&
239
+ props . size !== state . draggedSize &&
240
+ shouldUpdateSize
241
+ ) {
227
242
newState . draggedSize = newSize ;
228
243
}
229
244
245
+ const isPanel1Primary = props . primary === 'first' ;
246
+
247
+ if ( shouldUpdateSize || props . primary !== state . instanceProps . primary ) {
248
+ newState [ isPanel1Primary ? 'pane1Size' : 'pane2Size' ] = newSize ;
249
+ }
250
+
251
+ // unset the size on the non primary panel
230
252
if ( props . primary !== state . instanceProps . primary ) {
231
253
newState [ isPanel1Primary ? 'pane2Size' : 'pane1Size' ] = undefined ;
232
- newState . instanceProps = { primary : props . primary } ;
233
254
}
234
255
256
+ // update the values in instanceProps
257
+ instanceProps . primary = props . primary ;
258
+ instanceProps . size = props . size ;
259
+ instanceProps . defaultSize = props . defaultSize ;
260
+ instanceProps . minSize = props . minSize ;
261
+ instanceProps . maxSize = props . maxSize ;
262
+
263
+ newState . instanceProps = instanceProps ;
264
+
235
265
return newState ;
236
266
}
237
267
0 commit comments