2017-05-03 09:04:16 +09:00
import React from 'react' ;
2018-05-28 04:45:30 +09:00
import PropTypes from 'prop-types' ;
2017-04-01 02:59:54 +09:00
import ImmutablePropTypes from 'react-immutable-proptypes' ;
2018-05-28 04:45:30 +09:00
import { FormattedMessage , FormattedNumber } from 'react-intl' ;
2017-04-01 02:59:54 +09:00
import AccountContainer from '../../../containers/account_container' ;
import StatusContainer from '../../../containers/status_container' ;
2017-10-08 09:55:58 +09:00
import { Link } from 'react-router-dom' ;
2017-05-03 09:04:16 +09:00
import ImmutablePureComponent from 'react-immutable-pure-component' ;
2018-05-28 04:45:30 +09: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-04-01 02:59:54 +09:00
2018-05-29 09:01:24 +09:00
const renderHashtag = 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 >
) ;
2017-06-24 02:36:54 +09:00
export default class SearchResults extends ImmutablePureComponent {
2017-04-01 02:59:54 +09:00
2017-05-12 21:44:10 +09:00
static propTypes = {
2017-05-21 00:31:47 +09:00
results : ImmutablePropTypes . map . isRequired ,
2018-05-28 04:45:30 +09:00
trends : ImmutablePropTypes . list ,
fetchTrends : PropTypes . func . isRequired ,
2017-05-12 21:44:10 +09:00
} ;
2018-05-28 04:45:30 +09:00
componentDidMount ( ) {
const { fetchTrends } = this . props ;
fetchTrends ( ) ;
}
2017-04-01 02:59:54 +09:00
render ( ) {
2018-05-28 04:45:30 +09:00
const { results , trends } = this . props ;
2017-04-01 02:59:54 +09:00
let accounts , statuses , hashtags ;
let count = 0 ;
2018-05-28 04:45:30 +09: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 >
2018-05-29 09:01:24 +09:00
{ trends && trends . map ( hashtag => renderHashtag ( hashtag ) ) }
2018-05-28 04:45:30 +09:00
< / d i v >
< / d i v >
) ;
}
2017-04-01 02:59:54 +09:00
if ( results . get ( 'accounts' ) && results . get ( 'accounts' ) . size > 0 ) {
count += results . get ( 'accounts' ) . size ;
accounts = (
< div className = 'search-results__section' >
2018-05-29 09:01:24 +09:00
< h5 > < i className = 'fa fa-fw fa-users' / > < FormattedMessage id = 'search_results.accounts' defaultMessage = 'People' / > < / h 5 >
2018-02-10 07:04:47 +09:00
2017-04-01 02:59:54 +09: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-05-29 09:01:24 +09:00
< h5 > < i className = 'fa fa-fw fa-quote-right' / > < FormattedMessage id = 'search_results.statuses' defaultMessage = 'Toots' / > < / h 5 >
2018-02-10 07:04:47 +09:00
2017-04-01 02:59:54 +09: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-05-29 09:01:24 +09:00
< h5 > < i className = 'fa fa-fw fa-hashtag' / > < FormattedMessage id = 'search_results.hashtags' defaultMessage = 'Hashtags' / > < / h 5 >
2018-02-10 07:04:47 +09:00
2018-05-29 09:01:24 +09:00
{ results . get ( 'hashtags' ) . map ( hashtag => renderHashtag ( hashtag ) ) }
2017-04-01 02:59:54 +09:00
< / d i v >
) ;
}
return (
< div className = 'search-results' >
< div className = 'search-results__header' >
2018-05-28 04:45:30 +09:00
< i className = 'fa fa-search fa-fw' / >
2017-04-19 23:40:24 +09:00
< FormattedMessage id = 'search_results.total' defaultMessage = '{count, number} {count, plural, one {result} other {results}}' values = { { count } } / >
2017-04-01 02:59:54 +09:00
< / d i v >
{ accounts }
{ statuses }
{ hashtags }
< / d i v >
) ;
}
2017-04-22 03:05:35 +09:00
}