From ba4197f35c076e29aee6a36783a6498de52da298 Mon Sep 17 00:00:00 2001 From: Strat Barrett Date: Sun, 21 Apr 2024 19:29:15 -0700 Subject: [PATCH] Solution for useTimeout hook in react and typescript --- react/usetimeout_en.md | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/react/usetimeout_en.md b/react/usetimeout_en.md index 8ce07f80..79108ea9 100644 --- a/react/usetimeout_en.md +++ b/react/usetimeout_en.md @@ -1,4 +1,34 @@ -There is no solution yet. +@strativd -Would you like to [contribute to the solution](https://github.com/BFEdev/BFE.dev-solutions/blob/main/react/usetimeout_en.md)? [Contribute guideline](https://github.com/BFEdev/BFE.dev-solutions#how-to-contribute) +```ts +import { useEffect, useRef } from 'react' + +export function useTimeout(callback: () => void, delay: number | null): void { + const savedCallback = useRef(callback) + + // Remember the latest callback if it changes. + useEffect(() => { + savedCallback.current = callback + }, [callback]) + + // Set up the timeout. + useEffect(() => { + // Don't schedule if no delay is specified. + // Note: 0 is a valid value for delay. + if (!delay && delay !== 0) { + return + } + + const id = setTimeout(() => { + savedCallback.current() + }, delay) + + return () => { + clearTimeout(id) + } + }, [delay]) +} +``` + +Credit: [usehooks-ts.com — `useTimeout`](https://usehooks-ts.com/react-hook/use-timeout)