p5.js-web-editor/client/modules/IDE/components/Searchbar/Searchbar.jsx

72 lines
1.8 KiB
React
Raw Normal View History

import PropTypes from 'prop-types';
import React from 'react';
import { throttle } from 'lodash';
2020-04-29 22:34:37 +00:00
import SearchIcon from '../../../../images/magnifyingglass.svg';
class Searchbar extends React.Component {
constructor(props) {
super(props);
this.state = {
searchValue: this.props.searchTerm
};
this.throttledSearchChange = throttle(this.searchChange, 500);
}
componentWillUnmount() {
this.props.resetSearchTerm();
}
handleResetSearch = () => {
this.setState({ searchValue: '' }, () => {
this.props.resetSearchTerm();
});
}
2020-04-06 03:51:09 +00:00
searchChange = () => {
this.props.setSearchTerm(this.state.searchValue.trim());
};
handleSearchChange = (e) => {
this.setState({ searchValue: e.target.value }, () => {
this.throttledSearchChange(this.state.searchValue.trim());
});
}
render() {
const { searchValue } = this.state;
return (
<div className={`searchbar ${searchValue === '' ? 'searchbar--is-empty' : ''}`}>
2020-02-25 17:52:52 +00:00
<div className="searchbar__button">
<SearchIcon className="searchbar__icon" focusable="false" aria-hidden="true" />
2020-02-25 17:52:52 +00:00
</div>
<input
className="searchbar__input"
type="text"
value={searchValue}
placeholder={this.props.searchLabel}
onChange={this.handleSearchChange}
/>
<button
className="searchbar__clear-button"
onClick={this.handleResetSearch}
>clear
</button>
</div>
);
}
}
Searchbar.propTypes = {
searchTerm: PropTypes.string.isRequired,
setSearchTerm: PropTypes.func.isRequired,
resetSearchTerm: PropTypes.func.isRequired,
searchLabel: PropTypes.string,
};
Searchbar.defaultProps = {
searchLabel: 'Search sketches...',
};
export default Searchbar;