HeaderSearchBox.js 1.8 KB

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