|
1 | | -import { useCallback } from "react" |
2 | | -import { useState, useEffect } from "react" |
| 1 | +import { useState, useEffect, useMemo, useCallback } from "react" |
3 | 2 |
|
4 | 3 | const useAutocomplete = ({ value, onInputChange, autocompleteProps = {} }) => { |
5 | 4 | const [autocompleteOpen, setAutocompleteOpen] = useState() |
6 | 5 | const { suggestions = [] } = autocompleteProps || {} |
7 | | - const [filteredSuggestions, setFilteredSuggestions] = useState(suggestions) |
| 6 | + const items = useMemo( |
| 7 | + () => |
| 8 | + suggestions.map(suggestion => ({ |
| 9 | + value: suggestion, |
| 10 | + label: suggestion, |
| 11 | + })), |
| 12 | + [suggestions] |
| 13 | + ) |
| 14 | + const [filteredSuggestions, setFilteredSuggestions] = useState(items) |
8 | 15 |
|
9 | 16 | const close = useCallback(() => setAutocompleteOpen(false), [setAutocompleteOpen]) |
10 | 17 |
|
11 | 18 | const onItemClick = useCallback( |
12 | 19 | val => { |
13 | 20 | if (typeof onInputChange == "function") { |
14 | 21 | onInputChange({ target: { value: val } }) |
15 | | - close() |
| 22 | + setTimeout(() => close(), 100) |
16 | 23 | } |
17 | 24 | }, |
18 | 25 | [close, onInputChange] |
19 | 26 | ) |
20 | 27 |
|
21 | 28 | useEffect(() => { |
22 | | - if (suggestions.length && !!value) { |
23 | | - const filtered = suggestions.filter(({ label }) => label.includes(value)) |
| 29 | + if (items.length && !!value) { |
| 30 | + const filtered = items.filter(({ label }) => |
| 31 | + label.toLowerCase().includes(value.toLowerCase()) |
| 32 | + ) |
24 | 33 | setFilteredSuggestions(filtered) |
25 | 34 | setAutocompleteOpen(!!filtered.length) |
26 | 35 | } |
27 | | - }, [value, suggestions, setAutocompleteOpen, setFilteredSuggestions]) |
| 36 | + }, [value, items, setAutocompleteOpen, setFilteredSuggestions]) |
28 | 37 |
|
29 | 38 | return { autocompleteOpen, close, filteredSuggestions, onItemClick } |
30 | 39 | } |
|
0 commit comments