SearchPage.js 2.4 KB

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