You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
4.3 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import ImmutablePropTypes from 'react-immutable-proptypes';
  4. import { FormattedMessage, FormattedNumber } from 'react-intl';
  5. import AccountContainer from '../../../containers/account_container';
  6. import StatusContainer from '../../../containers/status_container';
  7. import { Link } from 'react-router-dom';
  8. import ImmutablePureComponent from 'react-immutable-pure-component';
  9. import { Sparklines, SparklinesCurve } from 'react-sparklines';
  10. const shortNumberFormat = number => {
  11. if (number < 1000) {
  12. return <FormattedNumber value={number} />;
  13. } else {
  14. return <React.Fragment><FormattedNumber value={number / 1000} maximumFractionDigits={1} />K</React.Fragment>;
  15. }
  16. };
  17. export default class SearchResults extends ImmutablePureComponent {
  18. static propTypes = {
  19. results: ImmutablePropTypes.map.isRequired,
  20. trends: ImmutablePropTypes.list,
  21. fetchTrends: PropTypes.func.isRequired,
  22. };
  23. componentDidMount () {
  24. const { fetchTrends } = this.props;
  25. fetchTrends();
  26. }
  27. render () {
  28. const { results, trends } = this.props;
  29. let accounts, statuses, hashtags;
  30. let count = 0;
  31. if (results.isEmpty()) {
  32. return (
  33. <div className='search-results'>
  34. <div className='trends'>
  35. <div className='trends__header'>
  36. <i className='fa fa-fire fa-fw' />
  37. <FormattedMessage id='trends.header' defaultMessage='Trending now' />
  38. </div>
  39. {trends && trends.map(hashtag => (
  40. <div className='trends__item' key={hashtag.get('name')}>
  41. <div className='trends__item__name'>
  42. <Link to={`/timelines/tag/${hashtag.get('name')}`}>
  43. #<span>{hashtag.get('name')}</span>
  44. </Link>
  45. <FormattedMessage id='trends.count_by_accounts' defaultMessage='{count} {rawCount, plural, one {person} other {people}} talking' values={{ rawCount: hashtag.getIn(['history', 0, 'accounts']), count: <strong>{shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']))}</strong> }} />
  46. </div>
  47. <div className='trends__item__current'>
  48. {shortNumberFormat(hashtag.getIn(['history', 0, 'uses']))}
  49. </div>
  50. <div className='trends__item__sparkline'>
  51. <Sparklines width={50} height={28} data={hashtag.get('history').reverse().map(day => day.get('uses')).toArray()}>
  52. <SparklinesCurve style={{ fill: 'none' }} />
  53. </Sparklines>
  54. </div>
  55. </div>
  56. ))}
  57. </div>
  58. </div>
  59. );
  60. }
  61. if (results.get('accounts') && results.get('accounts').size > 0) {
  62. count += results.get('accounts').size;
  63. accounts = (
  64. <div className='search-results__section'>
  65. <h5><FormattedMessage id='search_results.accounts' defaultMessage='People' /></h5>
  66. {results.get('accounts').map(accountId => <AccountContainer key={accountId} id={accountId} />)}
  67. </div>
  68. );
  69. }
  70. if (results.get('statuses') && results.get('statuses').size > 0) {
  71. count += results.get('statuses').size;
  72. statuses = (
  73. <div className='search-results__section'>
  74. <h5><FormattedMessage id='search_results.statuses' defaultMessage='Toots' /></h5>
  75. {results.get('statuses').map(statusId => <StatusContainer key={statusId} id={statusId} />)}
  76. </div>
  77. );
  78. }
  79. if (results.get('hashtags') && results.get('hashtags').size > 0) {
  80. count += results.get('hashtags').size;
  81. hashtags = (
  82. <div className='search-results__section'>
  83. <h5><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></h5>
  84. {results.get('hashtags').map(hashtag => (
  85. <Link key={hashtag} className='search-results__hashtag' to={`/timelines/tag/${hashtag}`}>
  86. {hashtag}
  87. </Link>
  88. ))}
  89. </div>
  90. );
  91. }
  92. return (
  93. <div className='search-results'>
  94. <div className='search-results__header'>
  95. <i className='fa fa-search fa-fw' />
  96. <FormattedMessage id='search_results.total' defaultMessage='{count, number} {count, plural, one {result} other {results}}' values={{ count }} />
  97. </div>
  98. {accounts}
  99. {statuses}
  100. {hashtags}
  101. </div>
  102. );
  103. }
  104. }