Skip to content

Commit af3a0d2

Browse files
authored
fix typing. Adding check for size (#319)
1 parent 3d6b35b commit af3a0d2

File tree

3 files changed

+51
-38
lines changed

3 files changed

+51
-38
lines changed

index.d.ts

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,51 +3,53 @@ import * as React from 'react';
33

44
export type Size = string | number;
55

6+
type Partial<T> = { [P in keyof T]?: T[P] };
7+
68
export interface Props {
7-
allowResize?: boolean;
8-
className?: string;
9-
primary?: 'first' | 'second';
10-
minSize?: Size;
11-
maxSize?: Size;
12-
defaultSize?: Size;
13-
size?: Size;
14-
split?: 'vertical' | 'horizontal';
15-
onDragStarted?: () => void;
16-
onDragFinished?: (newSize: number) => void;
17-
onChange?: (newSize: number) => void;
18-
onResizerClick?: (event: MouseEvent) => void;
19-
onResizerDoubleClick?: (event: MouseEvent) => void;
20-
prefixer?: Prefixer;
21-
style?: React.CSSProperties;
22-
resizerStyle?: React.CSSProperties;
23-
paneStyle?: React.CSSProperties;
24-
pane1Style?: React.CSSProperties;
25-
pane2Style?: React.CSSProperties;
26-
resizerClassName?: string;
27-
step?: number;
9+
allowResize?: boolean;
10+
className?: string;
11+
primary?: 'first' | 'second';
12+
minSize?: Size;
13+
maxSize?: Size;
14+
defaultSize?: Size;
15+
size?: Size;
16+
split?: 'vertical' | 'horizontal';
17+
onDragStarted?: () => void;
18+
onDragFinished?: (newSize: number) => void;
19+
onChange?: (newSize: number) => void;
20+
onResizerClick?: (event: MouseEvent) => void;
21+
onResizerDoubleClick?: (event: MouseEvent) => void;
22+
prefixer?: Prefixer;
23+
style?: React.CSSProperties;
24+
resizerStyle?: React.CSSProperties;
25+
paneStyle?: React.CSSProperties;
26+
pane1Style?: React.CSSProperties;
27+
pane2Style?: React.CSSProperties;
28+
resizerClassName?: string;
29+
step?: number;
2830
}
2931

3032
export interface State {
31-
active: boolean;
32-
resized: boolean;
33+
active: boolean;
34+
resized: boolean;
3335
}
3436

3537
declare class SplitPane extends React.Component<Props, State> {
36-
constructor();
38+
constructor();
39+
40+
onMouseDown(event: MouseEvent): void;
3741

38-
onMouseDown(event: MouseEvent): void;
39-
40-
onTouchStart(event: TouchEvent): void;
42+
onTouchStart(event: TouchEvent): void;
4143

42-
onMouseMove(event: MouseEvent): void;
44+
onMouseMove(event: MouseEvent): void;
4345

44-
onTouchMove(event: TouchEvent): void;
46+
onTouchMove(event: TouchEvent): void;
4547

46-
onMouseUp(): void;
48+
onMouseUp(): void;
4749

48-
setSize(props: Props, state: State): void;
50+
static getSizeUpdate(props: Props, state: State): Partial<State>;
4951

50-
static defaultProps: Props;
52+
static defaultProps: Props;
5153
}
5254

5355
export default SplitPane;

src/SplitPane.js

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,18 +65,23 @@ class SplitPane extends React.Component {
6565
resized: false,
6666
pane1Size: primary === 'first' ? initialSize : undefined,
6767
pane2Size: primary === 'second' ? initialSize : undefined,
68+
69+
// these are props that are needed in static functions. ie: gDSFP
70+
instanceProps: {
71+
size,
72+
},
6873
};
6974
}
7075

7176
componentDidMount() {
7277
document.addEventListener('mouseup', this.onMouseUp);
7378
document.addEventListener('mousemove', this.onMouseMove);
7479
document.addEventListener('touchmove', this.onTouchMove);
75-
this.setState(SplitPane.setSize(this.props, this.state));
80+
this.setState(SplitPane.getSizeUpdate(this.props, this.state));
7681
}
7782

7883
static getDerivedStateFromProps(nextProps, prevState) {
79-
return SplitPane.setSize(nextProps, prevState);
84+
return SplitPane.getSizeUpdate(nextProps, prevState);
8085
}
8186

8287
componentWillUnmount() {
@@ -202,10 +207,14 @@ class SplitPane extends React.Component {
202207
}
203208
}
204209

205-
// TODO: find a more elegant way to fix this. memoize calls to setSize?
206-
// we have to check values since gDSFP is called on every render
207-
static setSize(props, state) {
210+
// we have to check values since gDSFP is called on every render and more in StrictMode
211+
static getSizeUpdate(props, state) {
208212
const newState = {};
213+
const { instanceProps } = state;
214+
215+
if (instanceProps.size === props.size && props.size !== undefined) {
216+
return {};
217+
}
209218

210219
const newSize =
211220
props.size !== undefined
@@ -226,6 +235,8 @@ class SplitPane extends React.Component {
226235
newState[isPanel1Primary ? 'pane1Size' : 'pane2Size'] = newSize;
227236
newState[isPanel1Primary ? 'pane2Size' : 'pane1Size'] = undefined;
228237

238+
newState.instanceProps = { size: props.size };
239+
229240
return newState;
230241
}
231242

website/src/components/Sidebar.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export default class Sidebar extends React.Component {
8282
</a>
8383
</TitleArea>
8484
<Description>
85-
A component that makes creating draggable and resizable UI a breeze 🤣
85+
A component that makes creating draggable and resizable UI a breeze
8686
</Description>
8787
{sections.map(section => (
8888
<React.Fragment>

0 commit comments

Comments
 (0)