-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathautocomplete.tsx
97 lines (81 loc) · 2.92 KB
/
autocomplete.tsx
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import React, { useState, MouseEvent, Fragment, KeyboardEvent, ChangeEvent, useEffect } from 'react';
import './autocomplete.css';
type AutoCompleteProps = {
name: string,
suggestions: string[],
onSelect: (item: string) => void
};
const AutoComplete = (props: AutoCompleteProps) => {
const [activeSuggestion, setActiveSuggestion] = useState(0);
const [filteredSuggestions, setFilteredSuggestions] = useState<string[]>([]);
const [userInput, setUserInput] = useState('');
useEffect(() => {
}, [filteredSuggestions, userInput, activeSuggestion])
const onSuggestionClick = (event: MouseEvent<HTMLInputElement>) => {
onSuggestionSelect(event.currentTarget.innerText);
}
const onSuggestionSelect = (name: string) => {
setUserInput(name);
setFilteredSuggestions([]);
props.onSelect(name);
}
const suggestionsComponent = (
<div className="autocomplete-items">
{filteredSuggestions.map((item, index) => {
return (
<div key={index}
className={index === activeSuggestion ? "autocomplete-active" : ""}
onClick={onSuggestionClick}>
{item}
</div>
)
})}
</div>
)
const onInputChange = (event: ChangeEvent<HTMLInputElement>) => {
const input = event.currentTarget.value;
const filtered = props.suggestions.filter(
suggestion => suggestion.toLowerCase().indexOf(input.toLowerCase()) > -1
);
setUserInput(input);
setFilteredSuggestions(filtered);
}
const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
if (filteredSuggestions.length === 0) {
return;
}
if (event.keyCode === 13) {
onSuggestionSelect(filteredSuggestions[activeSuggestion]);
} else if (event.keyCode === 38) {
if (activeSuggestion === 0) {
return;
}
setActiveSuggestion(activeSuggestion - 1);
} else if (event.keyCode === 40) {
if (activeSuggestion === filteredSuggestions.length - 1) {
return;
}
setActiveSuggestion(activeSuggestion + 1);
}
}
return(
<Fragment>
<div className="autocomplete">
<input
autoComplete="false"
className="autocomplete"
id="myInput"
type="text"
name={props.name}
placeholder="Start typing..."
required
onChange={onInputChange}
onKeyDown={onKeyDown}
value={userInput}
/>
{suggestionsComponent}
</div>
</Fragment>
)
}
export default AutoComplete;