Skip to content
Open
5 changes: 5 additions & 0 deletions .changeset/lovely-spies-change.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'react-simplikit': patch
---

fix(core/hooks): prevent immediate callback from re-firing when enabled is toggled
20 changes: 20 additions & 0 deletions packages/core/src/hooks/useInterval/useInterval.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,26 @@ describe('useInterval', () => {
});
});

it('should not re-fire immediate callback when enabled is toggled', async () => {
const callback = vi.fn();
const { rerender } = await renderHookSSR(
({ enabled }) =>
useInterval(callback, {
delay: 1000,
immediate: true,
enabled,
}),
{ initialProps: { enabled: true } }
);

expect(callback).toHaveBeenCalledTimes(1);

rerender({ enabled: false });
rerender({ enabled: true });

expect(callback).toHaveBeenCalledTimes(1);
});

it('should handle enabled flag changes appropriately', async () => {
const callback = vi.fn();
const { rerender } = await renderHookSSR(
Expand Down
19 changes: 16 additions & 3 deletions packages/core/src/hooks/useInterval/useInterval.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useEffect } from 'react';
import { useEffect, useRef } from 'react';

import { usePreservedCallback } from '../usePreservedCallback/index.ts';

Expand Down Expand Up @@ -45,12 +45,25 @@ export function useInterval(callback: () => void, options: IntervalOptions) {
const enabled = typeof options === 'number' ? true : (options.enabled ?? true);

const preservedCallback = usePreservedCallback(callback);
const immediateCalledRef = useRef(false);

useEffect(
function runImmediateCallback() {
if (immediate === true && enabled) {
preservedCallback();
if (immediate !== true) {
immediateCalledRef.current = false;
return;
}

if (!enabled) {
return;
}

if (immediateCalledRef.current) {
return;
}

immediateCalledRef.current = true;
preservedCallback();
},
[immediate, preservedCallback, enabled]
);
Expand Down
Loading