diff options
Diffstat (limited to 'app/javascript/mastodon/features/followers/index.js')
-rw-r--r-- | app/javascript/mastodon/features/followers/index.js | 170 |
1 files changed, 0 insertions, 170 deletions
diff --git a/app/javascript/mastodon/features/followers/index.js b/app/javascript/mastodon/features/followers/index.js deleted file mode 100644 index 277eb702f..000000000 --- a/app/javascript/mastodon/features/followers/index.js +++ /dev/null @@ -1,170 +0,0 @@ -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 { - lookupAccount, - fetchAccount, - fetchFollowers, - expandFollowers, -} from '../../actions/accounts'; -import { FormattedMessage } from 'react-intl'; -import AccountContainer from '../../containers/account_container'; -import Column from '../ui/components/column'; -import HeaderContainer from '../account_timeline/containers/header_container'; -import ColumnBackButton from '../../components/column_back_button'; -import ScrollableList from '../../components/scrollable_list'; -import MissingIndicator from 'mastodon/components/missing_indicator'; -import TimelineHint from 'mastodon/components/timeline_hint'; -import LimitedAccountHint from '../account_timeline/components/limited_account_hint'; -import { getAccountHidden } from 'mastodon/selectors'; -import { normalizeForLookup } from 'mastodon/reducers/accounts_map'; - -const mapStateToProps = (state, { params: { acct, id } }) => { - const accountId = id || state.getIn(['accounts_map', normalizeForLookup(acct)]); - - if (!accountId) { - return { - isLoading: true, - }; - } - - return { - accountId, - remote: !!(state.getIn(['accounts', accountId, 'acct']) !== state.getIn(['accounts', accountId, 'username'])), - remoteUrl: state.getIn(['accounts', accountId, 'url']), - isAccount: !!state.getIn(['accounts', accountId]), - accountIds: state.getIn(['user_lists', 'followers', accountId, 'items']), - hasMore: !!state.getIn(['user_lists', 'followers', accountId, 'next']), - isLoading: state.getIn(['user_lists', 'followers', accountId, 'isLoading'], true), - suspended: state.getIn(['accounts', accountId, 'suspended'], false), - hidden: getAccountHidden(state, accountId), - blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false), - }; -}; - -const RemoteHint = ({ url }) => ( - <TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.followers' defaultMessage='Followers' />} /> -); - -RemoteHint.propTypes = { - url: PropTypes.string.isRequired, -}; - -export default @connect(mapStateToProps) -class Followers extends ImmutablePureComponent { - - static propTypes = { - params: PropTypes.shape({ - acct: PropTypes.string, - id: PropTypes.string, - }).isRequired, - accountId: PropTypes.string, - dispatch: PropTypes.func.isRequired, - accountIds: ImmutablePropTypes.list, - hasMore: PropTypes.bool, - isLoading: PropTypes.bool, - blockedBy: PropTypes.bool, - isAccount: PropTypes.bool, - suspended: PropTypes.bool, - hidden: PropTypes.bool, - remote: PropTypes.bool, - remoteUrl: PropTypes.string, - multiColumn: PropTypes.bool, - }; - - _load () { - const { accountId, isAccount, dispatch } = this.props; - - if (!isAccount) dispatch(fetchAccount(accountId)); - dispatch(fetchFollowers(accountId)); - } - - componentDidMount () { - const { params: { acct }, accountId, dispatch } = this.props; - - if (accountId) { - this._load(); - } else { - dispatch(lookupAccount(acct)); - } - } - - componentDidUpdate (prevProps) { - const { params: { acct }, accountId, dispatch } = this.props; - - if (prevProps.accountId !== accountId && accountId) { - this._load(); - } else if (prevProps.params.acct !== acct) { - dispatch(lookupAccount(acct)); - } - } - - handleLoadMore = debounce(() => { - this.props.dispatch(expandFollowers(this.props.accountId)); - }, 300, { leading: true }); - - render () { - const { accountId, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, suspended, hidden, remote, remoteUrl } = this.props; - - if (!isAccount) { - return ( - <Column> - <MissingIndicator /> - </Column> - ); - } - - if (!accountIds) { - return ( - <Column> - <LoadingIndicator /> - </Column> - ); - } - - let emptyMessage; - - const forceEmptyState = blockedBy || suspended || hidden; - - if (suspended) { - emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />; - } else if (hidden) { - emptyMessage = <LimitedAccountHint accountId={accountId} />; - } else if (blockedBy) { - emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />; - } else if (remote && accountIds.isEmpty()) { - emptyMessage = <RemoteHint url={remoteUrl} />; - } else { - emptyMessage = <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />; - } - - const remoteMessage = remote ? <RemoteHint url={remoteUrl} /> : null; - - return ( - <Column> - <ColumnBackButton multiColumn={multiColumn} /> - - <ScrollableList - scrollKey='followers' - hasMore={!forceEmptyState && hasMore} - isLoading={isLoading} - onLoadMore={this.handleLoadMore} - prepend={<HeaderContainer accountId={this.props.accountId} hideTabs />} - alwaysPrepend - append={remoteMessage} - emptyMessage={emptyMessage} - bindToDocument={!multiColumn} - > - {forceEmptyState ? [] : accountIds.map(id => - <AccountContainer key={id} id={id} withNote={false} />, - )} - </ScrollableList> - </Column> - ); - } - -} |