SearchPage.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // This is the root component for #search-page
  2. import React from 'react';
  3. import SearchForm from './SearchForm';
  4. import SearchResult from './SearchResult';
  5. import axios from 'axios'
  6. export default class SearchPage extends React.Component {
  7. constructor(props) {
  8. super(props);
  9. this.state = {
  10. location: location,
  11. searchingKeyword: this.props.query.q || '',
  12. searchedPages: [],
  13. searchError: null,
  14. }
  15. this.search = this.search.bind(this);
  16. }
  17. componentDidMount() {
  18. if (this.state.searchingKeyword !== '') {
  19. this.search({keyword: this.state.searchingKeyword});
  20. this.setState({searchedKeyword: this.state.keyword});
  21. }
  22. }
  23. static getQueryByLocation(location) {
  24. let search = location.search || '';
  25. let query = {};
  26. search.replace(/^\?/, '').split('&').forEach(function(element) {
  27. let queryParts = element.split('=');
  28. query[queryParts[0]] = decodeURIComponent(queryParts[1]).replace(/\+/g, ' ');
  29. });
  30. return query;
  31. }
  32. search(data) {
  33. const keyword = data.keyword;
  34. if (keyword === '') {
  35. this.setState({
  36. searchingKeyword: '',
  37. searchedPages: [],
  38. });
  39. return true;
  40. }
  41. this.setState({
  42. searchingKeyword: keyword,
  43. });
  44. axios.get('/_api/search', {params: {q: keyword}})
  45. .then((res) => {
  46. if (res.data.ok) {
  47. this.setState({
  48. searchingKeyword: keyword,
  49. searchedPages: res.data.data,
  50. });
  51. }
  52. // TODO error
  53. })
  54. .catch((res) => {
  55. // TODO error
  56. });
  57. };
  58. render() {
  59. return (
  60. <div>
  61. <div className="header-wrap">
  62. <header>
  63. <SearchForm
  64. onSearchFormChanged={this.search}
  65. keyword={this.state.searchingKeyword}
  66. />
  67. </header>
  68. </div>
  69. <SearchResult
  70. pages={this.state.searchedPages}
  71. searchingKeyword={this.state.searchingKeyword}
  72. />
  73. </div>
  74. );
  75. }
  76. }
  77. SearchPage.propTypes = {
  78. query: React.PropTypes.object,
  79. };
  80. SearchPage.defaultProps = {
  81. //pollInterval: 1000,
  82. query: SearchPage.getQueryByLocation(location || {}),
  83. };