48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
import { useMemo, useState, useCallback } from 'react'
|
|
import { createSearchEngine } from '../utils/searchEngine'
|
|
import { sampleProducts, sampleCategories } from '../data'
|
|
import { SearchResult } from '../types'
|
|
|
|
export function useSearch() {
|
|
const [query, setQuery] = useState('')
|
|
const [results, setResults] = useState<SearchResult[]>([])
|
|
const [selectedResult, setSelectedResult] = useState<SearchResult | null>(null)
|
|
|
|
const searchEngine = useMemo(
|
|
() => createSearchEngine(sampleProducts, sampleCategories),
|
|
[]
|
|
)
|
|
|
|
const handleSearch = useCallback(
|
|
(searchQuery: string) => {
|
|
setQuery(searchQuery)
|
|
if (searchQuery.trim()) {
|
|
const searchResults = searchEngine.search(searchQuery)
|
|
setResults(searchResults)
|
|
} else {
|
|
setResults([])
|
|
}
|
|
},
|
|
[searchEngine]
|
|
)
|
|
|
|
const clearSearch = useCallback(() => {
|
|
setQuery('')
|
|
setResults([])
|
|
setSelectedResult(null)
|
|
}, [])
|
|
|
|
const selectResult = useCallback((result: SearchResult | null) => {
|
|
setSelectedResult(result)
|
|
}, [])
|
|
|
|
return {
|
|
query,
|
|
results,
|
|
selectedResult,
|
|
handleSearch,
|
|
clearSearch,
|
|
selectResult,
|
|
}
|
|
}
|