onPanResponderTerminationRequest isvalid #51190
Labels
API: PanResponder
Needs: Author Feedback
Needs: Repro
This issue could be improved with a clear list of steps to reproduce the issue.
Type: Unsupported Version
Issues reported to a version of React Native that is no longer supported
Description
Two elements of the same level, A and B, touch A first and then move to B. The responder is still A. A's onPanResponderTerminationRequest event has not been executed, and B's onPanResponderMove event has not been executed either
version
react-native: 0.76.9
code:
`import React, { useRef, useState } from "react";
import { View, StyleSheet, PanResponder, Text, TouchableOpacity } from "react-native";
const App = () => {
const [isInView1, setIsInView1] = useState(true);
const panResponder1 = React.useRef(
PanResponder.create({
onStartShouldSetPanResponder: (evt, gestureState) => {
console.log('onStartShouldSetPanResponder p1')
return true
},
onMoveShouldSetPanResponder: (evt, gestureState) => {
console.log('onMoveShouldSetPanResponder p1')
return true
},
onPanResponderGrant: (evt, gestureState) => {
console.log('onPanResponderGrant p1')
},
onPanResponderMove: (evt, gestureState) => {
console.log('move p1')
},
onPanResponderRelease: (evt, gestureState) => {
console.log('onPanResponderRelease p1')
},
onPanResponderTerminationRequest: (evt, gestureState) => {
console.log('onPanResponderTerminationRequest p1')
return true
},
).current;
const panResponder2 = React.useRef(
PanResponder.create({
onStartShouldSetPanResponder: (evt, gestureState) => {
console.log('onStartShouldSetPanResponder p2')
return true
},
onMoveShouldSetPanResponder: (evt, gestureState) => {
console.log('onMoveShouldSetPanResponder p2')
return true
},
onPanResponderGrant: (evt, gestureState) => {
console.log('onPanResponderGrant p2')
},
onPanResponderMove: (evt, gestureState) => {
console.log('move p2')
},
onPanResponderRelease: (evt, gestureState) => {
console.log('onPanResponderRelease p2')
},
onPanResponderTerminationRequest: (evt, gestureState) => {
console.log('onPanResponderTerminationRequest p2')
return true
},
).current;
const view1Ref = useRef(null);
const view2Ref = useRef(null);
return (
<View
style={[styles.box, isInView1 ? styles.activeBox : null]}
{...panResponder1.panHandlers}
/>
<View
style={[styles.box, !isInView1 ? styles.activeBox : null]}
{...panResponder2.panHandlers}
/>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
flexDirection: 'row',
gap: 20,
},
box: {
width: 100,
height: 100,
backgroundColor: 'lightblue',
justifyContent: 'center',
alignItems: 'center',
borderRadius: 10,
},
activeBox: {
backgroundColor: 'lightgreen',
},
});
export default App;`
Steps to reproduce
Two elements of the same level, A and B, touch A first and then move to B. The responder is still A. A's onPanResponderTerminationRequest event has not been executed, and B's onPanResponderMove event has not been executed either
version
react-native: 0.76.9
code:
`import React, { useRef, useState } from "react";
import { View, StyleSheet, PanResponder, Text, TouchableOpacity } from "react-native";
const App = () => {
const [isInView1, setIsInView1] = useState(true);
const panResponder1 = React.useRef(
PanResponder.create({
onStartShouldSetPanResponder: (evt, gestureState) => {
console.log('onStartShouldSetPanResponder p1')
return true
},
onMoveShouldSetPanResponder: (evt, gestureState) => {
console.log('onMoveShouldSetPanResponder p1')
return true
},
onPanResponderGrant: (evt, gestureState) => {
console.log('onPanResponderGrant p1')
},
onPanResponderMove: (evt, gestureState) => {
console.log('move p1')
},
onPanResponderRelease: (evt, gestureState) => {
console.log('onPanResponderRelease p1')
},
onPanResponderTerminationRequest: (evt, gestureState) => {
console.log('onPanResponderTerminationRequest p1')
return true
},
).current;
const panResponder2 = React.useRef(
PanResponder.create({
onStartShouldSetPanResponder: (evt, gestureState) => {
console.log('onStartShouldSetPanResponder p2')
return true
},
onMoveShouldSetPanResponder: (evt, gestureState) => {
console.log('onMoveShouldSetPanResponder p2')
return true
},
onPanResponderGrant: (evt, gestureState) => {
console.log('onPanResponderGrant p2')
},
onPanResponderMove: (evt, gestureState) => {
console.log('move p2')
},
onPanResponderRelease: (evt, gestureState) => {
console.log('onPanResponderRelease p2')
},
onPanResponderTerminationRequest: (evt, gestureState) => {
console.log('onPanResponderTerminationRequest p2')
return true
},
).current;
const view1Ref = useRef(null);
const view2Ref = useRef(null);
return (
<View
style={[styles.box, isInView1 ? styles.activeBox : null]}
{...panResponder1.panHandlers}
/>
<View
style={[styles.box, !isInView1 ? styles.activeBox : null]}
{...panResponder2.panHandlers}
/>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
flexDirection: 'row',
gap: 20,
},
box: {
width: 100,
height: 100,
backgroundColor: 'lightblue',
justifyContent: 'center',
alignItems: 'center',
borderRadius: 10,
},
activeBox: {
backgroundColor: 'lightgreen',
},
});
export default App;`
React Native Version
0.76.9
Affected Platforms
Runtime - iOS, Other (please specify)
Output of
npx @react-native-community/cli info
Stacktrace or Logs
MANDATORY Reproducer
1
Screenshots and Videos
No response
The text was updated successfully, but these errors were encountered: