{
displayName: "SearchInput";
$input: ?HTMLInputElement;
static defaultProps = {
expanded: false,
hasPrefix: false,
selectedItemId: "",
size: ""
};
componentDidMount() {
this.setFocus();
}
componentDidUpdate(prevProps: Props) {
if (this.props.shouldFocus && !prevProps.shouldFocus) {
this.setFocus();
}
}
setFocus() {
if (this.$input) {
const input = this.$input;
input.focus();
if (!input.value) {
return;
}
// omit prefix @:# from being selected
const selectStartPos = this.props.hasPrefix ? 1 : 0;
input.setSelectionRange(selectStartPos, input.value.length + 1);
}
}
renderSvg() {
const svgName = this.props.showErrorEmoji ? "sad-face" : "magnifying-glass";
return ;
}
renderArrowButtons() {
const { handleNext, handlePrev } = this.props;
return [
arrowBtn(
handleNext,
"arrow-down",
classnames("nav-btn", "next"),
L10N.getFormatStr("editor.searchResults.nextResult")
),
arrowBtn(
handlePrev,
"arrow-up",
classnames("nav-btn", "prev"),
L10N.getFormatStr("editor.searchResults.prevResult")
)
];
}
renderNav() {
const { count, handleNext, handlePrev } = this.props;
if ((!handleNext && !handlePrev) || (!count || count == 1)) {
return;
}
return (
{this.renderArrowButtons()}
);
}
render() {
const {
expanded,
handleClose,
onBlur,
onChange,
onFocus,
onKeyDown,
onKeyUp,
placeholder,
query,
selectedItemId,
showErrorEmoji,
size,
summaryMsg
} = this.props;
const inputProps = {
className: classnames({
empty: showErrorEmoji
}),
onChange,
onKeyDown,
onKeyUp,
onFocus,
onBlur,
"aria-autocomplete": "list",
"aria-controls": "result-list",
"aria-activedescendant":
expanded && selectedItemId ? `${selectedItemId}-title` : "",
placeholder,
value: query,
spellCheck: false,
ref: c => (this.$input = c)
};
return (
{this.renderSvg()}
{summaryMsg &&
{summaryMsg}
}
{this.renderNav()}
);
}
}
export default SearchInput;