Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3512 | Rev 3521 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3512 stevensc 1
import { useState, useEffect, useCallback } from 'react';
3514 stevensc 2
import { useSearchParams } from 'react-router-dom';
3512 stevensc 3
 
4
export function useDebouncedSearchParam(paramName, debounceDelay = 500) {
3514 stevensc 5
  const [searchParams, setSearchParams] = useSearchParams();
6
 
3512 stevensc 7
  const getQueryFromUrl = useCallback(() => {
3514 stevensc 8
    return searchParams.get(paramName);
9
  }, [searchParams, paramName]);
3512 stevensc 10
 
11
  const [inputValue, setInputValue] = useState(() => getQueryFromUrl() || '');
12
  const [debouncedValue, setDebouncedValue] = useState(() => getQueryFromUrl() || '');
13
 
3514 stevensc 14
  // Efecto para inicializar inputValue desde la URL si cambia externamente
15
  // o en la carga inicial si no está configurado por el inicializador de useState
3512 stevensc 16
  useEffect(() => {
17
    const queryFromUrl = getQueryFromUrl();
18
    if (queryFromUrl !== null && queryFromUrl !== inputValue) {
19
      setInputValue(queryFromUrl);
20
    }
21
  }, [getQueryFromUrl, inputValue]);
22
 
3514 stevensc 23
  // Efecto para retardar (debounce) inputValue a debouncedValue
3512 stevensc 24
  useEffect(() => {
25
    const handler = setTimeout(() => {
26
      setDebouncedValue(inputValue);
27
    }, debounceDelay);
28
 
29
    return () => {
30
      clearTimeout(handler);
31
    };
32
  }, [inputValue, debounceDelay]);
33
 
3514 stevensc 34
  // Efecto para actualizar la URL cuando debouncedValue cambia
3512 stevensc 35
  useEffect(() => {
3514 stevensc 36
    const currentParamValue = searchParams.get(paramName);
3512 stevensc 37
 
38
    if (debouncedValue) {
39
      if (currentParamValue !== debouncedValue) {
3514 stevensc 40
        const newSearchParams = new URLSearchParams(searchParams);
41
        newSearchParams.set(paramName, debouncedValue);
42
        setSearchParams(newSearchParams);
3512 stevensc 43
      }
44
    } else {
45
      if (currentParamValue !== null) {
3514 stevensc 46
        const newSearchParams = new URLSearchParams(searchParams);
47
        newSearchParams.delete(paramName);
48
        setSearchParams(newSearchParams);
3512 stevensc 49
      }
50
    }
3514 stevensc 51
  }, [debouncedValue, paramName, searchParams, setSearchParams]);
3512 stevensc 52
 
53
  return { inputValue, setInputValue, debouncedValue };
54
}