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

Commit fa8017e

Browse files
osdnksatya164
authored andcommitted
fix: get rid of random red screen on iOS on opening drawer (#68)
1 parent 6bd22fe commit fa8017e

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

jest-setup.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Object.assign(NativeModules, {
2828
jest.mock('react-native-reanimated', () => ({
2929
__esModule: true,
3030
default: {
31+
Code: () => null,
3132
View: require('react-native').Animated.View,
3233
Text: require('react-native').Animated.Text,
3334
Clock: jest.fn(),

src/views/Drawer.tsx

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ export default class DrawerView extends React.PureComponent<Props> {
243243

244244
private isStatusBarHidden: boolean = false;
245245

246-
private isSpringManuallyTriggered = new Value<Binary>(FALSE);
246+
private manuallyTriggerSpring = new Value<Binary>(FALSE);
247247

248248
private transitionTo = (isOpen: number | Animated.Node<number>) => {
249249
const toValue = new Value(0);
@@ -349,7 +349,7 @@ export default class DrawerView extends React.PureComponent<Props> {
349349
cond(
350350
eq(this.gestureState, State.ACTIVE),
351351
[
352-
set(this.isSpringManuallyTriggered, FALSE),
352+
set(this.manuallyTriggerSpring, FALSE),
353353
cond(this.isSwiping, NOOP, [
354354
// We weren't dragging before, set it to true
355355
set(this.isSwiping, TRUE),
@@ -369,7 +369,7 @@ export default class DrawerView extends React.PureComponent<Props> {
369369
set(this.touchX, 0),
370370
this.transitionTo(
371371
cond(
372-
this.isSpringManuallyTriggered,
372+
this.manuallyTriggerSpring,
373373
this.isOpen,
374374
cond(
375375
or(
@@ -429,7 +429,7 @@ export default class DrawerView extends React.PureComponent<Props> {
429429
nativeEvent,
430430
}: TapGestureHandlerStateChangeEvent) => {
431431
if (nativeEvent.oldState === State.ACTIVE && !this.props.locked) {
432-
this.toggleDrawer(false);
432+
this.manuallyTriggerSpring.setValue(TRUE);
433433
}
434434
};
435435

@@ -447,12 +447,13 @@ export default class DrawerView extends React.PureComponent<Props> {
447447
};
448448

449449
private toggleDrawer = (open: boolean) => {
450-
this.nextIsOpen.setValue(open ? TRUE : FALSE);
451-
this.isSpringManuallyTriggered.setValue(TRUE);
450+
if (this.currentOpenValue !== open) {
451+
this.nextIsOpen.setValue(open ? TRUE : FALSE);
452452

453-
// This value will also be set shortly after as changing this.nextIsOpen changes this.isOpen
454-
// However, there's a race condition on Android, so we need to set a bit earlier
455-
this.currentOpenValue = open;
453+
// This value will also be set shortly after as changing this.nextIsOpen changes this.isOpen
454+
// However, there's a race condition on Android, so we need to set a bit earlier
455+
this.currentOpenValue = open;
456+
}
456457
};
457458

458459
private toggleStatusBar = (hidden: boolean) => {
@@ -546,6 +547,16 @@ export default class DrawerView extends React.PureComponent<Props> {
546547
/>
547548
</TapGestureHandler>
548549
</Animated.View>
550+
<Animated.Code
551+
exec={block([
552+
onChange(this.manuallyTriggerSpring, [
553+
cond(eq(this.manuallyTriggerSpring, TRUE), [
554+
set(this.nextIsOpen, FALSE),
555+
call([], () => (this.currentOpenValue = false)),
556+
]),
557+
]),
558+
])}
559+
/>
549560
<Animated.View
550561
accessibilityViewIsModal={open}
551562
removeClippedSubviews={Platform.OS !== 'ios'}

0 commit comments

Comments
 (0)