{"version":3,"sources":["webpack:///./app/javascript/mastodon/features/followers/index.jsx"],"names":["RemoteHint","_ref2","url","_jsx","TimelineHint","resource","FormattedMessage","id","defaultMessage","Followers","ImmutablePureComponent","constructor","arguments","handleLoadMore","_debounce","this","props","dispatch","expandFollowers","accountId","leading","_load","isAccount","fetchAccount","fetchFollowers","componentDidMount","params","acct","lookupAccount","componentDidUpdate","prevProps","render","accountIds","hasMore","blockedBy","multiColumn","isLoading","suspended","hidden","remote","remoteUrl","BundleColumnError","errorType","Column","LoadingIndicator","emptyMessage","forceEmptyState","LimitedAccountHint","isEmpty","remoteMessage","ColumnBackButton","ScrollableList","scrollKey","onLoadMore","prepend","HeaderContainer","hideTabs","alwaysPrepend","append","bindToDocument","map","AccountContainer","withNote","propTypes","PropTypes","shape","string","isRequired","func","ImmutablePropTypes","list","bool","connect","mapStateToProps","state","_ref","getIn","normalizeForLookup","getAccountHidden"],"mappings":"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","file":"js/features/followers-e1dc58dd486ffd103882.chunk.js","sourcesContent":["import PropTypes from 'prop-types';\n\nimport { FormattedMessage } from 'react-intl';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { connect } from 'react-redux';\n\nimport { debounce } from 'lodash';\n\nimport { TimelineHint } from 'mastodon/components/timeline_hint';\nimport BundleColumnError from 'mastodon/features/ui/components/bundle_column_error';\nimport { normalizeForLookup } from 'mastodon/reducers/accounts_map';\nimport { getAccountHidden } from 'mastodon/selectors';\n\nimport {\n  lookupAccount,\n  fetchAccount,\n  fetchFollowers,\n  expandFollowers,\n} from '../../actions/accounts';\nimport ColumnBackButton from '../../components/column_back_button';\nimport { LoadingIndicator } from '../../components/loading_indicator';\nimport ScrollableList from '../../components/scrollable_list';\nimport AccountContainer from '../../containers/account_container';\nimport LimitedAccountHint from '../account_timeline/components/limited_account_hint';\nimport HeaderContainer from '../account_timeline/containers/header_container';\nimport Column from '../ui/components/column';\n\nconst mapStateToProps = (state, { params: { acct, id } }) => {\n  const accountId = id || state.getIn(['accounts_map', normalizeForLookup(acct)]);\n\n  if (!accountId) {\n    return {\n      isLoading: true,\n    };\n  }\n\n  return {\n    accountId,\n    remote: !!(state.getIn(['accounts', accountId, 'acct']) !== state.getIn(['accounts', accountId, 'username'])),\n    remoteUrl: state.getIn(['accounts', accountId, 'url']),\n    isAccount: !!state.getIn(['accounts', accountId]),\n    accountIds: state.getIn(['user_lists', 'followers', accountId, 'items']),\n    hasMore: !!state.getIn(['user_lists', 'followers', accountId, 'next']),\n    isLoading: state.getIn(['user_lists', 'followers', accountId, 'isLoading'], true),\n    suspended: state.getIn(['accounts', accountId, 'suspended'], false),\n    hidden: getAccountHidden(state, accountId),\n    blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false),\n  };\n};\n\nconst RemoteHint = ({ url }) => (\n  <TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.followers' defaultMessage='Followers' />} />\n);\n\nRemoteHint.propTypes = {\n  url: PropTypes.string.isRequired,\n};\n\nclass Followers extends ImmutablePureComponent {\n\n  static propTypes = {\n    params: PropTypes.shape({\n      acct: PropTypes.string,\n      id: PropTypes.string,\n    }).isRequired,\n    accountId: PropTypes.string,\n    dispatch: PropTypes.func.isRequired,\n    accountIds: ImmutablePropTypes.list,\n    hasMore: PropTypes.bool,\n    isLoading: PropTypes.bool,\n    blockedBy: PropTypes.bool,\n    isAccount: PropTypes.bool,\n    suspended: PropTypes.bool,\n    hidden: PropTypes.bool,\n    remote: PropTypes.bool,\n    remoteUrl: PropTypes.string,\n    multiColumn: PropTypes.bool,\n  };\n\n  _load () {\n    const { accountId, isAccount, dispatch } = this.props;\n\n    if (!isAccount) dispatch(fetchAccount(accountId));\n    dispatch(fetchFollowers(accountId));\n  }\n\n  componentDidMount () {\n    const { params: { acct }, accountId, dispatch } = this.props;\n\n    if (accountId) {\n      this._load();\n    } else {\n      dispatch(lookupAccount(acct));\n    }\n  }\n\n  componentDidUpdate (prevProps) {\n    const { params: { acct }, accountId, dispatch } = this.props;\n\n    if (prevProps.accountId !== accountId && accountId) {\n      this._load();\n    } else if (prevProps.params.acct !== acct) {\n      dispatch(lookupAccount(acct));\n    }\n  }\n\n  handleLoadMore = debounce(() => {\n    this.props.dispatch(expandFollowers(this.props.accountId));\n  }, 300, { leading: true });\n\n  render () {\n    const { accountId, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, suspended, hidden, remote, remoteUrl } = this.props;\n\n    if (!isAccount) {\n      return (\n        <BundleColumnError multiColumn={multiColumn} errorType='routing' />\n      );\n    }\n\n    if (!accountIds) {\n      return (\n        <Column>\n          <LoadingIndicator />\n        </Column>\n      );\n    }\n\n    let emptyMessage;\n\n    const forceEmptyState = blockedBy || suspended || hidden;\n\n    if (suspended) {\n      emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />;\n    } else if (hidden) {\n      emptyMessage = <LimitedAccountHint accountId={accountId} />;\n    } else if (blockedBy) {\n      emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;\n    } else if (remote && accountIds.isEmpty()) {\n      emptyMessage = <RemoteHint url={remoteUrl} />;\n    } else {\n      emptyMessage = <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;\n    }\n\n    const remoteMessage = remote ? <RemoteHint url={remoteUrl} /> : null;\n\n    return (\n      <Column>\n        <ColumnBackButton multiColumn={multiColumn} />\n\n        <ScrollableList\n          scrollKey='followers'\n          hasMore={!forceEmptyState && hasMore}\n          isLoading={isLoading}\n          onLoadMore={this.handleLoadMore}\n          prepend={<HeaderContainer accountId={this.props.accountId} hideTabs />}\n          alwaysPrepend\n          append={remoteMessage}\n          emptyMessage={emptyMessage}\n          bindToDocument={!multiColumn}\n        >\n          {forceEmptyState ? [] : accountIds.map(id =>\n            <AccountContainer key={id} id={id} withNote={false} />,\n          )}\n        </ScrollableList>\n      </Column>\n    );\n  }\n\n}\n\nexport default connect(mapStateToProps)(Followers);\n"],"sourceRoot":""}