Skip to content

Commit fd9e8da

Browse files
committed
Better UX to Autocomplete component
1 parent a836e4b commit fd9e8da

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

src/components/Autocomplete.tsx

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ const Autocomplete = forwardRef<AutocompleteRef, AutocompleteProps & Omit<React.
4242
const [active, setActive] = useState<any | null>(null)
4343
const [take, setTake] = useState(viewCount)
4444
const [filteredValues, setFilteredValues] = useState<any[]>([])
45+
const [isFocused, setIsFocused] = useState(false)
4546
const txtInputRef = useRef<HTMLInputElement>(null)
4647
const containerRef = useRef<HTMLDivElement>(null)
4748

@@ -163,6 +164,14 @@ const Autocomplete = forwardRef<AutocompleteRef, AutocompleteProps & Omit<React.
163164
const keyDown = useCallback((e: React.KeyboardEvent) => {
164165
if (e.shiftKey || e.ctrlKey || e.altKey) return
165166

167+
// Handle backspace to remove last selected item in multiple mode
168+
if (e.code === 'Backspace' && multiple && inputValue === '' && Array.isArray(value) && value.length > 0) {
169+
const newValues = value.slice(0, -1)
170+
onChange?.(newValues)
171+
e.preventDefault()
172+
return
173+
}
174+
166175
if (!expanded) {
167176
if (e.code === 'ArrowDown') {
168177
setExpanded(true)
@@ -215,7 +224,7 @@ const Autocomplete = forwardRef<AutocompleteRef, AutocompleteProps & Omit<React.
215224
setExpanded(false)
216225
}
217226
}
218-
}, [expanded, filteredValues, active, multiple, scrollActiveIntoView, onlyScrollActiveIntoViewIfNeeded])
227+
}, [expanded, filteredValues, active, multiple, inputValue, value, onChange, scrollActiveIntoView, onlyScrollActiveIntoViewIfNeeded])
219228

220229
const toggle = useCallback((expand: boolean) => {
221230
setExpanded(expand)
@@ -288,8 +297,9 @@ const Autocomplete = forwardRef<AutocompleteRef, AutocompleteProps & Omit<React.
288297
newValues.push(option)
289298
}
290299
setActive(null)
300+
setInputValue('')
291301
onChange?.(newValues)
292-
// Don't clear input or close dropdown in multiple mode - keep it open for more selections
302+
// Don't close dropdown in multiple mode - keep it open for more selections
293303
} else {
294304
setInputValue('')
295305
setExpanded(false)
@@ -358,10 +368,15 @@ const Autocomplete = forwardRef<AutocompleteRef, AutocompleteProps & Omit<React.
358368
autoComplete="off"
359369
spellCheck="false"
360370
className="p-0 dark:bg-transparent rounded-md border-none focus:!border-none focus:!outline-none"
361-
style={{ boxShadow: 'none !important', width: `${inputValue.length + 1}ch` }}
371+
style={{
372+
boxShadow: 'none !important',
373+
width: (isFocused || inputValue.length > 0) ? `${inputValue.length + 1}ch` : undefined
374+
}}
362375
value={inputValue}
363376
onChange={(e) => setInputValue(e.target.value)}
364-
placeholder={!value || (Array.isArray(value) && value.length === 0) ? placeholder : ''}
377+
placeholder={!isFocused && (!value || (Array.isArray(value) && value.length === 0)) ? placeholder : ''}
378+
onFocus={() => setIsFocused(true)}
379+
onBlur={() => setIsFocused(false)}
365380
onKeyDown={keyDown}
366381
onKeyUp={keyUp}
367382
onClick={onInputClick}

0 commit comments

Comments
 (0)