@diagramers/admin
Version:
Diagramers Admin Template - React starter for admin dashboards.
74 lines (60 loc) • 1.95 kB
JavaScript
import React, { useEffect, useState } from 'react';
import Fuse from 'fuse.js';
import Autosuggest from 'react-autosuggest';
import axios from 'axios';
import { SERVICE_URL } from 'config.js';
const AutocompleteFuse = () => {
const [valueState, setValueState] = useState('');
const [suggestions, setSuggestions] = useState([]);
const [data, setData] = useState(null);
useEffect(() => {
axios.get(`${SERVICE_URL}/products`).then((res) => {
setData(res.data);
});
}, []);
const escapeRegexCharacters = (str) => {
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
};
const getSuggestions = (value) => {
const escapedValue = escapeRegexCharacters(value.trim());
const fuse = new Fuse(data, {
keys: ['name'],
});
const results = fuse.search(escapedValue).map((result) => {
return result.item;
});
return results;
};
const changeInput = (event, { newValue }) => {
setValueState(newValue);
};
const onSuggestionsFetchRequested = ({ value: val }) => {
setSuggestions(getSuggestions(val));
};
const onSuggestionsClearRequested = () => {
setSuggestions([]);
};
const getSuggestionValue = (suggestion) => suggestion.name;
const renderSuggestion = (suggestion) => <div>{suggestion.name}</div>;
const renderInputComponent = (props) => <input {...props} className="form-control" />;
if (!data) {
return <></>;
}
return (
<Autosuggest
suggestions={suggestions}
onSuggestionsFetchRequested={onSuggestionsFetchRequested}
onSuggestionsClearRequested={onSuggestionsClearRequested}
getSuggestionValue={getSuggestionValue}
renderSuggestion={renderSuggestion}
focusInputOnSuggestionClick={false}
inputProps={{
placeholder: '',
value: valueState,
onChange: changeInput,
}}
renderInputComponent={renderInputComponent}
/>
);
};
export default AutocompleteFuse;