From fa8017e5930d0a9d992328ab7f31d98aa5cb678c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Osadnik?= Date: Mon, 13 May 2019 18:30:03 +0200 Subject: [PATCH] fix: get rid of random red screen on iOS on opening drawer (#68) --- jest-setup.js | 1 + src/views/Drawer.tsx | 29 ++++++++++++++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/jest-setup.js b/jest-setup.js index eb81c11f..06a9459f 100644 --- a/jest-setup.js +++ b/jest-setup.js @@ -28,6 +28,7 @@ Object.assign(NativeModules, { jest.mock('react-native-reanimated', () => ({ __esModule: true, default: { + Code: () => null, View: require('react-native').Animated.View, Text: require('react-native').Animated.Text, Clock: jest.fn(), diff --git a/src/views/Drawer.tsx b/src/views/Drawer.tsx index f69eed87..479b243a 100644 --- a/src/views/Drawer.tsx +++ b/src/views/Drawer.tsx @@ -243,7 +243,7 @@ export default class DrawerView extends React.PureComponent { private isStatusBarHidden: boolean = false; - private isSpringManuallyTriggered = new Value(FALSE); + private manuallyTriggerSpring = new Value(FALSE); private transitionTo = (isOpen: number | Animated.Node) => { const toValue = new Value(0); @@ -349,7 +349,7 @@ export default class DrawerView extends React.PureComponent { cond( eq(this.gestureState, State.ACTIVE), [ - set(this.isSpringManuallyTriggered, FALSE), + set(this.manuallyTriggerSpring, FALSE), cond(this.isSwiping, NOOP, [ // We weren't dragging before, set it to true set(this.isSwiping, TRUE), @@ -369,7 +369,7 @@ export default class DrawerView extends React.PureComponent { set(this.touchX, 0), this.transitionTo( cond( - this.isSpringManuallyTriggered, + this.manuallyTriggerSpring, this.isOpen, cond( or( @@ -429,7 +429,7 @@ export default class DrawerView extends React.PureComponent { nativeEvent, }: TapGestureHandlerStateChangeEvent) => { if (nativeEvent.oldState === State.ACTIVE && !this.props.locked) { - this.toggleDrawer(false); + this.manuallyTriggerSpring.setValue(TRUE); } }; @@ -447,12 +447,13 @@ export default class DrawerView extends React.PureComponent { }; private toggleDrawer = (open: boolean) => { - this.nextIsOpen.setValue(open ? TRUE : FALSE); - this.isSpringManuallyTriggered.setValue(TRUE); + if (this.currentOpenValue !== open) { + this.nextIsOpen.setValue(open ? TRUE : FALSE); - // This value will also be set shortly after as changing this.nextIsOpen changes this.isOpen - // However, there's a race condition on Android, so we need to set a bit earlier - this.currentOpenValue = open; + // This value will also be set shortly after as changing this.nextIsOpen changes this.isOpen + // However, there's a race condition on Android, so we need to set a bit earlier + this.currentOpenValue = open; + } }; private toggleStatusBar = (hidden: boolean) => { @@ -546,6 +547,16 @@ export default class DrawerView extends React.PureComponent { /> + (this.currentOpenValue = false)), + ]), + ]), + ])} + />