import React from 'react'; import { connect } from 'react-redux'; import ImmutablePureComponent from 'react-immutable-pure-component'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { debounce } from 'lodash'; import LoadingIndicator from '../../components/loading_indicator'; import { fetchAccount, fetchFollowers, expandFollowers, fetchAccountByUsername, } from '../../actions/accounts'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import AccountContainer from '../../containers/account_container'; import Column from '../ui/components/column'; import ScrollableList from '../../components/scrollable_list'; import MissingIndicator from 'soapbox/components/missing_indicator'; import { getFollowDifference } from 'soapbox/utils/accounts'; import { findAccountByUsername } from 'soapbox/selectors'; const messages = defineMessages({ heading: { id: 'column.followers', defaultMessage: 'Followers' }, }); const mapStateToProps = (state, { params, withReplies = false }) => { const username = params.username || ''; const me = state.get('me'); const accountFetchError = ((state.getIn(['accounts', -1, 'username']) || '').toLowerCase() === username.toLowerCase()); let accountId = -1; if (accountFetchError) { accountId = null; } else { const account = findAccountByUsername(state, username); accountId = account ? account.getIn(['id'], null) : -1; } const diffCount = getFollowDifference(state, accountId, 'followers'); const isBlocked = state.getIn(['relationships', accountId, 'blocked_by'], false); const unavailable = (me === accountId) ? false : isBlocked; return { accountId, unavailable, isAccount: !!state.getIn(['accounts', accountId]), accountIds: state.getIn(['user_lists', 'followers', accountId, 'items']), hasMore: !!state.getIn(['user_lists', 'followers', accountId, 'next']), diffCount, }; }; export default @connect(mapStateToProps) @injectIntl class Followers extends ImmutablePureComponent { static propTypes = { intl: PropTypes.object.isRequired, params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, accountIds: ImmutablePropTypes.orderedSet, hasMore: PropTypes.bool, diffCount: PropTypes.number, isAccount: PropTypes.bool, unavailable: PropTypes.bool, }; componentDidMount() { const { params: { username }, accountId } = this.props; if (accountId && accountId !== -1) { this.props.dispatch(fetchAccount(accountId)); this.props.dispatch(fetchFollowers(accountId)); } else { this.props.dispatch(fetchAccountByUsername(username)); } } componentDidUpdate(prevProps) { const { accountId, dispatch } = this.props; if (accountId && accountId !== -1 && (accountId !== prevProps.accountId && accountId)) { dispatch(fetchAccount(accountId)); dispatch(fetchFollowers(accountId)); } } handleLoadMore = debounce(() => { if (this.props.accountId && this.props.accountId !== -1) { this.props.dispatch(expandFollowers(this.props.accountId)); } }, 300, { leading: true }); render() { const { intl, accountIds, hasMore, diffCount, isAccount, accountId, unavailable } = this.props; if (!isAccount && accountId !== -1) { return ( ); } if (accountId === -1 || (!accountIds)) { return ( ); } if (unavailable) { return (
); } return ( } > {accountIds.map(id => , )} ); } }