diff --git a/client/src/Hooks/useDebounce.ts b/client/src/Hooks/useDebounce.ts new file mode 100644 index 000000000..da26e8e59 --- /dev/null +++ b/client/src/Hooks/useDebounce.ts @@ -0,0 +1,29 @@ +import { useState, useEffect } from "react"; + +/** + * Custom hook for debouncing values + * @template T - The type of the value being debounced + * @param value - The value to debounce + * @param delay - The debounce delay in milliseconds + * @returns The debounced value + * + * @example + * const debouncedSearch = useDebounce(search, 300); // Debounces the search input with a 300ms delay + */ +const useDebounce = (value: T, delay: number): T => { + const [debouncedValue, setDebouncedValue] = useState(value); + + useEffect(() => { + const handler = setTimeout(() => { + setDebouncedValue(value); + }, delay); + + return () => { + clearTimeout(handler); + }; + }, [value, delay]); + + return debouncedValue; +}; + +export default useDebounce; diff --git a/client/src/Pages/Infrastructure/Monitors/index.tsx b/client/src/Pages/Infrastructure/Monitors/index.tsx index 0db682272..303c7d0f7 100644 --- a/client/src/Pages/Infrastructure/Monitors/index.tsx +++ b/client/src/Pages/Infrastructure/Monitors/index.tsx @@ -20,7 +20,7 @@ import { useSelector, useDispatch } from "react-redux"; import { setRowsPerPage } from "@/Features/UI/uiSlice.js"; import type { RootState } from "@/Types/state"; import { InfraMonitorsTable } from "./Components/MonitorsTable"; -import useDebounce from "@/Utils/debounce"; +import useDebounce from "@/Hooks/useDebounce"; const InfrastructureMonitors = () => { const { t } = useTranslation(); diff --git a/client/src/Pages/Uptime/Monitors/index.tsx b/client/src/Pages/Uptime/Monitors/index.tsx index a06362744..ec4935221 100644 --- a/client/src/Pages/Uptime/Monitors/index.tsx +++ b/client/src/Pages/Uptime/Monitors/index.tsx @@ -20,7 +20,7 @@ import { setRowsPerPage } from "@/Features/UI/uiSlice.js"; import { useIsAdmin } from "@/Hooks/useIsAdmin"; import type { RootState } from "@/Types/state"; import { useTheme } from "@mui/material"; -import useDebounce from "@/Utils/debounce"; +import useDebounce from "@/Hooks/useDebounce"; const UptimeMonitorsPage = () => { const { t } = useTranslation(); diff --git a/client/src/Utils/debounce.jsx b/client/src/Utils/debounce.jsx deleted file mode 100644 index 11d639f14..000000000 --- a/client/src/Utils/debounce.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import { useState, useEffect } from "react"; - -const useDebounce = (value, delay) => { - const [debouncedValue, setDebouncedValue] = useState(value); - - useEffect(() => { - const handler = setTimeout(() => { - setDebouncedValue(value); - }, delay); - - return () => { - clearTimeout(handler); - }; - }, [value, delay]); - return debouncedValue; -}; - -export default useDebounce;