{"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":"uSA6BA,MAuBMA,EAAaC,IAAA,IAAC,IAAEC,GAAKD,EAAA,OACzBE,YAACC,IAAY,CAACF,IAAKA,EAAKG,SAAUF,YAACG,IAAgB,CAACC,GAAE,oCAAqCC,eAAe,eAAkB,EAO9H,MAAMC,UAAkBC,IAAuBC,cAAA,SAAAC,WAAA,KAgD7CC,eAAiBC,KAAS,KACxBC,KAAKC,MAAMC,SAASC,YAAgBH,KAAKC,MAAMG,WAAW,GACzD,IAAK,CAAEC,SAAS,GAAQ,CA7B3BC,QACE,MAAM,UAAEF,EAAS,UAAEG,EAAS,SAAEL,GAAaF,KAAKC,MAE3CM,GAAWL,EAASM,YAAaJ,IACtCF,EAASO,YAAeL,GAC1B,CAEAM,oBACE,MAAQC,QAAQ,KAAEC,GAAM,UAAER,EAAS,SAAEF,GAAaF,KAAKC,MAEnDG,EACFJ,KAAKM,QAELJ,EAASW,YAAcD,GAE3B,CAEAE,mBAAoBC,GAClB,MAAQJ,QAAQ,KAAEC,GAAM,UAAER,EAAS,SAAEF,GAAaF,KAAKC,MAEnDc,EAAUX,YAAcA,GAAaA,EACvCJ,KAAKM,QACIS,EAAUJ,OAAOC,OAASA,GACnCV,EAASW,YAAcD,GAE3B,CAMAI,SACE,MAAM,UAAEZ,EAAS,WAAEa,EAAU,QAAEC,EAAO,UAAEC,EAAS,UAAEZ,EAAS,YAAEa,EAAW,UAAEC,EAAS,UAAEC,EAAS,OAAEC,EAAM,OAAEC,EAAM,UAAEC,GAAczB,KAAKC,MAEpI,IAAKM,EACH,OACEnB,YAACsC,IAAiB,CAACN,YAAaA,EAAaO,UAAU,YAI3D,IAAKV,EACH,OACE7B,YAACwC,IAAM,UACLxC,YAACyC,IAAgB,KAKvB,IAAIC,EAEJ,MAAMC,EAAkBZ,GAAaG,GAAaC,EAGhDO,EADER,EACalC,YAACG,IAAgB,CAACC,GAAE,iCAAkCC,eAAe,sBAC3E8B,EACMnC,YAAC4C,IAAkB,CAAC5B,UAAWA,IACrCe,EACM/B,YAACG,IAAgB,CAACC,GAAE,mCAAoCC,eAAe,wBAC7E+B,GAAUP,EAAWgB,UACf7C,YAACH,EAAU,CAACE,IAAKsC,IAEjBrC,YAACG,IAAgB,CAACC,GAAE,0BAA2BC,eAAe,kCAG/E,MAAMyC,EAAgBV,EAASpC,YAACH,EAAU,CAACE,IAAKsC,IAAgB,KAEhE,OACErC,YAACwC,IAAM,UACLxC,YAAC+C,IAAgB,CAACf,YAAaA,IAE/BhC,YAACgD,IAAc,CACbC,UAAU,YACVnB,SAAUa,GAAmBb,EAC7BG,UAAWA,EACXiB,WAAYtC,KAAKF,eACjByC,QAASnD,YAACoD,IAAe,CAACpC,UAAWJ,KAAKC,MAAMG,UAAWqC,UAAQ,IACnEC,eAAa,EACbC,OAAQT,EACRJ,aAAcA,EACdc,gBAAiBxB,QAAY,EAE5BW,EAAkB,GAAKd,EAAW4B,KAAIrD,GACrCJ,YAAC0D,IAAgB,CAAUtD,GAAIA,EAAIuD,UAAU,GAAtBvD,MAKjC,EA5GIE,EAEGsD,UAAY,CACjBrC,OAAQsC,IAAUC,MAAM,CACtBtC,KAAMqC,IAAUE,OAChB3D,GAAIyD,IAAUE,SACbC,WACHhD,UAAW6C,IAAUE,OACrBjD,SAAU+C,IAAUI,KAAKD,WACzBnC,WAAYqC,IAAmBC,KAC/BrC,QAAS+B,IAAUO,KACnBnC,UAAW4B,IAAUO,KACrBrC,UAAW8B,IAAUO,KACrBjD,UAAW0C,IAAUO,KACrBlC,UAAW2B,IAAUO,KACrBjC,OAAQ0B,IAAUO,KAClBhC,OAAQyB,IAAUO,KAClB/B,UAAWwB,IAAUE,OACrB/B,YAAa6B,IAAUO,MA8FZC,6BA/ISC,CAACC,EAAKC,KAAgC,IAA5BjD,QAAQ,KAAEC,EAAI,GAAEpB,IAAMoE,EACtD,MAAMxD,EAAYZ,GAAMmE,EAAME,MAAM,CAAC,eAAgBC,YAAmBlD,KAExE,OAAKR,EAME,CACLA,YACAoB,SAAWmC,EAAME,MAAM,CAAC,WAAYzD,EAAW,WAAauD,EAAME,MAAM,CAAC,WAAYzD,EAAW,cAChGqB,UAAWkC,EAAME,MAAM,CAAC,WAAYzD,EAAW,QAC/CG,YAAaoD,EAAME,MAAM,CAAC,WAAYzD,IACtCa,WAAY0C,EAAME,MAAM,CAAC,aAAc,YAAazD,EAAW,UAC/Dc,UAAWyC,EAAME,MAAM,CAAC,aAAc,YAAazD,EAAW,SAC9DiB,UAAWsC,EAAME,MAAM,CAAC,aAAc,YAAazD,EAAW,cAAc,GAC5EkB,UAAWqC,EAAME,MAAM,CAAC,WAAYzD,EAAW,cAAc,GAC7DmB,OAAQwC,YAAiBJ,EAAOvD,GAChCe,UAAWwC,EAAME,MAAM,CAAC,gBAAiBzD,EAAW,eAAe,IAf5D,CACLiB,WAAW,EAed,GA2HYoC,CAAyB/D,E","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":""}