HeaderSearchBox.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // This is the root component for #search-top
  2. import React from 'react';
  3. import PropTypes from 'prop-types';
  4. import SearchForm from './HeaderSearchBox/SearchForm';
  5. import SearchSuggest from './HeaderSearchBox/SearchSuggest';
  6. export default class SearchBox extends React.Component {
  7. constructor(props) {
  8. super(props);
  9. this.state = {
  10. searchingKeyword: '',
  11. searchedPages: [],
  12. searchError: null,
  13. searching: false,
  14. focused: false,
  15. }
  16. this.search = this.search.bind(this);
  17. this.isShown = this.isShown.bind(this);
  18. }
  19. isShown(focused) {
  20. this.setState({focused: !!focused});
  21. }
  22. search(data) {
  23. const keyword = data.keyword;
  24. if (keyword === '') {
  25. this.setState({
  26. searchingKeyword: '',
  27. searchedPages: [],
  28. });
  29. return true;
  30. }
  31. this.setState({
  32. searchingKeyword: keyword,
  33. searching: true,
  34. });
  35. this.props.crowi.apiGet('/search', {q: keyword})
  36. .then(res => {
  37. this.setState({
  38. searchingKeyword: keyword,
  39. searchedPages: res.data,
  40. searching: false,
  41. searchError: null,
  42. });
  43. }).catch(err => {
  44. this.setState({
  45. searchError: err,
  46. searching: false,
  47. });
  48. });
  49. }
  50. render() {
  51. return (
  52. <div className="search-box">
  53. <SearchForm
  54. onSearchFormChanged={this.search}
  55. isShown={this.isShown}
  56. />
  57. <SearchSuggest
  58. searchingKeyword={this.state.searchingKeyword}
  59. searchedPages={this.state.searchedPages}
  60. searchError={this.state.searchError}
  61. searching={this.state.searching}
  62. focused={this.state.focused}
  63. />
  64. </div>
  65. );
  66. }
  67. }
  68. SearchBox.propTypes = {
  69. //pollInterval: PropTypes.number,
  70. };
  71. SearchBox.defaultProps = {
  72. //pollInterval: 1000,
  73. };