import debounce from "lodash.debounce"
import { useCallback, useEffect, useState } from "react"

/**
 * Hook for debouncing search input
 * @returns searchValue, onSearchValueChange, query
 */
export const useDebouncedSearch = () => {
  const [searchValue, onSearchValueChange] = useState("")
  const [debouncedQuery, setDebouncedQuery] = useState("")

  // eslint-disable-next-line react-hooks/exhaustive-deps
  const debouncedUpdate = useCallback(
    debounce((query: string) => setDebouncedQuery(query), 300),
    []
  )

  useEffect(() => {
    debouncedUpdate(searchValue)

    return () => debouncedUpdate.cancel()
  }, [searchValue, debouncedUpdate])

  return {
    searchValue,
    onSearchValueChange,
    query: debouncedQuery || undefined,
  }
}
