{"version":3,"sources":["webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/features/hashtag_timeline/components/hashtag_header.jsx","webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.jsx","webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/features/hashtag_timeline/containers/column_settings_container.js","webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/features/hashtag_timeline/index.jsx"],"names":["messages","defineMessages","followHashtag","id","defaultMessage","unfollowHashtag","usesRenderer","displayNumber","pluralReady","_jsx","FormattedMessage","values","count","counter","peopleRenderer","usesTodayRenderer","HashtagHeader","injectIntl","_ref","tag","intl","disabled","onClick","uses","people","get","reduce","arr","day","dividingCircle","className","Button","text","formatMessage","ShortNumber","value","renderer","getIn","placeholder","noOptions","ColumnSettings","PureComponent","constructor","arguments","_defineProperty","open","this","hasTags","mode","oldValue","tags","length","maxFeedHashtags","props","onChange","state","setState","map","includes","settings","toJS","modeSelect","modeLabel","NonceProvider","nonce","document","querySelector","content","cacheKey","AsyncSelect","isMulti","autoFocus","onSelect","loadOptions","onLoad","classNamePrefix","name","noOptionsMessage","render","SettingToggle","settingPath","label","Toggle","onToggle","checked","connect","mapStateToProps","columnId","columns","index","findIndex","c","api","params","q","type","then","response","data","hashtags","mapDispatchToProps","dispatch","_ref2","key","changeColumnParams","HashtagTimeline","removeColumn","addColumn","title","additionalFor","push","additional","join","dir","moveColumn","column","scrollTop","maxId","local","expandHashtagTimeline","signedIn","identity","_subscribe","undefined","any","all","none","disconnects","connectHashtagStream","status","filter","_unsubscribe","disconnect","_unload","clearTimeline","_load","fetchHashtag","componentDidMount","componentDidUpdate","prevProps","_isEqual","componentWillUnmount","hasUnread","multiColumn","pinned","_jsxs","Column","bindToDocument","ref","setRef","children","ColumnHeader","icon","iconComponent","TagIcon","active","onPin","handlePin","onMove","handleMove","handleHeaderClick","showBackButton","ColumnSettingsContainer","StatusListContainer","prepend","handleFollow","alwaysPrepend","trackScroll","scrollKey","timelineId","onLoadMore","handleLoadMore","emptyMessage","Helmet","withIdentity"],"mappings":"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","file":"js/flavours/glitch/async/hashtag_timeline-38042414d55d8c783566.chunk.js","sourcesContent":["import PropTypes from 'prop-types';\n\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\n\nimport { Button } from 'flavours/glitch/components/button';\nimport { ShortNumber } from 'flavours/glitch/components/short_number';\n\nconst messages = defineMessages({\n  followHashtag: { id: 'hashtag.follow', defaultMessage: 'Follow hashtag' },\n  unfollowHashtag: { id: 'hashtag.unfollow', defaultMessage: 'Unfollow hashtag' },\n});\n\nconst usesRenderer = (displayNumber, pluralReady) => (\n  <FormattedMessage\n    id='hashtag.counter_by_uses'\n    defaultMessage='{count, plural, one {{counter} post} other {{counter} posts}}'\n    values={{\n      count: pluralReady,\n      counter: <strong>{displayNumber}</strong>,\n    }}\n  />\n);\n\nconst peopleRenderer = (displayNumber, pluralReady) => (\n  <FormattedMessage\n    id='hashtag.counter_by_accounts'\n    defaultMessage='{count, plural, one {{counter} participant} other {{counter} participants}}'\n    values={{\n      count: pluralReady,\n      counter: <strong>{displayNumber}</strong>,\n    }}\n  />\n);\n\nconst usesTodayRenderer = (displayNumber, pluralReady) => (\n  <FormattedMessage\n    id='hashtag.counter_by_uses_today'\n    defaultMessage='{count, plural, one {{counter} post} other {{counter} posts}} today'\n    values={{\n      count: pluralReady,\n      counter: <strong>{displayNumber}</strong>,\n    }}\n  />\n);\n\nexport const HashtagHeader = injectIntl(({ tag, intl, disabled, onClick }) => {\n  if (!tag) {\n    return null;\n  }\n\n  const [uses, people] = tag.get('history').reduce((arr, day) => [arr[0] + day.get('uses') * 1, arr[1] + day.get('accounts') * 1], [0, 0]);\n  const dividingCircle = <span aria-hidden>{' · '}</span>;\n\n  return (\n    <div className='hashtag-header'>\n      <div className='hashtag-header__header'>\n        <h1>#{tag.get('name')}</h1>\n        <Button onClick={onClick} text={intl.formatMessage(tag.get('following') ? messages.unfollowHashtag : messages.followHashtag)} disabled={disabled} />\n      </div>\n\n      <div>\n        <ShortNumber value={uses} renderer={usesRenderer} />\n        {dividingCircle}\n        <ShortNumber value={people} renderer={peopleRenderer} />\n        {dividingCircle}\n        <ShortNumber value={tag.getIn(['history', 0, 'uses']) * 1} renderer={usesTodayRenderer} />\n      </div>\n    </div>\n  );\n});\n\nHashtagHeader.propTypes = {\n  tag: ImmutablePropTypes.map,\n  disabled: PropTypes.bool,\n  onClick: PropTypes.func,\n  intl: PropTypes.object,\n};","import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\n\nimport { NonceProvider } from 'react-select';\nimport AsyncSelect from 'react-select/async';\nimport Toggle from 'react-toggle';\n\nimport { maxFeedHashtags } from 'flavours/glitch/initial_state';\n\nimport SettingToggle from '../../notifications/components/setting_toggle';\n\nconst messages = defineMessages({\n  placeholder: { id: 'hashtag.column_settings.select.placeholder', defaultMessage: 'Enter hashtags…' },\n  noOptions: { id: 'hashtag.column_settings.select.no_options_message', defaultMessage: 'No suggestions found' },\n});\n\nclass ColumnSettings extends PureComponent {\n\n  static propTypes = {\n    settings: ImmutablePropTypes.map.isRequired,\n    onChange: PropTypes.func.isRequired,\n    onLoad: PropTypes.func.isRequired,\n    intl: PropTypes.object.isRequired,\n  };\n\n  state = {\n    open: this.hasTags(),\n  };\n\n  hasTags () {\n    return ['all', 'any', 'none'].map(mode => this.tags(mode).length > 0).includes(true);\n  }\n\n  tags (mode) {\n    let tags = this.props.settings.getIn(['tags', mode]) || [];\n\n    if (tags.toJS) {\n      return tags.toJS();\n    } else {\n      return tags;\n    }\n  }\n\n  onSelect = mode => value => {\n    const oldValue = this.tags(mode);\n\n    // Prevent changes that add more than the number of configured\n    // tags, but allow removing tags that were already added before\n    if ((value.length > maxFeedHashtags) && !(value < oldValue)) {\n      return;\n    }\n\n    this.props.onChange(['tags', mode], value);\n  };\n\n  onToggle = () => {\n    if (this.state.open && this.hasTags()) {\n      this.props.onChange('tags', {});\n    }\n\n    this.setState({ open: !this.state.open });\n  };\n\n  noOptionsMessage = () => this.props.intl.formatMessage(messages.noOptions);\n\n  modeSelect (mode) {\n    return (\n      <div className='column-settings__row'>\n        <span className='column-settings__section'>\n          {this.modeLabel(mode)}\n        </span>\n\n        <NonceProvider nonce={document.querySelector('meta[name=style-nonce]').content} cacheKey='tags'>\n          <AsyncSelect\n            isMulti\n            autoFocus\n            value={this.tags(mode)}\n            onChange={this.onSelect(mode)}\n            loadOptions={this.props.onLoad}\n            className='column-select__container'\n            classNamePrefix='column-select'\n            name='tags'\n            placeholder={this.props.intl.formatMessage(messages.placeholder)}\n            noOptionsMessage={this.noOptionsMessage}\n          />\n        </NonceProvider>\n      </div>\n    );\n  }\n\n  modeLabel (mode) {\n    switch(mode) {\n    case 'any':\n      return <FormattedMessage id='hashtag.column_settings.tag_mode.any' defaultMessage='Any of these' />;\n    case 'all':\n      return <FormattedMessage id='hashtag.column_settings.tag_mode.all' defaultMessage='All of these' />;\n    case 'none':\n      return <FormattedMessage id='hashtag.column_settings.tag_mode.none' defaultMessage='None of these' />;\n    default:\n      return '';\n    }\n  }\n\n  render () {\n    const { settings, onChange } = this.props;\n\n    return (\n      <div className='column-settings'>\n        <section>\n          <div className='column-settings__row'>\n            <SettingToggle settings={settings} settingPath={['local']} onChange={onChange} label={<FormattedMessage id='community.column_settings.local_only' defaultMessage='Local only' />} />\n\n            <div className='setting-toggle'>\n              <Toggle id='hashtag.column_settings.tag_toggle' onChange={this.onToggle} checked={this.state.open} />\n\n              <span className='setting-toggle__label'>\n                <FormattedMessage id='hashtag.column_settings.tag_toggle' defaultMessage='Include additional tags in this column' />\n              </span>\n            </div>\n          </div>\n\n          {this.state.open && (\n            <div className='column-settings__hashtags'>\n              {this.modeSelect('any')}\n              {this.modeSelect('all')}\n              {this.modeSelect('none')}\n            </div>\n          )}\n        </section>\n      </div>\n    );\n  }\n\n}\n\nexport default injectIntl(ColumnSettings);\n","import { connect } from 'react-redux';\n\nimport { changeColumnParams } from '../../../actions/columns';\nimport api from '../../../api';\nimport ColumnSettings from '../components/column_settings';\n\nconst mapStateToProps = (state, { columnId }) => {\n  const columns = state.getIn(['settings', 'columns']);\n  const index   = columns.findIndex(c => c.get('uuid') === columnId);\n\n  if (!(columnId && index >= 0)) {\n    return {};\n  }\n\n  return {\n    settings: columns.get(index).get('params'),\n    onLoad (value) {\n      return api().get('/api/v2/search', { params: { q: value, type: 'hashtags' } }).then(response => {\n        return (response.data.hashtags || []).map((tag) => {\n          return { value: tag.name, label: `#${tag.name}` };\n        });\n      });\n    },\n  };\n};\n\nconst mapDispatchToProps = (dispatch, { columnId }) => ({\n  onChange (key, value) {\n    dispatch(changeColumnParams(columnId, key, value));\n  },\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);\n","import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { FormattedMessage } from 'react-intl';\n\nimport { Helmet } from 'react-helmet';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\n\nimport { isEqual } from 'lodash';\n\nimport TagIcon from '@/material-icons/400-24px/tag.svg?react';\nimport { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';\nimport { connectHashtagStream } from 'flavours/glitch/actions/streaming';\nimport { fetchHashtag, followHashtag, unfollowHashtag } from 'flavours/glitch/actions/tags';\nimport { expandHashtagTimeline, clearTimeline } from 'flavours/glitch/actions/timelines';\nimport Column from 'flavours/glitch/components/column';\nimport ColumnHeader from 'flavours/glitch/components/column_header';\nimport { identityContextPropShape, withIdentity } from 'flavours/glitch/identity_context';\n\nimport StatusListContainer from '../ui/containers/status_list_container';\n\nimport { HashtagHeader } from './components/hashtag_header';\nimport ColumnSettingsContainer from './containers/column_settings_container';\n\nconst mapStateToProps = (state, props) => ({\n  hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}${props.params.local ? ':local' : ''}`, 'unread']) > 0,\n  tag: state.getIn(['tags', props.params.id]),\n});\n\nclass HashtagTimeline extends PureComponent {\n  disconnects = [];\n\n  static propTypes = {\n    identity: identityContextPropShape,\n    params: PropTypes.object.isRequired,\n    columnId: PropTypes.string,\n    dispatch: PropTypes.func.isRequired,\n    hasUnread: PropTypes.bool,\n    tag: ImmutablePropTypes.map,\n    multiColumn: PropTypes.bool,\n  };\n\n  handlePin = () => {\n    const { columnId, dispatch } = this.props;\n\n    if (columnId) {\n      dispatch(removeColumn(columnId));\n    } else {\n      dispatch(addColumn('HASHTAG', { id: this.props.params.id }));\n    }\n  };\n\n  title = () => {\n    const { id } = this.props.params;\n    const title  = [id];\n\n    if (this.additionalFor('any')) {\n      title.push(' ', <FormattedMessage key='any' id='hashtag.column_header.tag_mode.any'  values={{ additional: this.additionalFor('any') }} defaultMessage='or {additional}' />);\n    }\n\n    if (this.additionalFor('all')) {\n      title.push(' ', <FormattedMessage key='all' id='hashtag.column_header.tag_mode.all'  values={{ additional: this.additionalFor('all') }} defaultMessage='and {additional}' />);\n    }\n\n    if (this.additionalFor('none')) {\n      title.push(' ', <FormattedMessage key='none' id='hashtag.column_header.tag_mode.none' values={{ additional: this.additionalFor('none') }} defaultMessage='without {additional}' />);\n    }\n\n    return title;\n  };\n\n  additionalFor = (mode) => {\n    const { tags } = this.props.params;\n\n    if (tags && (tags[mode] || []).length > 0) {\n      return tags[mode].map(tag => tag.value).join('/');\n    } else {\n      return '';\n    }\n  };\n\n  handleMove = (dir) => {\n    const { columnId, dispatch } = this.props;\n    dispatch(moveColumn(columnId, dir));\n  };\n\n  handleHeaderClick = () => {\n    this.column.scrollTop();\n  };\n\n  _subscribe (dispatch, id, tags = {}, local) {\n    const { signedIn } = this.props.identity;\n\n    if (!signedIn) {\n      return;\n    }\n\n    let any  = (tags.any || []).map(tag => tag.value);\n    let all  = (tags.all || []).map(tag => tag.value);\n    let none = (tags.none || []).map(tag => tag.value);\n\n    [id, ...any].map(tag => {\n      this.disconnects.push(dispatch(connectHashtagStream(id, tag, local, status => {\n        let tags = status.tags.map(tag => tag.name);\n\n        return all.filter(tag => tags.includes(tag)).length === all.length &&\n               none.filter(tag => tags.includes(tag)).length === 0;\n      })));\n    });\n  }\n\n  _unsubscribe () {\n    this.disconnects.map(disconnect => disconnect());\n    this.disconnects = [];\n  }\n\n  _unload () {\n    const { dispatch } = this.props;\n    const { id, local } = this.props.params;\n\n    this._unsubscribe();\n    dispatch(clearTimeline(`hashtag:${id}${local ? ':local' : ''}`));\n  }\n\n  _load() {\n    const { dispatch } = this.props;\n    const { id, tags, local } = this.props.params;\n\n    this._subscribe(dispatch, id, tags, local);\n    dispatch(expandHashtagTimeline(id, { tags, local }));\n    dispatch(fetchHashtag(id));\n  }\n\n  componentDidMount () {\n    this._load();\n  }\n\n  componentDidUpdate (prevProps) {\n    const { params } = this.props;\n    const { id, tags, local } = prevProps.params;\n\n    if (id !== params.id || !isEqual(tags, params.tags) || !isEqual(local, params.local)) {\n      this._unload();\n      this._load();\n    }\n  }\n\n  componentWillUnmount () {\n    this._unsubscribe();\n  }\n\n  setRef = c => {\n    this.column = c;\n  };\n\n  handleLoadMore = maxId => {\n    const { dispatch, params } = this.props;\n    const { id, tags, local }  = params;\n\n    dispatch(expandHashtagTimeline(id, { maxId, tags, local }));\n  };\n\n  handleFollow = () => {\n    const { dispatch, params, tag } = this.props;\n    const { id } = params;\n    const { signedIn } = this.props.identity;\n\n    if (!signedIn) {\n      return;\n    }\n\n    if (tag.get('following')) {\n      dispatch(unfollowHashtag(id));\n    } else {\n      dispatch(followHashtag(id));\n    }\n  };\n\n  render () {\n    const { hasUnread, columnId, multiColumn, tag } = this.props;\n    const { id, local } = this.props.params;\n    const pinned = !!columnId;\n    const { signedIn } = this.props.identity;\n\n    return (\n      <Column bindToDocument={!multiColumn} ref={this.setRef} label={`#${id}`}>\n        <ColumnHeader\n          icon='hashtag'\n          iconComponent={TagIcon}\n          active={hasUnread}\n          title={this.title()}\n          onPin={this.handlePin}\n          onMove={this.handleMove}\n          onClick={this.handleHeaderClick}\n          pinned={pinned}\n          multiColumn={multiColumn}\n          showBackButton\n        >\n          {columnId && <ColumnSettingsContainer columnId={columnId} />}\n        </ColumnHeader>\n\n        <StatusListContainer\n          prepend={pinned ? null : <HashtagHeader tag={tag} disabled={!signedIn} onClick={this.handleFollow} />}\n          alwaysPrepend\n          trackScroll={!pinned}\n          scrollKey={`hashtag_timeline-${columnId}`}\n          timelineId={`hashtag:${id}${local ? ':local' : ''}`}\n          onLoadMore={this.handleLoadMore}\n          emptyMessage={<FormattedMessage id='empty_column.hashtag' defaultMessage='There is nothing in this hashtag yet.' />}\n          bindToDocument={!multiColumn}\n        />\n\n        <Helmet>\n          <title>#{id}</title>\n          <meta name='robots' content='noindex' />\n        </Helmet>\n      </Column>\n    );\n  }\n\n}\n\nexport default connect(mapStateToProps)(withIdentity(HashtagTimeline));\n"],"sourceRoot":""}