Rev 3514 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import { useState, useEffect, useCallback } from 'react';export function useDebouncedSearchParam(paramName, debounceDelay = 500) {const getQueryFromUrl = useCallback(() => {const params = new URLSearchParams(window.location.search);return params.get(paramName);}, [paramName]);const [inputValue, setInputValue] = useState(() => getQueryFromUrl() || '');const [debouncedValue, setDebouncedValue] = useState(() => getQueryFromUrl() || '');// Effect to initialize inputValue from URL if it changes externally// or on initial load if not already set by useState initializeruseEffect(() => {const queryFromUrl = getQueryFromUrl();if (queryFromUrl !== null && queryFromUrl !== inputValue) {setInputValue(queryFromUrl);}}, [getQueryFromUrl, inputValue]);// Effect for debouncing inputValue to debouncedValueuseEffect(() => {const handler = setTimeout(() => {setDebouncedValue(inputValue);}, debounceDelay);return () => {clearTimeout(handler);};}, [inputValue, debounceDelay]);// Effect for updating URL when debouncedValue changesuseEffect(() => {const params = new URLSearchParams(window.location.search);const currentParamValue = params.get(paramName);if (debouncedValue) {if (currentParamValue !== debouncedValue) {params.set(paramName, debouncedValue);window.history.replaceState({}, '', `${window.location.pathname}?${params.toString()}`);}} else {if (currentParamValue !== null) {params.delete(paramName);const newSearch = params.toString();window.history.replaceState({},'',`${window.location.pathname}${newSearch ? '?' : ''}${newSearch}`);}}}, [debouncedValue, paramName]);return { inputValue, setInputValue, debouncedValue };}