From e5ae16dbedbb75522d4b14b81c0ee195a289fed3 Mon Sep 17 00:00:00 2001 From: Solomon Hawk Date: Wed, 6 Jun 2018 13:12:03 -0700 Subject: [PATCH] Fix bug in DrawerView When attempting to navigate to a drawer item while the drawer's state is 'opening' or 'closing' results in a state where the underlying navigator's screen correctly changes but the drawer fails to automatically dismiss itself. Instead, we should allow the drawer to respond to updates and change it's state even if it's in the middle of 'opening' or 'closing'. --- packages/drawer/src/views/DrawerView.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/drawer/src/views/DrawerView.js b/packages/drawer/src/views/DrawerView.js index 92dd6513..32ea1544 100644 --- a/packages/drawer/src/views/DrawerView.js +++ b/packages/drawer/src/views/DrawerView.js @@ -24,10 +24,10 @@ export default class DrawerView extends React.PureComponent { const { isDrawerOpen } = this.props.navigation.state; const wasDrawerOpen = prevProps.navigation.state.isDrawerOpen; - if (isDrawerOpen && !wasDrawerOpen && this._drawerState === 'closed') { + if (this._shouldOpen(isDrawerOpen, wasDrawerOpen)) { this._drawerState = 'opening'; this._drawer.openDrawer(); - } else if (wasDrawerOpen && !isDrawerOpen && this._drawerState === 'open') { + } else if (this._shouldClose(isDrawerOpen, wasDrawerOpen)) { this._drawerState = 'closing'; this._drawer.closeDrawer(); } @@ -39,6 +39,22 @@ export default class DrawerView extends React.PureComponent { _drawerState = 'closed'; + _shouldOpen = (isDrawerOpen, wasDrawerOpen) => { + return ( + isDrawerOpen && + !wasDrawerOpen && + (this._drawerState === 'closed' || this._drawerState === 'closing') + ); + }; + + _shouldClose = (isDrawerOpen, wasDrawerOpen) => { + return ( + wasDrawerOpen && + !isDrawerOpen && + (this._drawerState === 'open' || this._drawerState === 'opening') + ); + }; + _handleDrawerOpen = () => { const { navigation } = this.props; const { isDrawerOpen } = navigation.state;