HeaderSearchBox.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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.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. axios.get('/_api/search', {params: {q: keyword}})
  36. .then((res) => {
  37. if (res.data.ok) {
  38. this.setState({
  39. searchingKeyword: keyword,
  40. searchedPages: res.data.data,
  41. searching: false,
  42. searchError: null,
  43. });
  44. } else {
  45. this.setState({
  46. searchError: res,
  47. searching: false,
  48. });
  49. }
  50. // TODO error
  51. }).catch((res) => {
  52. // TODO error
  53. this.setState({
  54. searchError: res,
  55. searching: false,
  56. });
  57. });
  58. }
  59. render() {
  60. return (
  61. <div className="search-box">
  62. <SearchForm
  63. onSearchFormChanged={this.search}
  64. isShown={this.isShown}
  65. />
  66. <SearchSuggest
  67. searchingKeyword={this.state.searchingKeyword}
  68. searchedPages={this.state.searchedPages}
  69. searchError={this.state.searchError}
  70. searching={this.state.searching}
  71. focused={this.state.focused}
  72. />
  73. </div>
  74. );
  75. }
  76. }
  77. SearchBox.propTypes = {
  78. //pollInterval: React.PropTypes.number,
  79. };
  80. SearchBox.defaultProps = {
  81. //pollInterval: 1000,
  82. };