From b0b2f3c63771ee6606bf7b27b2615ea129c53956 Mon Sep 17 00:00:00 2001 From: mkorwel Date: Thu, 26 Mar 2026 14:50:29 -0700 Subject: [PATCH] fix(cli): prevent infinite re-render loop by adding dependency arrays to useEffect hooks in useFlickerDetector and useSessionResume (#23752) --- packages/cli/src/ui/hooks/useFlickerDetector.test.ts | 8 +++++--- packages/cli/src/ui/hooks/useFlickerDetector.ts | 2 +- packages/cli/src/ui/hooks/useSessionResume.ts | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/cli/src/ui/hooks/useFlickerDetector.test.ts b/packages/cli/src/ui/hooks/useFlickerDetector.test.ts index ab976fe15e..05865968f3 100644 --- a/packages/cli/src/ui/hooks/useFlickerDetector.test.ts +++ b/packages/cli/src/ui/hooks/useFlickerDetector.test.ts @@ -106,14 +106,16 @@ describe('useFlickerDetector', () => { it('should re-evaluate on re-render', async () => { // Start with a valid height mockMeasureElement.mockReturnValue({ width: 80, height: 20 }); - const { rerender } = await renderHook(() => - useFlickerDetector(mockRef, 25), + const { rerender } = await renderHook( + ({ height }) => useFlickerDetector(mockRef, height), + { initialProps: { height: 25 } }, ); expect(mockRecordFlickerFrame).not.toHaveBeenCalled(); // Now, simulate a re-render where the height is too great mockMeasureElement.mockReturnValue({ width: 80, height: 30 }); - rerender(); + // Trigger a change in terminalHeight dependency to force effect to run + rerender({ height: 24 }); expect(mockRecordFlickerFrame).toHaveBeenCalledTimes(1); expect(mockAppEventsEmit).toHaveBeenCalledTimes(1); diff --git a/packages/cli/src/ui/hooks/useFlickerDetector.ts b/packages/cli/src/ui/hooks/useFlickerDetector.ts index 49ee6ca8a9..51d4b845c0 100644 --- a/packages/cli/src/ui/hooks/useFlickerDetector.ts +++ b/packages/cli/src/ui/hooks/useFlickerDetector.ts @@ -39,5 +39,5 @@ export function useFlickerDetector( appEvents.emit(AppEvent.Flicker); } } - }); + }, [rootUiRef, terminalHeight, config, constrainHeight]); } diff --git a/packages/cli/src/ui/hooks/useSessionResume.ts b/packages/cli/src/ui/hooks/useSessionResume.ts index 055686773b..99f9c0c06a 100644 --- a/packages/cli/src/ui/hooks/useSessionResume.ts +++ b/packages/cli/src/ui/hooks/useSessionResume.ts @@ -49,7 +49,7 @@ export function useSessionResume({ useEffect(() => { historyManagerRef.current = historyManager; refreshStaticRef.current = refreshStatic; - }); + }, [historyManager, refreshStatic]); const loadHistoryForResume = useCallback( async (