aboutsummaryrefslogtreecommitdiff
path: root/src/client/react/components/container/Search.jsx
diff options
context:
space:
mode:
authorNoah Loomans <noahloomans@gmail.com>2017-12-11 20:52:17 +0100
committerNoah Loomans <noahloomans@gmail.com>2017-12-11 20:52:17 +0100
commitb00e556ebff50558e6532683ff2763825c51646f (patch)
tree9b736f10b42493a524f064ac1ef78bb081f3fd81 /src/client/react/components/container/Search.jsx
parent2216d1ceed02e54620f16fb826e5947b6c2cb9bf (diff)
Move hasFocus to internal state
Diffstat (limited to 'src/client/react/components/container/Search.jsx')
-rw-r--r--src/client/react/components/container/Search.jsx95
1 files changed, 57 insertions, 38 deletions
diff --git a/src/client/react/components/container/Search.jsx b/src/client/react/components/container/Search.jsx
index 7890423..a26c277 100644
--- a/src/client/react/components/container/Search.jsx
+++ b/src/client/react/components/container/Search.jsx
@@ -15,40 +15,67 @@ const userShape = {
type: PropTypes.string.isRequired,
};
-const Search = ({
- onInputChange,
- onFocus,
- onBlur,
- hasFocus,
- value,
- exactMatch,
-}) => (
- <div className={classnames('search', { 'search--has-focus': hasFocus })}>
- <div className="search__input-wrapper">
- <div className="search__icon-wrapper">
- <IconFromUserType
- userType={exactMatch ? exactMatch.type : null}
- defaultIcon={<SearchIcon />}
- />
+class Search extends React.Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ hasFocus: false,
+ };
+
+ this.onFocus = this.onFocus.bind(this);
+ this.onBlur = this.onBlur.bind(this);
+ }
+
+ onFocus() {
+ this.setState({
+ hasFocus: true,
+ });
+ }
+
+ onBlur() {
+ this.setState({
+ hasFocus: false,
+ });
+ }
+
+ render() {
+ const {
+ onInputChange,
+ value,
+ exactMatch,
+ } = this.props;
+
+ const {
+ hasFocus,
+ } = this.state;
+
+ return (
+ <div className={classnames('search', { 'search--has-focus': hasFocus })}>
+ <div className="search__input-wrapper">
+ <div className="search__icon-wrapper">
+ <IconFromUserType
+ userType={exactMatch ? exactMatch.type : null}
+ defaultIcon={<SearchIcon />}
+ />
+ </div>
+ <input
+ id="search__input"
+ onChange={onInputChange}
+ value={value}
+ placeholder="Zoeken"
+ onFocus={this.onFocus}
+ onBlur={this.onBlur}
+ />
+ </div>
+ <Results />
</div>
- <input
- id="search__input"
- onChange={onInputChange}
- value={value}
- placeholder="Zoeken"
- onFocus={onFocus}
- onBlur={onBlur}
- />
- </div>
- <Results />
- </div>
-);
+ );
+ }
+}
Search.propTypes = {
onInputChange: PropTypes.func.isRequired,
- onFocus: PropTypes.func.isRequired,
- onBlur: PropTypes.func.isRequired,
- hasFocus: PropTypes.bool.isRequired,
value: PropTypes.string.isRequired,
exactMatch: PropTypes.shape(userShape),
};
@@ -60,7 +87,6 @@ Search.defaultProps = {
const mapStateToProps = state => ({
results: state.search.results,
value: state.search.input,
- hasFocus: state.search.hasFocus,
exactMatch: state.search.exactMatch,
});
@@ -68,13 +94,6 @@ const mapDispatchToProps = dispatch => ({
onInputChange: (event) => {
dispatch(inputChange(event.target.value));
},
- onFocus: () => {
- dispatch(focusChange(true));
- document.querySelector('#search__input').select();
- },
- onBlur: () => {
- dispatch(focusChange(false));
- },
});
export default connect(mapStateToProps, mapDispatchToProps)(Search);