From 482b814d1ce0dac2cceda318b03a5ee029297d1a Mon Sep 17 00:00:00 2001 From: Josh Kaplan Date: Fri, 26 May 2023 12:35:54 -0700 Subject: [PATCH] fix: prevent calls to setState when disabled --- .../src/ReactNavigationPerformanceView.tsx | 4 ++-- .../ReactNavigationPerformanceView.test.tsx | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/packages/react-native-performance-navigation/src/ReactNavigationPerformanceView.tsx b/packages/react-native-performance-navigation/src/ReactNavigationPerformanceView.tsx index bd95252..31d652b 100644 --- a/packages/react-native-performance-navigation/src/ReactNavigationPerformanceView.tsx +++ b/packages/react-native-performance-navigation/src/ReactNavigationPerformanceView.tsx @@ -33,13 +33,13 @@ export const ReactNavigationPerformanceView = (props: Props) => { ); useEffect(() => { - if (!isStack) { + if (!isStack || !stateController.isEnabled) { return; } return addListener('transitionEnd', () => { setTransitionEnded(true); }); - }, [addListener, isStack]); + }, [addListener, isStack, stateController.isEnabled]); let shouldReportTransitionEnd = false; if (isStack && transitionEnded && transitionEndReported.current === false) { diff --git a/packages/react-native-performance-navigation/src/__tests__/ReactNavigationPerformanceView.test.tsx b/packages/react-native-performance-navigation/src/__tests__/ReactNavigationPerformanceView.test.tsx index f0408de..dd5ac1a 100644 --- a/packages/react-native-performance-navigation/src/__tests__/ReactNavigationPerformanceView.test.tsx +++ b/packages/react-native-performance-navigation/src/__tests__/ReactNavigationPerformanceView.test.tsx @@ -73,6 +73,9 @@ const createAddListenerMock = () => { describe('ReactNavigationPerformanceView', () => { beforeEach(() => { jest.clearAllMocks(); + useStateControllerMock.mockReturnValue({ + isEnabled: true, + }); }); describe('when screen is interactive on mount', () => { @@ -276,4 +279,25 @@ describe('ReactNavigationPerformanceView', () => { }); }); }); + + describe('when disabled', () => { + beforeEach(() => { + useStateControllerMock.mockReturnValue({ + isEnabled: false, + }); + }); + + it('does not add a listener with setState for transitionEnd', () => { + const {wrapper, triggerTransitionEnd} = mountReactNavigationPerformanceView({ + renderPassName: LOADING, + interactive: true, + }); + + wrapper.act(() => { + triggerTransitionEnd(); + }); + + expect(wrapper.context.navigation.addListener).not.toBeCalledWith('transitionEnd', expect.anything()); + }); + }); });