@@ -21,6 +21,8 @@ export default function AcmEventHeads({ teamTitle, pills, setPills, setEmptyErro
21
21
const [ showSearchResults , setShowSearchResults ] = useState ( true )
22
22
const { data : session } = useSession ( ) ;
23
23
const token = getCookieData ( session ) . data . token
24
+ const [ cursor , setCursor ] = useState ( - 1 )
25
+ const [ mousePointer , setMousePointer ] = useState ( - 1 )
24
26
25
27
const searchUsersApi = useCallback ( ( pattern : string ) => {
26
28
getMatchingUsersApi ( pattern , token )
@@ -66,6 +68,7 @@ export default function AcmEventHeads({ teamTitle, pills, setPills, setEmptyErro
66
68
setNameSearchValue ( "" )
67
69
setDebouncedValue ( "" )
68
70
setSearchResult ( [ ] )
71
+ setCursor ( - 1 )
69
72
setEmptyError ( false )
70
73
setPills ( ( prevState ) => {
71
74
return [ ...prevState , pill ] ;
@@ -89,9 +92,32 @@ export default function AcmEventHeads({ teamTitle, pills, setPills, setEmptyErro
89
92
const handleBlur = ( ) => {
90
93
setTimeout ( ( ) => {
91
94
setShowSearchResults ( false )
95
+ setCursor ( - 1 )
92
96
} , 500 )
93
97
}
94
98
99
+ const keyboardNavigation = ( e : React . KeyboardEvent < HTMLInputElement > ) => {
100
+ if ( e . key === "Enter" ) {
101
+ if ( cursor < searchResult . length && cursor != - 1 ) {
102
+ addUserToPills ( searchResult [ cursor ] )
103
+ }
104
+ }
105
+ if ( e . key === "ArrowUp" ) {
106
+ if ( cursor > 0 ) {
107
+ setCursor ( cursor => cursor - 1 )
108
+ }
109
+ }
110
+ if ( e . key === "ArrowDown" ) {
111
+ if ( cursor < searchResult . length - 1 ) {
112
+ setCursor ( cursor => cursor + 1 )
113
+ }
114
+ }
115
+ if ( e . key === "Escape" ) {
116
+ setShowSearchResults ( false )
117
+ setCursor ( - 1 )
118
+ }
119
+ }
120
+
95
121
return (
96
122
< div className = { styles [ 'acm-event-heads-container' ] } >
97
123
< div className = { styles . pillInputDiv } >
@@ -103,26 +129,45 @@ export default function AcmEventHeads({ teamTitle, pills, setPills, setEmptyErro
103
129
className = { styles . pillInput }
104
130
placeholder = { `Search ${ teamTitle } *` }
105
131
onBlur = { handleBlur }
132
+ onKeyDown = { keyboardNavigation }
106
133
/>
107
134
</ div >
108
135
109
136
< div >
110
137
{
111
138
showSearchResults &&
112
- < div className = { styles [ 'pills-container' ] } >
113
- { searchResult . map ( ( pill : Pill ) =>
114
- < div
139
+ < ul className = { styles [ 'pills-container' ] } >
140
+ { searchResult . map ( ( pill : Pill ) => {
141
+ const idxOfPill = searchResult . indexOf ( pill )
142
+ return < div
115
143
onClick = { ( ) => addUserToPills ( pill ) }
116
144
key = { pill . email }
117
- className = { styles [ 'pill' ] }
145
+ style = { {
146
+ backgroundColor : cursor === idxOfPill || mousePointer === idxOfPill ? "#0a69da" : "white" ,
147
+ color : cursor === idxOfPill || mousePointer === idxOfPill ? "white" : "black" ,
148
+ padding : '10px' ,
149
+ margin : 0 ,
150
+ cursor : 'pointer'
151
+ } }
152
+ onMouseEnter = { ( ) => setCursor ( searchResult . indexOf ( pill ) ) }
153
+ onMouseLeave = { ( ) => setCursor ( - 1 ) }
118
154
>
119
155
{ pill . name }
120
- < p >
156
+ < p
157
+ style = { {
158
+ color : cursor === searchResult . indexOf ( pill ) || mousePointer === idxOfPill ? "white" : "grey" ,
159
+ fontSize : 'small' ,
160
+ overflow : 'clip' ,
161
+ margin : 0
162
+ } }
163
+ >
121
164
{ pill . email }
122
165
</ p >
123
166
</ div >
167
+ }
168
+
124
169
) }
125
- </ div >
170
+ </ ul >
126
171
}
127
172
</ div >
128
173
</ div >
0 commit comments