diff --git a/src/__tests__/fireEvent.test.tsx b/src/__tests__/fireEvent.test.tsx index d5e337688..a8a7dca84 100644 --- a/src/__tests__/fireEvent.test.tsx +++ b/src/__tests__/fireEvent.test.tsx @@ -333,6 +333,40 @@ test('should not fire on box-only pointerEvents View with nested elements', () = expect(handlePress).not.toHaveBeenCalled(); }); +test('should fire non-pointer events on box-none pointerEvents View', () => { + const handleTouchStart = jest.fn(); + + const screen = render( + + {}}> + Trigger + + + ); + + fireEvent(screen.getByTestId('touch-start-view'), 'touchStart'); + expect(handleTouchStart).toHaveBeenCalled(); +}); + +test('should fire non-touch events on box-none pointerEvents View', () => { + const handleLayout = jest.fn(); + + const screen = render( + + {}}> + Trigger + + + ); + + fireEvent(screen.getByTestId('layout-view'), 'layout'); + expect(handleLayout).toHaveBeenCalled(); +}); + test('should pass event up on disabled TouchableOpacity', () => { const handleInnerPress = jest.fn(); const handleOuterPress = jest.fn(); diff --git a/src/fireEvent.ts b/src/fireEvent.ts index 3fa931a6e..0f95381e4 100644 --- a/src/fireEvent.ts +++ b/src/fireEvent.ts @@ -35,12 +35,17 @@ const isPointerEventEnabled = ( return isPointerEventEnabled(element.parent, true); }; +const isTouchEvent = (eventName?: string) => { + return eventName === 'press'; +}; + const isEventEnabled = ( element?: ReactTestInstance, - touchResponder?: ReactTestInstance + touchResponder?: ReactTestInstance, + eventName?: string ) => { if (isTextInput(element)) return element?.props.editable !== false; - if (!isPointerEventEnabled(element)) return false; + if (!isPointerEventEnabled(element) && isTouchEvent(eventName)) return false; const touchStart = touchResponder?.props.onStartShouldSetResponder?.(); const touchMove = touchResponder?.props.onMoveShouldSetResponder?.(); @@ -61,7 +66,8 @@ const findEventHandler = ( : nearestTouchResponder; const handler = getEventHandler(element, eventName); - if (handler && isEventEnabled(element, touchResponder)) return handler; + if (handler && isEventEnabled(element, touchResponder, eventName)) + return handler; if (element.parent === null || element.parent.parent === null) { return null;