-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathuseAutocomplete.js
More file actions
50 lines (43 loc) · 1.37 KB
/
useAutocomplete.js
File metadata and controls
50 lines (43 loc) · 1.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import { useState, useEffect, useMemo, useCallback } from "react"
const defaultSuggestions = {
loading: false,
loaded: true,
value: [],
error: null,
}
const useAutocomplete = ({ value, onInputChange, autocompleteProps = {} }) => {
const [autocompleteOpen, setAutocompleteOpen] = useState()
const { suggestions = defaultSuggestions } = autocompleteProps || {}
const items = useMemo(
() =>
suggestions.value.map(suggestion => ({
value: suggestion,
label: suggestion,
})),
[suggestions]
)
const [filteredSuggestions, setFilteredSuggestions] = useState(items)
const close = useCallback(() => setAutocompleteOpen(false), [setAutocompleteOpen])
const onItemClick = useCallback(
val => {
if (typeof onInputChange == "function") {
onInputChange({ target: { value: val } })
setTimeout(() => close(), 100)
}
},
[close, onInputChange]
)
useEffect(() => {
if (!value) {
close()
} else if (items.length) {
const filtered = items.filter(({ label }) =>
label.toLowerCase().includes(value.toLowerCase())
)
setFilteredSuggestions(filtered)
setAutocompleteOpen(!!filtered.length)
}
}, [value, items, setAutocompleteOpen, setFilteredSuggestions, close])
return { autocompleteOpen, close, filteredSuggestions, onItemClick }
}
export default useAutocomplete