Skip to content

Commit 38e5e75

Browse files
committed
wip
1 parent e8c07d0 commit 38e5e75

File tree

3 files changed

+20
-9
lines changed

3 files changed

+20
-9
lines changed

src/components/input/autocomplete/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, { forwardRef, useCallback, useState } from "react"
22
import { StyledOptionsContainer } from "./styled"
33
import Dropdown from "@/components/drops/menu/dropdown"
44
import DropdownItem from "@/components/drops/menu/dropdownItem"
5+
import useOutsideClick from "@/hooks/useOutsideClick"
56
import useAutocomplete from "./useAutocomplete"
67

78
const Autocomplete = forwardRef(({ value, autocompleteProps, onInputChange, onEsc }, ref) => {
@@ -20,12 +21,13 @@ const Autocomplete = forwardRef(({ value, autocompleteProps, onInputChange, onEs
2021
} else if (e.code == "Enter") {
2122
onItemClick(filteredSuggestions[activeIndex]?.value)
2223
onEsc()
23-
close()
2424
}
2525
},
2626
[activeIndex, filteredSuggestions, onItemClick, onEsc, close]
2727
)
2828

29+
useOutsideClick(ref, close, ref?.current)
30+
2931
return (
3032
autocompleteOpen && (
3133
<StyledOptionsContainer>

src/components/input/autocomplete/useAutocomplete.js

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,39 @@
1-
import { useCallback } from "react"
2-
import { useState, useEffect } from "react"
1+
import { useState, useEffect, useMemo, useCallback } from "react"
32

43
const useAutocomplete = ({ value, onInputChange, autocompleteProps = {} }) => {
54
const [autocompleteOpen, setAutocompleteOpen] = useState()
65
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)
815

916
const close = useCallback(() => setAutocompleteOpen(false), [setAutocompleteOpen])
1017

1118
const onItemClick = useCallback(
1219
val => {
1320
if (typeof onInputChange == "function") {
1421
onInputChange({ target: { value: val } })
15-
close()
22+
setTimeout(() => close(), 100)
1623
}
1724
},
1825
[close, onInputChange]
1926
)
2027

2128
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+
)
2433
setFilteredSuggestions(filtered)
2534
setAutocompleteOpen(!!filtered.length)
2635
}
27-
}, [value, suggestions, setAutocompleteOpen, setFilteredSuggestions])
36+
}, [value, items, setAutocompleteOpen, setFilteredSuggestions])
2837

2938
return { autocompleteOpen, close, filteredSuggestions, onItemClick }
3039
}

src/components/input/input.stories.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export const Basic = args => <TextInput {...args} />
1616
export const WithAutocomplete = () => {
1717
const [value, setValue] = useState("")
1818
const autocompleteProps = {
19-
suggestions: Array.from(Array(10000).keys()).map(i => ({ value: i, label: `Label ${i}` })),
19+
suggestions: Array.from(Array(10000).keys()).map(i => `Label ${i}`),
2020
}
2121

2222
const onChange = e => {

0 commit comments

Comments
 (0)