2020-03-27 13:59:38 -07:00
import React from 'react' ;
import { connect } from 'react-redux' ;
import { defineMessages , injectIntl , FormattedMessage } from 'react-intl' ;
import PropTypes from 'prop-types' ;
import StatusListContainer from '../ui/containers/status_list_container' ;
import Column from '../../components/column' ;
import ColumnSettingsContainer from './containers/column_settings_container' ;
import HomeColumnHeader from '../../components/home_column_header' ;
import ExplanationBox from '../ui/components/explanation_box' ;
2020-04-14 13:45:38 -07:00
import { expandPublicTimeline } from '../../actions/timelines' ;
import { connectPublicStream } from '../../actions/streaming' ;
2020-03-27 13:59:38 -07:00
import { Link } from 'react-router-dom' ;
2020-05-28 15:52:07 -07:00
import { getSettings } from 'soapbox/actions/settings' ;
2020-03-27 13:59:38 -07:00
const messages = defineMessages ( {
title : { id : 'column.public' , defaultMessage : 'Federated timeline' } ,
} ) ;
const mapStateToProps = state => {
2020-04-28 11:49:39 -07:00
const onlyMedia = getSettings ( state ) . getIn ( [ 'public' , 'other' , 'onlyMedia' ] ) ;
2020-03-27 13:59:38 -07:00
const timelineId = 'public' ;
return {
timelineId ,
onlyMedia ,
hasUnread : state . getIn ( [ 'timelines' , ` ${ timelineId } ${ onlyMedia ? ':media' : '' } ` , 'unread' ] ) > 0 ,
2020-04-01 13:31:40 -07:00
siteTitle : state . getIn ( [ 'instance' , 'title' ] ) ,
2020-03-27 13:59:38 -07:00
} ;
} ;
export default @ connect ( mapStateToProps )
@ injectIntl
class CommunityTimeline extends React . PureComponent {
static contextTypes = {
router : PropTypes . object ,
} ;
static propTypes = {
dispatch : PropTypes . func . isRequired ,
intl : PropTypes . object . isRequired ,
hasUnread : PropTypes . bool ,
onlyMedia : PropTypes . bool ,
timelineId : PropTypes . string ,
2020-04-14 14:37:17 -07:00
siteTitle : PropTypes . string ,
2020-03-27 13:59:38 -07:00
} ;
2020-04-14 14:47:35 -07:00
componentDidMount ( ) {
2020-03-27 13:59:38 -07:00
const { dispatch , onlyMedia } = this . props ;
dispatch ( expandPublicTimeline ( { onlyMedia } ) ) ;
this . disconnect = dispatch ( connectPublicStream ( { onlyMedia } ) ) ;
}
2020-04-14 14:47:35 -07:00
componentDidUpdate ( prevProps ) {
2020-03-27 13:59:38 -07:00
if ( prevProps . onlyMedia !== this . props . onlyMedia ) {
const { dispatch , onlyMedia } = this . props ;
this . disconnect ( ) ;
dispatch ( expandPublicTimeline ( { onlyMedia } ) ) ;
this . disconnect = dispatch ( connectPublicStream ( { onlyMedia } ) ) ;
}
}
2020-04-14 14:47:35 -07:00
componentWillUnmount ( ) {
2020-03-27 13:59:38 -07:00
if ( this . disconnect ) {
this . disconnect ( ) ;
this . disconnect = null ;
}
}
handleLoadMore = maxId => {
const { dispatch , onlyMedia } = this . props ;
dispatch ( expandPublicTimeline ( { maxId , onlyMedia } ) ) ;
}
2020-04-14 14:47:35 -07:00
render ( ) {
2020-04-01 13:31:40 -07:00
const { intl , hasUnread , onlyMedia , timelineId , siteTitle } = this . props ;
2020-03-27 13:59:38 -07:00
return (
< Column label = { intl . formatMessage ( messages . title ) } >
< HomeColumnHeader activeItem = 'fediverse' active = { hasUnread } >
< ColumnSettingsContainer / >
< / H o m e C o l u m n H e a d e r >
< ExplanationBox
title = { < FormattedMessage id = 'fediverse_tab.explanation_box.title' defaultMessage = 'What is the Fediverse?' / > }
2020-04-14 11:44:40 -07:00
explanation = { < FormattedMessage id = 'fediverse_tab.explanation_box.explanation' defaultMessage = '{site_title} is part of the Fediverse, a social network made up of thousands of independent social media sites (aka "servers"). The posts you see here are from 3rd-party servers. You have the freedom to engage with them, or to block any server you don't like. Pay attention to the full username after the second @ symbol to know which server a post is from. To see only {site_title} posts, visit {local}.' values = { { site _title : siteTitle , local : < Link to = '/timeline/local' > < FormattedMessage id = 'empty_column.home.local_tab' defaultMessage = 'the {site_title} tab' values = { { site _title : siteTitle } } / > < /Link> }} / > }
2020-03-27 13:59:38 -07:00
/ >
< StatusListContainer
scrollKey = { ` ${ timelineId } _timeline ` }
timelineId = { ` ${ timelineId } ${ onlyMedia ? ':media' : '' } ` }
onLoadMore = { this . handleLoadMore }
emptyMessage = { < FormattedMessage id = 'empty_column.public' defaultMessage = 'There is nothing here! Write something publicly, or manually follow users from other servers to fill it up' / > }
/ >
< / C o l u m n >
) ;
}
}