import { useRef, useState, useTransition } from "react" import Link from "next/link" // import throttle from "@jcoreio/async-throttle" import debounce from "lodash.debounce" import { GoSearch } from "react-icons/go" import { useStore } from "@/app/state/useStore" import { cn } from "@/lib/utils/cn" import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" import { getVideos } from "@/app/api/actions/ai-tube-hf/getVideos" export function SearchInput() { const [_pending, startTransition] = useTransition() const setSearchAutocompleteQuery = useStore(s => s.setSearchAutocompleteQuery) const showAutocompleteBox = useStore(s => s.showAutocompleteBox) const setShowAutocompleteBox = useStore(s => s.setShowAutocompleteBox) const searchAutocompleteResults = useStore(s => s.searchAutocompleteResults) const setSearchAutocompleteResults = useStore(s => s.setSearchAutocompleteResults) const setSearchQuery = useStore(s => s.setSearchQuery) const [searchDraft, setSearchDraft] = useState("") const ref = useRef(null) // called when pressing enter or clicking on search const debouncedSearch = debounce((query: string) => { startTransition(async () => { console.log(`searching for "${query}"..`) const videos = await getVideos({ query, sortBy: "match", maxNbMedias: 8, neverThrow: true, renewCache: false, // bit of optimization }) console.log(`got ${videos.length} results!`) setSearchAutocompleteResults(videos) // TODO: only close the show autocomplete box if we found something // setShowAutocompleteBox(false) }) }, 500) // called when pressing enter or clicking on search const handleSearch = () => { ref.current?.focus() setSearchQuery(searchDraft) setShowAutocompleteBox(true) debouncedSearch(searchDraft) } return (
{ handleSearch() }} onChange={(e) => { setSearchDraft(e.target.value) setShowAutocompleteBox(true) // handleSearch() }} onKeyDown={({ key }) => { if (key === 'Enter') { handleSearch() } }} value={searchDraft} />
{searchAutocompleteResults.length === 0 ?
Nothing to show, type something and press enter
: null} {searchAutocompleteResults.map(media => (
{media.label}
))}
) }