Rev 3512 | Rev 3521 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import { useState, useEffect, useCallback } from 'react';import { useSearchParams } from 'react-router-dom';export function useDebouncedSearchParam(paramName, debounceDelay = 500) {const [searchParams, setSearchParams] = useSearchParams();const getQueryFromUrl = useCallback(() => {return searchParams.get(paramName);}, [searchParams, paramName]);const [inputValue, setInputValue] = useState(() => getQueryFromUrl() || '');const [debouncedValue, setDebouncedValue] = useState(() => getQueryFromUrl() || '');// Efecto para inicializar inputValue desde la URL si cambia externamente// o en la carga inicial si no está configurado por el inicializador de useStateuseEffect(() => {const queryFromUrl = getQueryFromUrl();if (queryFromUrl !== null && queryFromUrl !== inputValue) {setInputValue(queryFromUrl);}}, [getQueryFromUrl, inputValue]);// Efecto para retardar (debounce) inputValue a debouncedValueuseEffect(() => {const handler = setTimeout(() => {setDebouncedValue(inputValue);}, debounceDelay);return () => {clearTimeout(handler);};}, [inputValue, debounceDelay]);// Efecto para actualizar la URL cuando debouncedValue cambiauseEffect(() => {const currentParamValue = searchParams.get(paramName);if (debouncedValue) {if (currentParamValue !== debouncedValue) {const newSearchParams = new URLSearchParams(searchParams);newSearchParams.set(paramName, debouncedValue);setSearchParams(newSearchParams);}} else {if (currentParamValue !== null) {const newSearchParams = new URLSearchParams(searchParams);newSearchParams.delete(paramName);setSearchParams(newSearchParams);}}}, [debouncedValue, paramName, searchParams, setSearchParams]);return { inputValue, setInputValue, debouncedValue };}