box-ui-elements-mlh
Version:
71 lines (58 loc) • 2.2 kB
JavaScript
// @flow
import * as React from 'react';
import classNames from 'classnames';
import SelectorDropdown from '../../components/selector-dropdown';
import QuickSearchMessage from './QuickSearchMessage';
import QuickSearchSelector from './QuickSearchSelector';
import './QuickSearch.scss';
type Props = {
/** Options to render in the quick search dropdown */
children?: React.Node,
/** CSS class for the wrapper div */
className?: string,
/** Index at which to insert the divider */
dividerIndex?: number,
/** Message to display for the error state */
errorMessage?: React.Node,
/** Props for the input element (search bar) */
inputProps: Object,
/** Message to display when no results are found */
noItemsMessage?: React.Node,
/** Function called with the index of the selected option and the event (selected by keyboard or click) */
onSelect?: Function,
};
type State = {
showMessage: boolean,
};
class QuickSearch extends React.Component<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
showMessage: false,
};
}
handleFocus = () => {
this.setState({ showMessage: true });
};
handleBlur = () => {
this.setState({ showMessage: false });
};
render() {
const { children, className, dividerIndex, errorMessage, inputProps, noItemsMessage, onSelect } = this.props;
const { showMessage } = this.state;
return (
<div className={classNames('quick-search', className)} onBlur={this.handleBlur} onFocus={this.handleFocus}>
<SelectorDropdown
dividerIndex={dividerIndex}
onSelect={onSelect}
selector={<QuickSearchSelector {...inputProps} />}
>
{children}
</SelectorDropdown>
{!!errorMessage && <QuickSearchMessage isShown={showMessage}>{errorMessage}</QuickSearchMessage>}
{!!noItemsMessage && <QuickSearchMessage isShown={showMessage}>{noItemsMessage}</QuickSearchMessage>}
</div>
);
}
}
export default QuickSearch;