diff options
author | Noah Loomans <noahloomans@gmail.com> | 2018-07-03 19:34:23 +0200 |
---|---|---|
committer | Noah Loomans <noahloomans@gmail.com> | 2018-07-03 20:13:51 +0200 |
commit | 15dc5ccd08ce323a48edaa53dfcec24b7151e3af (patch) | |
tree | 98ca0a20606f05eef12fc63f317baa520701769a | |
parent | 5451dc2f5a09fa06df32d1a1661623b475170566 (diff) |
client/Search: Refactor
-rw-r--r-- | src/client/react/components/container/Search.js | 27 | ||||
-rw-r--r-- | src/client/react/components/presentational/Search.js | 55 |
2 files changed, 41 insertions, 41 deletions
diff --git a/src/client/react/components/container/Search.js b/src/client/react/components/container/Search.js index 8308d67..b680fc6 100644 --- a/src/client/react/components/container/Search.js +++ b/src/client/react/components/container/Search.js @@ -18,24 +18,35 @@ * */ + import { connect } from 'react-redux'; import { withRouter } from 'react-router-dom'; import Search from '../presentational/Search'; -import { setUser } from '../../store/actions'; +import { setUser as setUserAction } from '../../store/actions'; +import { userFromLocation } from '../../lib/url'; +import users from '../../users'; -const mapStateToProps = state => ({ - results: state.search.results, - searchText: state.search.text, - selectedResult: state.search.selected, -}); +const mapStateToProps = (state, { location }) => { + const currentUser = userFromLocation(location); + const searchText = state.search.text; + const isExactMatch = currentUser != null && searchText === users.byId[currentUser].value; + + return { + currentUser, + isExactMatch, + selectedUser: state.search.selected, + results: state.search.results, + searchText: state.search.text, + }; +}; const mapDispatchToProps = dispatch => ({ - setUser: user => dispatch(setUser(user)), + setUser: user => dispatch(setUserAction(user)), onInputChange: searchText => dispatch({ type: 'SEARCH/INPUT_CHANGE', searchText, }), - changeSelectedResult: relativeChange => dispatch({ + changeSelectedUser: relativeChange => dispatch({ type: 'SEARCH/CHANGE_SELECTED_RESULT', relativeChange, }), diff --git a/src/client/react/components/presentational/Search.js b/src/client/react/components/presentational/Search.js index 8c90efb..c39b441 100644 --- a/src/client/react/components/presentational/Search.js +++ b/src/client/react/components/presentational/Search.js @@ -24,8 +24,6 @@ import classnames from 'classnames'; import SearchIcon from 'react-icons/lib/md/search'; -import { userFromMatch } from '../../lib/url'; - import users from '../../users'; import Menu from '../container/Menu'; import Results from '../container/Results'; @@ -35,16 +33,18 @@ import './Search.scss'; class Search extends React.Component { static propTypes = { - selectedResult: PropTypes.string, + currentUser: PropTypes.string, + selectedUser: PropTypes.string, searchText: PropTypes.string.isRequired, - match: PropTypes.object.isRequired, - setUser: PropTypes.func.isRequired, + isExactMatch: PropTypes.bool.isRequired, onInputChange: PropTypes.func.isRequired, - changeSelectedResult: PropTypes.func.isRequired, + setUser: PropTypes.func.isRequired, + changeSelectedUser: PropTypes.func.isRequired, }; static defaultProps = { - selectedResult: null, + currentUser: null, + selectedUser: null, }; constructor(props) { @@ -53,10 +53,6 @@ class Search extends React.Component { this.state = { hasFocus: false, }; - - this.onFocus = this.onFocus.bind(this); - this.onBlur = this.onBlur.bind(this); - this.onKeyDown = this.onKeyDown.bind(this); } onFocus() { @@ -71,36 +67,34 @@ class Search extends React.Component { }); } - onKeyDown(event) { + handleKeyDown(event) { const { - selectedResult, - match, + currentUser, + selectedUser, setUser, - changeSelectedResult, + changeSelectedUser, } = this.props; - const urlUser = userFromMatch(match); - switch (event.key) { case 'ArrowUp': event.preventDefault(); - changeSelectedResult(-1); + changeSelectedUser(-1); break; case 'ArrowDown': event.preventDefault(); - changeSelectedResult(+1); + changeSelectedUser(+1); break; case 'Escape': event.preventDefault(); - setUser(urlUser); + setUser(currentUser); break; case 'Enter': event.preventDefault(); - if (selectedResult) { - setUser(selectedResult); + if (selectedUser) { + setUser(selectedUser); } break; @@ -112,7 +106,8 @@ class Search extends React.Component { render() { const { searchText, - match, + selectedUser, + isExactMatch, onInputChange, } = this.props; @@ -120,30 +115,24 @@ class Search extends React.Component { hasFocus, } = this.state; - const urlUser = userFromMatch(match); - - const isExactMatch = ( - urlUser != null && searchText === users.byId[urlUser].value - ); - return ( <div className="Search"> <div className={classnames('overflow', { hasFocus })}> <div className="inputWrapper"> <div className="iconWrapper"> <IconFromUserType - userType={isExactMatch ? users.byId[urlUser].type : null} + userType={isExactMatch ? users.byId[selectedUser].type : null} defaultIcon={<SearchIcon />} /> </div> <input id="searchInput" onChange={event => onInputChange(event.target.value)} - onKeyDown={this.onKeyDown} + onKeyDown={event => this.handleKeyDown(event)} value={searchText} placeholder="Zoeken" - onFocus={this.onFocus} - onBlur={this.onBlur} + onFocus={() => this.onFocus()} + onBlur={() => this.onBlur()} autoComplete="off" /> <Menu /> |