react-autosuggestions
Version:
An accessible React component to take the pain out of creating auto-suggestion components
77 lines (70 loc) • 2.66 kB
JavaScript
import React from "react";
import { AutoSuggestContainer } from "./AutoSuggestContainer.js";
import { alphanumericSort } from "../utils/alphanumericSort.js";
export const AutoSuggestClient = React.forwardRef(
(
{ caseInsensitive, disabled, handleChange, id, isOpen, name, options, setIsOpen, styles, type, value, },
ref
) => {
const [sortedOptions, optionType] = alphanumericSort(options);
const [results, setResults] = React.useState(sortedOptions);
const [noResult, setNoResult] = React.useState(false);
const [activeDescendant, setActiveDescendant] = React.useState();
React.useEffect(() => {
if (isOpen && value) {
let res = [];
if (optionType === "string") {
if (caseInsensitive) {
res = options.filter((opt) => opt.toUpperCase().startsWith(value.toUpperCase()));
} else {
res = options.filter((opt) => opt.startsWith(value));
}
}
if (optionType === "object") {
if (caseInsensitive) {
res = options.filter((opt) => opt.value.toUpperCase().startsWith(value.toUpperCase()));
} else {
res = options.filter((opt) => opt.value.startsWith(value));
}
}
setResults(res);
res.length >= 1 && setIsOpen(true);
}
}, [value, isOpen, options]);
React.useEffect(() => {
if (!value) {
setIsOpen(false);
}
}, [value]);
React.useEffect(() => {
if (isOpen === false) {
setResults([]);
setNoResult(false);
}
}, [isOpen]);
const handleInputChange = (value) => {
handleChange(value);
};
return (
<AutoSuggestContainer
activeDescendant={activeDescendant}
clearText={() => {
handleChange();
}}
dataType={type}
disabled={disabled}
id={id}
name={name}
noResult={noResult}
openListbox={isOpen}
options={results}
ref={ref}
searchText={value}
setActiveDescendant={setActiveDescendant}
setOpenListbox={setIsOpen}
setSearchText={handleInputChange}
styles={styles}
/>
);
}
);