@primer/react
Version:
An implementation of GitHub's Primer Design System using React
124 lines (121 loc) • 2.98 kB
JavaScript
import React__default, { useRef, useReducer, useCallback } from 'react';
import { AutocompleteContext } from './AutocompleteContext.js';
import AutocompleteInput from './AutocompleteInput.js';
import AutocompleteMenu from './AutocompleteMenu.js';
import AutocompleteOverlay from './AutocompleteOverlay.js';
import { useId } from '../hooks/useId.js';
const initialState = {
inputValue: '',
showMenu: false,
isMenuDirectlyActivated: false,
autocompleteSuggestion: '',
selectedItemLength: 0
};
const reducer = (state, action) => {
const {
type,
payload
} = action;
switch (type) {
case 'inputValue':
return {
...state,
inputValue: payload
};
case 'showMenu':
return {
...state,
showMenu: payload
};
case 'isMenuDirectlyActivated':
return {
...state,
isMenuDirectlyActivated: payload
};
case 'autocompleteSuggestion':
return {
...state,
autocompleteSuggestion: payload
};
case 'selectedItemLength':
return {
...state,
selectedItemLength: payload
};
default:
return state;
}
};
const Autocomplete = ({
children,
id: idProp
}) => {
const activeDescendantRef = useRef(null);
const scrollContainerRef = useRef(null);
const inputRef = useRef(null);
const [state, dispatch] = useReducer(reducer, initialState);
const {
inputValue,
showMenu,
autocompleteSuggestion,
isMenuDirectlyActivated,
selectedItemLength
} = state;
const setInputValue = useCallback(value => {
dispatch({
type: 'inputValue',
payload: value
});
}, []);
const setShowMenu = useCallback(value => {
dispatch({
type: 'showMenu',
payload: value
});
}, []);
const setAutocompleteSuggestion = useCallback(value => {
dispatch({
type: 'autocompleteSuggestion',
payload: value
});
}, []);
const setIsMenuDirectlyActivated = useCallback(value => {
dispatch({
type: 'isMenuDirectlyActivated',
payload: value
});
}, []);
const setSelectedItemLength = useCallback(value => {
dispatch({
type: 'selectedItemLength',
payload: value
});
}, []);
const id = useId(idProp);
return /*#__PURE__*/React__default.createElement(AutocompleteContext.Provider, {
value: {
activeDescendantRef,
autocompleteSuggestion,
id,
inputRef,
inputValue,
isMenuDirectlyActivated,
scrollContainerRef,
selectedItemLength,
setAutocompleteSuggestion,
setInputValue,
setIsMenuDirectlyActivated,
setShowMenu,
setSelectedItemLength,
showMenu
}
}, children);
};
Autocomplete.displayName = "Autocomplete";
var Autocomplete$1 = Object.assign(Autocomplete, {
Context: AutocompleteContext,
Input: AutocompleteInput,
Menu: AutocompleteMenu,
Overlay: AutocompleteOverlay
});
export { Autocomplete$1 as default };