Skip to content
This repository was archived by the owner on Feb 25, 2020. It is now read-only.

Commit 6b02d87

Browse files
committed
fix: don't disable programmatic open/close of drawer with drawerLockMode
fixes #56
1 parent f9f39d9 commit 6b02d87

File tree

2 files changed

+42
-31
lines changed

2 files changed

+42
-31
lines changed

src/views/Drawer.tsx

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ type Props = {
7777
onOpen: () => void;
7878
onClose: () => void;
7979
onGestureRef?: (ref: PanGestureHandler | null) => void;
80-
locked: boolean;
80+
gestureEnabled: boolean;
8181
drawerPosition: 'left' | 'right';
8282
drawerType: 'front' | 'back' | 'slide';
8383
keyboardDismissMode: 'none' | 'on-drag';
@@ -94,9 +94,9 @@ type Props = {
9494
gestureHandlerProps?: React.ComponentProps<typeof PanGestureHandler>;
9595
};
9696

97-
export default class DrawerView extends React.PureComponent<Props> {
97+
export default class Drawer extends React.PureComponent<Props> {
9898
static defaultProps = {
99-
locked: false,
99+
gestureEnabled: true,
100100
drawerPostion: I18nManager.isRTL ? 'left' : 'right',
101101
drawerType: 'front',
102102
swipeEdgeWidth: 32,
@@ -111,16 +111,11 @@ export default class DrawerView extends React.PureComponent<Props> {
111111
open,
112112
drawerPosition,
113113
drawerType,
114-
locked,
115114
swipeDistanceThreshold,
116115
swipeVelocityThreshold,
117116
hideStatusBar,
118117
} = this.props;
119118

120-
if (prevProps.locked !== locked) {
121-
this.isLocked.setValue(locked ? TRUE : FALSE);
122-
}
123-
124119
if (
125120
// If we're not in the middle of a transition, sync the drawer's open state
126121
typeof this.pendingOpenValue !== 'boolean' ||
@@ -167,7 +162,6 @@ export default class DrawerView extends React.PureComponent<Props> {
167162
private isDrawerTypeFront = new Value<Binary>(
168163
this.props.drawerType === 'front' ? TRUE : FALSE
169164
);
170-
private isLocked = new Value(this.props.locked ? TRUE : FALSE);
171165

172166
private isOpen = new Value<Binary>(this.props.open ? TRUE : FALSE);
173167
private nextIsOpen = new Value<Binary | -1>(UNSET);
@@ -444,10 +438,7 @@ export default class DrawerView extends React.PureComponent<Props> {
444438
{
445439
nativeEvent: {
446440
oldState: (s: Animated.Value<number>) =>
447-
cond(
448-
and(eq(s, State.ACTIVE), eq(this.isLocked, FALSE)),
449-
set(this.manuallyTriggerSpring, TRUE)
450-
),
441+
cond(eq(s, State.ACTIVE), set(this.manuallyTriggerSpring, TRUE)),
451442
},
452443
},
453444
]);
@@ -462,7 +453,9 @@ export default class DrawerView extends React.PureComponent<Props> {
462453
// Until layout is available, drawer is hidden with opacity: 0 by default
463454
// Show it in the next frame when layout is available
464455
// If we don't delay it until the next frame, there's a visible flicker
465-
requestAnimationFrame(() => this.drawerOpacity.setValue(1));
456+
requestAnimationFrame(() =>
457+
requestAnimationFrame(() => this.drawerOpacity.setValue(1))
458+
);
466459
};
467460

468461
private toggleDrawer = (open: boolean) => {
@@ -487,7 +480,7 @@ export default class DrawerView extends React.PureComponent<Props> {
487480
render() {
488481
const {
489482
open,
490-
locked,
483+
gestureEnabled,
491484
drawerPosition,
492485
drawerType,
493486
swipeEdgeWidth,
@@ -529,7 +522,7 @@ export default class DrawerView extends React.PureComponent<Props> {
529522
onGestureEvent={this.handleGestureEvent}
530523
onHandlerStateChange={this.handleGestureStateChange}
531524
hitSlop={hitSlop}
532-
enabled={!locked}
525+
enabled={gestureEnabled}
533526
{...gestureHandlerProps}
534527
>
535528
<Animated.View
@@ -548,6 +541,7 @@ export default class DrawerView extends React.PureComponent<Props> {
548541
>
549542
{renderSceneContent({ progress: this.progress })}
550543
<TapGestureHandler
544+
enabled={gestureEnabled}
551545
onHandlerStateChange={this.handleTapStateChange}
552546
>
553547
<Animated.View

src/views/DrawerView.tsx

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,27 @@ export default class DrawerView extends React.PureComponent<Props, State> {
8585
};
8686

8787
componentDidMount() {
88+
// If drawerLockMode was set to `locked-open`, we should open the drawer on mount
89+
if (this.getLockMode(this.props) === 'locked-open') {
90+
this.handleDrawerOpen();
91+
}
92+
8893
Dimensions.addEventListener('change', this.updateWidth);
8994
}
9095

96+
componentDidUpdate(prevProps: Props) {
97+
const prevLockMode = this.getLockMode(prevProps);
98+
const nextLockMode = this.getLockMode(this.props);
99+
100+
if (prevLockMode !== nextLockMode) {
101+
if (nextLockMode === 'locked-open') {
102+
this.handleDrawerOpen();
103+
} else {
104+
this.handleDrawerClose();
105+
}
106+
}
107+
}
108+
91109
componentWillUnmount() {
92110
Dimensions.removeEventListener('change', this.updateWidth);
93111
}
@@ -96,6 +114,13 @@ export default class DrawerView extends React.PureComponent<Props, State> {
96114

97115
private drawerGestureRef = React.createRef<PanGestureHandler>();
98116

117+
private getLockMode = ({ navigation, descriptors }: Props) => {
118+
const activeKey = navigation.state.routes[navigation.state.index].key;
119+
const { drawerLockMode } = descriptors[activeKey].options;
120+
121+
return drawerLockMode;
122+
};
123+
99124
private handleDrawerOpen = () => {
100125
const { navigation } = this.props;
101126

@@ -223,7 +248,7 @@ export default class DrawerView extends React.PureComponent<Props, State> {
223248
}
224249

225250
render() {
226-
const { navigation } = this.props;
251+
const { navigation, navigationConfig } = this.props;
227252
const {
228253
drawerType,
229254
sceneContainerStyle,
@@ -232,27 +257,19 @@ export default class DrawerView extends React.PureComponent<Props, State> {
232257
hideStatusBar,
233258
statusBarAnimation,
234259
gestureHandlerProps,
235-
} = this.props.navigationConfig;
236-
const activeKey = navigation.state.routes[navigation.state.index].key;
237-
const { drawerLockMode } = this.props.descriptors[activeKey].options;
260+
} = navigationConfig;
238261

262+
const drawerLockMode = this.getLockMode(this.props);
239263
const drawerBackgroundColor = this.getDrawerBackgroundColor();
240264
const overlayColor = this.getOverlayColor();
241265

242-
const isOpen =
243-
drawerLockMode === 'locked-closed'
244-
? false
245-
: drawerLockMode === 'locked-open'
246-
? true
247-
: this.props.navigation.state.isDrawerOpen;
248-
249266
return (
250267
<DrawerGestureContext.Provider value={this.drawerGestureRef}>
251268
<Drawer
252-
open={isOpen}
253-
locked={
254-
drawerLockMode === 'locked-open' ||
255-
drawerLockMode === 'locked-closed'
269+
open={navigation.state.isDrawerOpen}
270+
gestureEnabled={
271+
drawerLockMode !== 'locked-open' &&
272+
drawerLockMode !== 'locked-closed'
256273
}
257274
onOpen={this.handleDrawerOpen}
258275
onClose={this.handleDrawerClose}

0 commit comments

Comments
 (0)