Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3494 | Autoría | Ultima modificación | Ver Log |

import { useCallback } from 'react';
import { useSearchParams } from 'react-router-dom';

import { useFetch } from './useFetch';
import { debounce } from '@utils';

export function useSearch(url = '', { debounceDelay = 300, initialParams = {} } = {}) {
  const [searchParams, setSearchParams] = useSearchParams();

  const initialSearchURLParams = new URLSearchParams({
    ...Object.fromEntries(searchParams.entries()),
    ...initialParams
  });

  const { data, loading, refetch } = useFetch(url + '?' + initialSearchURLParams.toString());

  const updateSearchParams = useCallback(
    (newParams) => {
      setSearchParams(newParams, { replace: true });
    },
    [setSearchParams]
  );

  const setSearchParam = useCallback(
    (key, value) => {
      const newParams = new URLSearchParams(searchParams);
      if (value !== undefined && value !== null && value !== '') {
        newParams.set(key, value);
      } else {
        newParams.delete(key);
      }
      updateSearchParams(newParams);
    },
    [searchParams, updateSearchParams]
  );

  const search = useCallback(
    debounce((value) => {
      setSearchParam('search', value);
    }, debounceDelay),
    [setSearchParam, debounceDelay]
  );

  return {
    data,
    loading,
    search,
    refetch
  };
}