Skip to content

Commit

Permalink
fix(Android): pressables under sheets dimming view intercept gesture …
Browse files Browse the repository at this point in the history
…events (#2740)

## Description

Regression introduced in 4.9.0, when adding backward compatibility in
#2730. I've inverted the logical condition checking whether
dimming view blocks gestures and returned `PointerEvents.AUTO` when it
wasn't supposed do block.

This PR fixes the condition.

Fixes #2738

## Test code and steps to reproduce

Enhanced `TestFormSheet` so that it allows to verify that it works
correctly now.

## Checklist

- [x] Included code example that can be used to test this change
- [ ] Ensured that CI passes
  • Loading branch information
kkafar authored Feb 26, 2025
1 parent 4bfd209 commit 96990ba
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@ package com.swmansion.rnscreens.bottomsheet

import com.facebook.react.uimanager.PointerEvents
import com.facebook.react.uimanager.ReactPointerEventsView
import com.swmansion.rnscreens.bottomsheet.DimmingView


internal class DimmingViewPointerEventsImpl(val dimmingView: DimmingView) : ReactPointerEventsView {
override fun getPointerEvents(): PointerEvents = if (dimmingView.blockGestures == false) PointerEvents.AUTO else PointerEvents.NONE
internal class DimmingViewPointerEventsImpl(
val dimmingView: DimmingView,
) : ReactPointerEventsView {
override fun getPointerEvents(): PointerEvents = if (dimmingView.blockGestures) PointerEvents.AUTO else PointerEvents.NONE
}

internal class DimmingViewPointerEventsProxy(var pointerEventsImpl: DimmingViewPointerEventsImpl?) :
ReactPointerEventsView {
internal class DimmingViewPointerEventsProxy(
var pointerEventsImpl: DimmingViewPointerEventsImpl?,
) : ReactPointerEventsView {
override fun getPointerEvents(): PointerEvents = pointerEventsImpl?.pointerEvents ?: PointerEvents.NONE
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@ package com.swmansion.rnscreens.bottomsheet
import com.facebook.react.uimanager.PointerEvents
import com.facebook.react.uimanager.ReactPointerEventsView


internal class DimmingViewPointerEventsImpl(val dimmingView: DimmingView) : ReactPointerEventsView {
internal class DimmingViewPointerEventsImpl(
val dimmingView: DimmingView,
) : ReactPointerEventsView {
override val pointerEvents: PointerEvents
get() = if (dimmingView.blockGestures == false) PointerEvents.AUTO else PointerEvents.NONE
get() = if (dimmingView.blockGestures) PointerEvents.AUTO else PointerEvents.NONE
}

internal class DimmingViewPointerEventsProxy(var pointerEventsImpl: DimmingViewPointerEventsImpl?) :
ReactPointerEventsView {
internal class DimmingViewPointerEventsProxy(
var pointerEventsImpl: DimmingViewPointerEventsImpl?,
) : ReactPointerEventsView {
override val pointerEvents: PointerEvents
get() = pointerEventsImpl?.pointerEvents ?: PointerEvents.NONE
}
7 changes: 4 additions & 3 deletions apps/src/shared/Spacer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ import React, { ReactNode } from 'react';
import { View } from 'react-native';

interface Props {
children: ReactNode;
children?: ReactNode;
space?: number
}

export const Spacer = ({ children }: Props): React.JSX.Element => (
<View style={{ margin: 10 }}>{children}</View>
export const Spacer = ({ children, space }: Props): React.JSX.Element => (
<View style={{ margin: space ?? 10 }}>{children}</View>
);
2 changes: 1 addition & 1 deletion apps/src/tests/Test1096.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ const styles = StyleSheet.create({
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: `rgba(0,0,0,0.5)`,
backgroundColor: 'rgba(0,0,0,0.5)',
},
box: {
width: 40,
Expand Down
12 changes: 9 additions & 3 deletions apps/src/tests/TestFormSheet.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { NavigationContainer, RouteProp } from '@react-navigation/native';
import { NativeStackNavigationProp, createNativeStackNavigator } from '@react-navigation/native-stack';
import React, { useLayoutEffect } from 'react';
import React from 'react';
import { Button, Text, TextInput, View } from 'react-native';
import PressableWithFeedback from '../shared/PressableWithFeedback';
import { Spacer } from '../shared';

type RouteParamList = {
Home: undefined;
Expand All @@ -19,6 +21,10 @@ function Home({ navigation }: RouteProps<'Home'>) {
return (
<View style={{ flex: 1, backgroundColor: 'lightsalmon' }}>
<Button title="Open FormSheet" onPress={() => navigation.navigate('FormSheet')} />
<Spacer space={12} />
<PressableWithFeedback>
<View style={{ width: '100%', height: 50 }} />
</PressableWithFeedback>
</View>
);
}
Expand Down Expand Up @@ -52,9 +58,9 @@ export default function App() {
<Stack.Screen name="Home" component={Home} />
<Stack.Screen name="FormSheet" component={FormSheet} options={{
presentation: 'formSheet',
sheetAllowedDetents: [0.4, 0.75, 0.9],
sheetAllowedDetents: [0.4, 0.6, 0.9],
//sheetAllowedDetents: 'fitToContents',
sheetLargestUndimmedDetentIndex: 1,
sheetLargestUndimmedDetentIndex: 0,
sheetCornerRadius: 8,
headerShown: false,
contentStyle: {
Expand Down

0 comments on commit 96990ba

Please sign in to comment.