Skip to content

Commit c3e4e08

Browse files
committed
fix(useDelayState): cancel pending updates on unmount
1 parent c241125 commit c3e4e08

2 files changed

Lines changed: 17 additions & 0 deletions

File tree

‎src/hooks/useDelayState.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ export default function useDelayState<T>(
3737
}
3838
});
3939

40+
React.useEffect(() => cancelPending, [cancelPending]);
41+
4042
const setDelayValue = useEvent<SetDelayState<T>>(
4143
(nextValue, immediatelyOrDelay) => {
4244
const delayConfig = immediatelyOrDelay || { frame: 1 };

‎tests/useDelayState.test.tsx‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,21 @@ describe('useDelayState', () => {
121121
expect(result.current[0]).toBe(2);
122122
});
123123

124+
it.each([
125+
['frame', { frame: 2 }],
126+
['timeout', { ms: 100 }],
127+
] as const)('cancels a pending %s update on unmount', (_, delay) => {
128+
const { result, unmount } = renderHook(() => useDelayState(0));
129+
130+
act(() => {
131+
result.current[1](1, delay);
132+
});
133+
expect(jest.getTimerCount()).toBe(1);
134+
135+
unmount();
136+
expect(jest.getTimerCount()).toBe(0);
137+
});
138+
124139
it('supports updater function', () => {
125140
const { result } = renderHook(() => useDelayState(1));
126141

0 commit comments

Comments
 (0)