MastoFE: Bundle 2020-01-20
[akkoma] / priv / static / packs / flavours / glitch / async / hashtag_timeline.js.map
index b5ae9f62f842c9761c8992bde3ba1b7d43f7162f..602538af9c7b48095dcf5cac8516d3d3c45a3b28 100644 (file)
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/flavours/glitch/features/hashtag_timeline/containers/column_settings_container.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/flavours/glitch/features/hashtag_timeline/index.js"],"names":["ColumnSettings","injectIntl","open","_this","hasTags","mode","value","props","onChange","state","setState","_this2","this","map","tags","length","includes","settings","getIn","toJSON","modeSelect","Object","jsx","className","modeLabel","Async_default","a","isMulti","autoFocus","settingPath","onSelect","loadOptions","onLoad","classNamePrefix","name","index_es","id","defaultMessage","render","component_default","onToggle","checked","React","PureComponent","connect","_ref","columnId","columns","index","findIndex","c","get","dispatch","_ref2","key","changeColumnParams","api","params","q","then","response","data","hashtags","tag","label","HashtagTimeline","hasUnread","_this$props","removeColumn","addColumn","title","additionalFor","push","values","additional","join","dir","_this$props2","moveColumn","column","scrollTop","maxId","_this$props$params","expandHashtagTimeline","_subscribe","any","all","none","concat","disconnects","connectHashtagStream","status","filter","_unsubscribe","disconnect","componentDidMount","_this$props$params2","componentWillReceiveProps","nextProps","_this$props3","_nextProps$params","isEqual_default","clearTimeline","componentWillUnmount","_this$props4","multiColumn","pinned","react_default","createElement","ref","setRef","column_header","icon","active","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","showBackButton","column_settings_container","status_list_container","trackScroll","scrollKey","timelineId","onLoadMore","handleLoadMore","emptyMessage"],"mappings":"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","file":"flavours/glitch/async/hashtag_timeline.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { injectIntl, FormattedMessage } from 'react-intl';\nimport Toggle from 'react-toggle';\nimport AsyncSelect from 'react-select/lib/Async';\n\n@injectIntl\nexport default class ColumnSettings extends React.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    if (tags.toJSON) {\n      return tags.toJSON();\n    } else {\n      return tags;\n    }\n  };\n\n  onSelect = (mode) => {\n    return (value) => {\n      this.props.onChange(['tags', mode], value);\n    };\n  };\n\n  onToggle = () => {\n    if (this.state.open && this.hasTags()) {\n      this.props.onChange('tags', {});\n    }\n    this.setState({ open: !this.state.open });\n  };\n\n  modeSelect (mode) {\n    return (\n      <div className='column-settings__section'>\n        {this.modeLabel(mode)}\n        <AsyncSelect\n          isMulti\n          autoFocus\n          value={this.tags(mode)}\n          settings={this.props.settings}\n          settingPath={['tags', mode]}\n          onChange={this.onSelect(mode)}\n          loadOptions={this.props.onLoad}\n          classNamePrefix='column-settings__hashtag-select'\n          name='tags'\n        />\n      </div>\n    );\n  }\n\n  modeLabel (mode) {\n    switch(mode) {\n    case 'any':  return <FormattedMessage id='hashtag.column_settings.tag_mode.any' defaultMessage='Any of these' />;\n    case 'all':  return <FormattedMessage id='hashtag.column_settings.tag_mode.all' defaultMessage='All of these' />;\n    case 'none': return <FormattedMessage id='hashtag.column_settings.tag_mode.none' defaultMessage='None of these' />;\n    }\n    return '';\n  };\n\n  render () {\n    return (\n      <div>\n        <div className='column-settings__row'>\n          <div className='setting-toggle'>\n            <Toggle\n              id='hashtag.column_settings.tag_toggle'\n              onChange={this.onToggle}\n              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        {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      </div>\n    );\n  }\n\n}\n","import { connect } from 'react-redux';\nimport ColumnSettings from '../components/column_settings';\nimport { changeColumnParams } from 'flavours/glitch/actions/columns';\nimport api from 'flavours/glitch/util/api';\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 { settings: columns.get(index).get('params') };\n};\n\nconst mapDispatchToProps = (dispatch, { columnId }) => ({\n  onChange (key, value) {\n    dispatch(changeColumnParams(columnId, key, value));\n  },\n\n  onLoad (value) {\n    return api().get('/api/v2/search', { params: { q: value } }).then(response => {\n      return (response.data.hashtags || []).map((tag) => {\n        return { value: tag.name, label: `#${tag.name}` };\n      });\n    });\n  },\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';\nimport Column from 'flavours/glitch/components/column';\nimport ColumnHeader from 'flavours/glitch/components/column_header';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport { expandHashtagTimeline, clearTimeline } from 'flavours/glitch/actions/timelines';\nimport { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';\nimport { FormattedMessage } from 'react-intl';\nimport { connectHashtagStream } from 'flavours/glitch/actions/streaming';\nimport { isEqual } from 'lodash';\n\nconst mapStateToProps = (state, props) => ({\n  hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}`, 'unread']) > 0,\n});\n\n@connect(mapStateToProps)\nexport default class HashtagTimeline extends React.PureComponent {\n\n  disconnects = [];\n\n  static propTypes = {\n    params: PropTypes.object.isRequired,\n    columnId: PropTypes.string,\n    dispatch: PropTypes.func.isRequired,\n    hasUnread: PropTypes.bool,\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    let title = [this.props.params.id];\n    if (this.additionalFor('any')) {\n      title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.any'  values={{ additional: this.additionalFor('any') }} defaultMessage='or {additional}' />);\n    }\n    if (this.additionalFor('all')) {\n      title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.all'  values={{ additional: this.additionalFor('all') }} defaultMessage='and {additional}' />);\n    }\n    if (this.additionalFor('none')) {\n      title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.none' values={{ additional: this.additionalFor('none') }} defaultMessage='without {additional}' />);\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 = {}) {\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, (status) => {\n        let tags = status.tags.map(tag => tag.name);\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  componentDidMount () {\n    const { dispatch } = this.props;\n    const { id, tags } = this.props.params;\n\n    dispatch(expandHashtagTimeline(id, { tags }));\n  }\n\n  componentWillReceiveProps (nextProps) {\n    const { dispatch, params } = this.props;\n    const { id, tags } = nextProps.params;\n    if (id !== params.id || !isEqual(tags, params.tags)) {\n      this._unsubscribe();\n      this._subscribe(dispatch, id, tags);\n      this.props.dispatch(clearTimeline(`hashtag:${id}`));\n      this.props.dispatch(expandHashtagTimeline(id, { tags }));\n    }\n  }\n\n  componentWillUnmount () {\n    this._unsubscribe();\n  }\n\n  setRef = c => {\n    this.column = c;\n  }\n\n  handleLoadMore = maxId => {\n    const { id, tags } = this.props.params;\n    this.props.dispatch(expandHashtagTimeline(id, { maxId, tags }));\n  }\n\n  render () {\n    const { hasUnread, columnId, multiColumn } = this.props;\n    const { id } = this.props.params;\n    const pinned = !!columnId;\n\n    return (\n      <Column ref={this.setRef} name='hashtag' label={`#${id}`}>\n        <ColumnHeader\n          icon='hashtag'\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          trackScroll={!pinned}\n          scrollKey={`hashtag_timeline-${columnId}`}\n          timelineId={`hashtag:${id}`}\n          onLoadMore={this.handleLoadMore}\n          emptyMessage={<FormattedMessage id='empty_column.hashtag' defaultMessage='There is nothing in this hashtag yet.' />}\n        />\n      </Column>\n    );\n  }\n\n}\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/hashtag_timeline/containers/column_settings_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/hashtag_timeline/index.js"],"names":["messages","defineMessages","placeholder","noOptions","ColumnSettings","injectIntl","open","hasTags","mode","value","props","onChange","state","setState","intl","formatMessage","map","tags","length","includes","this","settings","getIn","toJSON","modeSelect","className","modeLabel","isMulti","autoFocus","onSelect","loadOptions","onLoad","classNamePrefix","name","noOptionsMessage","id","defaultMessage","render","onToggle","checked","React","PureComponent","connect","columnId","columns","index","findIndex","c","get","dispatch","key","changeColumnParams","api","params","q","type","then","response","data","hashtags","tag","label","HashtagTimeline","hasUnread","removeColumn","addColumn","title","additionalFor","push","values","additional","join","dir","moveColumn","column","scrollTop","maxId","expandHashtagTimeline","_subscribe","any","all","none","disconnects","connectHashtagStream","status","filter","_unsubscribe","disconnect","componentDidMount","componentWillReceiveProps","nextProps","clearTimeline","componentWillUnmount","multiColumn","pinned","ref","setRef","icon","active","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","showBackButton","bindToDocument","trackScroll","scrollKey","timelineId","onLoadMore","handleLoadMore","emptyMessage"],"mappings":"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","file":"flavours/glitch/async/hashtag_timeline.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport Toggle from 'react-toggle';\nimport AsyncSelect from 'react-select/async';\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\nexport default @injectIntl\nclass ColumnSettings extends React.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.toJSON) {\n      return tags.toJSON();\n    } else {\n      return tags;\n    }\n  };\n\n  onSelect = mode => value => this.props.onChange(['tags', mode], value);\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        <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      </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    return (\n      <div>\n        <div className='column-settings__row'>\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      </div>\n    );\n  }\n\n}\n","import { connect } from 'react-redux';\nimport ColumnSettings from '../components/column_settings';\nimport { changeColumnParams } from 'flavours/glitch/actions/columns';\nimport api from 'flavours/glitch/util/api';\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 { settings: columns.get(index).get('params') };\n};\n\nconst mapDispatchToProps = (dispatch, { columnId }) => ({\n  onChange (key, value) {\n    dispatch(changeColumnParams(columnId, key, value));\n  },\n\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\nexport default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container';\nimport Column from 'flavours/glitch/components/column';\nimport ColumnHeader from 'flavours/glitch/components/column_header';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport { expandHashtagTimeline, clearTimeline } from 'flavours/glitch/actions/timelines';\nimport { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns';\nimport { FormattedMessage } from 'react-intl';\nimport { connectHashtagStream } from 'flavours/glitch/actions/streaming';\nimport { isEqual } from 'lodash';\n\nconst mapStateToProps = (state, props) => ({\n  hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}`, 'unread']) > 0,\n});\n\nexport default @connect(mapStateToProps)\nclass HashtagTimeline extends React.PureComponent {\n\n  disconnects = [];\n\n  static propTypes = {\n    params: PropTypes.object.isRequired,\n    columnId: PropTypes.string,\n    dispatch: PropTypes.func.isRequired,\n    hasUnread: PropTypes.bool,\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    let title = [this.props.params.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 = {}) {\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, 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  componentDidMount () {\n    const { dispatch } = this.props;\n    const { id, tags } = this.props.params;\n\n    this._subscribe(dispatch, id, tags);\n    dispatch(expandHashtagTimeline(id, { tags }));\n  }\n\n  componentWillReceiveProps (nextProps) {\n    const { dispatch, params } = this.props;\n    const { id, tags } = nextProps.params;\n\n    if (id !== params.id || !isEqual(tags, params.tags)) {\n      this._unsubscribe();\n      this._subscribe(dispatch, id, tags);\n      this.props.dispatch(clearTimeline(`hashtag:${id}`));\n      this.props.dispatch(expandHashtagTimeline(id, { tags }));\n    }\n  }\n\n  componentWillUnmount () {\n    this._unsubscribe();\n  }\n\n  setRef = c => {\n    this.column = c;\n  }\n\n  handleLoadMore = maxId => {\n    const { id, tags } = this.props.params;\n    this.props.dispatch(expandHashtagTimeline(id, { maxId, tags }));\n  }\n\n  render () {\n    const { hasUnread, columnId, multiColumn } = this.props;\n    const { id } = this.props.params;\n    const pinned = !!columnId;\n\n    return (\n      <Column ref={this.setRef} name='hashtag' label={`#${id}`}>\n        <ColumnHeader\n          icon='hashtag'\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          bindToDocument={!multiColumn}\n        >\n          {columnId && <ColumnSettingsContainer columnId={columnId} />}\n        </ColumnHeader>\n\n        <StatusListContainer\n          trackScroll={!pinned}\n          scrollKey={`hashtag_timeline-${columnId}`}\n          timelineId={`hashtag:${id}`}\n          onLoadMore={this.handleLoadMore}\n          emptyMessage={<FormattedMessage id='empty_column.hashtag' defaultMessage='There is nothing in this hashtag yet.' />}\n          bindToDocument={!multiColumn}\n        />\n      </Column>\n    );\n  }\n\n}\n"],"sourceRoot":""}
\ No newline at end of file