dd00cd19d2
So that opening a profile feels faster. Also, pinned toots are not shown before other toots have loaded. Also, if no toots are loaded, added empty message
96 lines
3.5 KiB
JavaScript
96 lines
3.5 KiB
JavaScript
import React from 'react';
|
|
import { connect } from 'react-redux';
|
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
|
import PropTypes from 'prop-types';
|
|
import { fetchAccount } from '../../actions/accounts';
|
|
import { expandAccountFeaturedTimeline, expandAccountTimeline } from '../../actions/timelines';
|
|
import StatusList from '../../components/status_list';
|
|
import LoadingIndicator from '../../components/loading_indicator';
|
|
import Column from '../ui/components/column';
|
|
import HeaderContainer from './containers/header_container';
|
|
import ColumnBackButton from '../../components/column_back_button';
|
|
import { List as ImmutableList } from 'immutable';
|
|
import ImmutablePureComponent from 'react-immutable-pure-component';
|
|
import { FormattedMessage } from 'react-intl';
|
|
|
|
const mapStateToProps = (state, { params: { accountId }, withReplies = false }) => {
|
|
const path = withReplies ? `${accountId}:with_replies` : accountId;
|
|
|
|
return {
|
|
statusIds: state.getIn(['timelines', `account:${path}`, 'items'], ImmutableList()),
|
|
featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], ImmutableList()),
|
|
isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']),
|
|
hasMore: state.getIn(['timelines', `account:${path}`, 'hasMore']),
|
|
};
|
|
};
|
|
|
|
export default @connect(mapStateToProps)
|
|
class AccountTimeline extends ImmutablePureComponent {
|
|
|
|
static propTypes = {
|
|
params: PropTypes.object.isRequired,
|
|
dispatch: PropTypes.func.isRequired,
|
|
shouldUpdateScroll: PropTypes.func,
|
|
statusIds: ImmutablePropTypes.list,
|
|
featuredStatusIds: ImmutablePropTypes.list,
|
|
isLoading: PropTypes.bool,
|
|
hasMore: PropTypes.bool,
|
|
withReplies: PropTypes.bool,
|
|
};
|
|
|
|
componentWillMount () {
|
|
const { params: { accountId }, withReplies } = this.props;
|
|
|
|
this.props.dispatch(fetchAccount(accountId));
|
|
if (!withReplies) {
|
|
this.props.dispatch(expandAccountFeaturedTimeline(accountId));
|
|
}
|
|
this.props.dispatch(expandAccountTimeline(accountId, { withReplies }));
|
|
}
|
|
|
|
componentWillReceiveProps (nextProps) {
|
|
if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) {
|
|
this.props.dispatch(fetchAccount(nextProps.params.accountId));
|
|
if (!nextProps.withReplies) {
|
|
this.props.dispatch(expandAccountFeaturedTimeline(nextProps.params.accountId));
|
|
}
|
|
this.props.dispatch(expandAccountTimeline(nextProps.params.accountId, { withReplies: nextProps.params.withReplies }));
|
|
}
|
|
}
|
|
|
|
handleLoadMore = maxId => {
|
|
this.props.dispatch(expandAccountTimeline(this.props.params.accountId, { maxId, withReplies: this.props.withReplies }));
|
|
}
|
|
|
|
render () {
|
|
const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore } = this.props;
|
|
|
|
if (!statusIds && isLoading) {
|
|
return (
|
|
<Column>
|
|
<LoadingIndicator />
|
|
</Column>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<Column>
|
|
<ColumnBackButton />
|
|
|
|
<StatusList
|
|
prepend={<HeaderContainer accountId={this.props.params.accountId} />}
|
|
alwaysPrepend
|
|
scrollKey='account_timeline'
|
|
statusIds={statusIds}
|
|
featuredStatusIds={featuredStatusIds}
|
|
isLoading={isLoading}
|
|
hasMore={hasMore}
|
|
onLoadMore={this.handleLoadMore}
|
|
shouldUpdateScroll={shouldUpdateScroll}
|
|
emptyMessage={<FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />}
|
|
/>
|
|
</Column>
|
|
);
|
|
}
|
|
|
|
}
|