2017-05-03 02:04:16 +02:00
import React from 'react' ;
2018-05-27 21:45:30 +02:00
import PropTypes from 'prop-types' ;
2017-03-31 19:59:54 +02:00
import ImmutablePropTypes from 'react-immutable-proptypes' ;
2018-05-27 21:45:30 +02:00
import { FormattedMessage , FormattedNumber } from 'react-intl' ;
2017-03-31 19:59:54 +02:00
import AccountContainer from '../../../containers/account_container' ;
import StatusContainer from '../../../containers/status_container' ;
2017-10-08 02:55:58 +02:00
import { Link } from 'react-router-dom' ;
2017-05-03 02:04:16 +02:00
import ImmutablePureComponent from 'react-immutable-pure-component' ;
2018-05-27 21:45:30 +02:00
import { Sparklines , SparklinesCurve } from 'react-sparklines' ;
const shortNumberFormat = number => {
if ( number < 1000 ) {
return < FormattedNumber value = { number } / > ;
} else {
return < React . Fragment > < FormattedNumber value = { number / 1000 } maximumFractionDigits = { 1 } / > K < / R e a c t . F r a g m e n t > ;
}
} ;
2017-03-31 19:59:54 +02:00
2017-06-23 19:36:54 +02:00
export default class SearchResults extends ImmutablePureComponent {
2017-03-31 19:59:54 +02:00
2017-05-12 14:44:10 +02:00
static propTypes = {
2017-05-20 17:31:47 +02:00
results : ImmutablePropTypes . map . isRequired ,
2018-05-27 21:45:30 +02:00
trends : ImmutablePropTypes . list ,
fetchTrends : PropTypes . func . isRequired ,
2017-05-12 14:44:10 +02:00
} ;
2018-05-27 21:45:30 +02:00
componentDidMount ( ) {
const { fetchTrends } = this . props ;
fetchTrends ( ) ;
}
2017-03-31 19:59:54 +02:00
render ( ) {
2018-05-27 21:45:30 +02:00
const { results , trends } = this . props ;
2017-03-31 19:59:54 +02:00
let accounts , statuses , hashtags ;
let count = 0 ;
2018-05-27 21:45:30 +02:00
if ( results . isEmpty ( ) ) {
return (
< div className = 'search-results' >
< div className = 'trends' >
< div className = 'trends__header' >
< i className = 'fa fa-fire fa-fw' / >
< FormattedMessage id = 'trends.header' defaultMessage = 'Trending now' / >
< / d i v >
{ trends && trends . map ( hashtag => (
< div className = 'trends__item' key = { hashtag . get ( 'name' ) } >
< div className = 'trends__item__name' >
< Link to = { ` /timelines/tag/ ${ hashtag . get ( 'name' ) } ` } >
# < span > { hashtag . get ( 'name' ) } < / s p a n >
< / L i n k >
< 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> }} / >
< / d i v >
< div className = 'trends__item__current' >
{ shortNumberFormat ( hashtag . getIn ( [ 'history' , 0 , 'uses' ] ) ) }
< / d i v >
< div className = 'trends__item__sparkline' >
< Sparklines width = { 50 } height = { 28 } data = { hashtag . get ( 'history' ) . reverse ( ) . map ( day => day . get ( 'uses' ) ) . toArray ( ) } >
< SparklinesCurve style = { { fill : 'none' } } / >
< / S p a r k l i n e s >
< / d i v >
< / d i v >
) ) }
< / d i v >
< / d i v >
) ;
}
2017-03-31 19:59:54 +02:00
if ( results . get ( 'accounts' ) && results . get ( 'accounts' ) . size > 0 ) {
count += results . get ( 'accounts' ) . size ;
accounts = (
< div className = 'search-results__section' >
2018-02-09 23:04:47 +01:00
< h5 > < FormattedMessage id = 'search_results.accounts' defaultMessage = 'People' / > < / h 5 >
2017-03-31 19:59:54 +02:00
{ results . get ( 'accounts' ) . map ( accountId => < AccountContainer key = { accountId } id = { accountId } / > ) }
< / d i v >
) ;
}
if ( results . get ( 'statuses' ) && results . get ( 'statuses' ) . size > 0 ) {
count += results . get ( 'statuses' ) . size ;
statuses = (
< div className = 'search-results__section' >
2018-02-09 23:04:47 +01:00
< h5 > < FormattedMessage id = 'search_results.statuses' defaultMessage = 'Toots' / > < / h 5 >
2017-03-31 19:59:54 +02:00
{ results . get ( 'statuses' ) . map ( statusId => < StatusContainer key = { statusId } id = { statusId } / > ) }
< / d i v >
) ;
}
if ( results . get ( 'hashtags' ) && results . get ( 'hashtags' ) . size > 0 ) {
count += results . get ( 'hashtags' ) . size ;
hashtags = (
< div className = 'search-results__section' >
2018-02-09 23:04:47 +01:00
< h5 > < FormattedMessage id = 'search_results.hashtags' defaultMessage = 'Hashtags' / > < / h 5 >
2018-01-17 16:57:15 +01:00
{ results . get ( 'hashtags' ) . map ( hashtag => (
2017-06-06 13:19:29 +02:00
< Link key = { hashtag } className = 'search-results__hashtag' to = { ` /timelines/tag/ ${ hashtag } ` } >
2018-05-27 21:45:30 +02:00
{ hashtag }
2017-03-31 19:59:54 +02:00
< / L i n k >
2018-01-17 16:57:15 +01:00
) ) }
2017-03-31 19:59:54 +02:00
< / d i v >
) ;
}
return (
< div className = 'search-results' >
< div className = 'search-results__header' >
2018-05-27 21:45:30 +02:00
< i className = 'fa fa-search fa-fw' / >
2017-04-19 16:40:24 +02:00
< FormattedMessage id = 'search_results.total' defaultMessage = '{count, number} {count, plural, one {result} other {results}}' values = { { count } } / >
2017-03-31 19:59:54 +02:00
< / d i v >
{ accounts }
{ statuses }
{ hashtags }
< / d i v >
) ;
}
2017-04-21 20:05:35 +02:00
}