From d3ae8d0d21a27dca1ddc301a52043795601567c4 Mon Sep 17 00:00:00 2001 From: wad4444 <77159113+wad4444@users.noreply.github.com> Date: Sun, 1 Jun 2025 15:55:32 +0300 Subject: [PATCH 1/2] refactor(use-interval): make it use loop internally, change `delay` to accept `BindingOrValue` --- src/use-interval/use-interval.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/use-interval/use-interval.ts b/src/use-interval/use-interval.ts index e806a78..474352c 100644 --- a/src/use-interval/use-interval.ts +++ b/src/use-interval/use-interval.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useRef } from "@rbxts/react"; -import { setInterval } from "@rbxts/set-timeout"; import { useLatestCallback } from "../use-latest-callback"; +import { BindingOrValue, getBindingValue } from "../utils/binding"; export interface UseIntervalOptions { /** @@ -19,14 +19,15 @@ export interface UseIntervalOptions { * @param options The options for the interval. * @returns A function that clears the interval. */ -export function useInterval(callback: () => void, delay?: number, options: UseIntervalOptions = {}) { +export function useInterval(callback: () => void, delay?: BindingOrValue, options: UseIntervalOptions = {}) { const { immediate = false } = options; const callbackMemo = useLatestCallback(callback); - const cancel = useRef<() => void>(); + const cancel = useRef(); const clear = useCallback(() => { - cancel.current?.(); + if (!cancel.current) return; + task.cancel(cancel.current); }, []); useEffect(() => { @@ -36,7 +37,12 @@ export function useInterval(callback: () => void, delay?: number, options: UseIn if (immediate) { callbackMemo(); } - cancel.current = setInterval(callbackMemo, delay); + cancel.current = task.spawn(() => { + while (true) { + task.wait(getBindingValue(delay)); + callbackMemo(); + } + }) return clear; }, [delay]); From e762051485ad3f9662ac65788157e724b949977e Mon Sep 17 00:00:00 2001 From: wad4444 <77159113+wad4444@users.noreply.github.com> Date: Sun, 1 Jun 2025 16:31:45 +0300 Subject: [PATCH 2/2] fix: eslint warnings --- src/use-interval/use-interval.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/use-interval/use-interval.ts b/src/use-interval/use-interval.ts index 474352c..842137b 100644 --- a/src/use-interval/use-interval.ts +++ b/src/use-interval/use-interval.ts @@ -38,11 +38,12 @@ export function useInterval(callback: () => void, delay?: BindingOrValue callbackMemo(); } cancel.current = task.spawn(() => { + // eslint-disable-next-line no-constant-condition while (true) { task.wait(getBindingValue(delay)); callbackMemo(); } - }) + }); return clear; }, [delay]);