{"version":3,"sources":["webpack:///./app/javascript/mastodon/features/explore/components/story.jsx","webpack:///./app/javascript/mastodon/features/explore/links.jsx","webpack:///./app/javascript/mastodon/features/explore/results.jsx","webpack:///./app/javascript/mastodon/features/explore/statuses.jsx","webpack:///./app/javascript/mastodon/features/explore/suggestions.jsx","webpack:///./app/javascript/mastodon/features/explore/tags.jsx","webpack:///./app/javascript/mastodon/features/explore/index.jsx"],"names":["Story","PureComponent","constructor","arguments","state","thumbnailLoaded","handleImageLoad","this","setState","render","expanded","url","title","lang","publisher","author","publishedAt","sharedTimes","thumbnail","thumbnailDescription","blurhash","props","_jsx","className","classNames","href","target","rel","Skeleton","width","_jsxs","_Fragment","children","RelativeTimestamp","timestamp","FormattedMessage","id","defaultMessage","values","name","ShortNumber","value","renderer","accountsCountRenderer","Blurhash","hash","src","onLoad","alt","Links","componentDidMount","dispatch","fetchTrendingLinks","isLoading","links","banner","DismissableBanner","isEmpty","LoadingIndicator","map","link","i","get","getIn","connect","messages","defineMessages","hidePeek","list","size","skipLast","Results","type","submittedType","handleSelectAll","submitSearch","handleSelectAccounts","handleSelectHashtags","handleSelectStatuses","handleLoadMoreAccounts","_loadMore","handleLoadMoreStatuses","handleLoadMoreHashtags","handleLoadMore","getDerivedStateFromProps","expandSearch","intl","q","results","hasMore","ImmutableList","filteredResults","accounts","hashtags","statuses","SearchSection","Icon","fixedWidth","onClickMore","take","Account","hashtag","Hashtag","Status","renderAccounts","renderHashtags","renderStatuses","onClick","undefined","ScrollableList","scrollKey","onLoadMore","emptyMessage","bindToDocument","Helmet","formatMessage","injectIntl","Statuses","_debounce","expandTrendingStatuses","leading","fetchTrendingStatuses","statusIds","multiColumn","StatusList","trackScroll","prepend","alwaysPrepend","timelineId","withCounters","getStatusList","Suggestions","fetchSuggestions","suggestions","suggestion","AccountCard","Tags","fetchTrendingHashtags","isLoadingHashtags","searchResults","Explore","handleHeaderClick","column","scrollTop","setRef","c","isSearching","signedIn","context","identity","Column","ref","label","ColumnHeader","icon","Search","SearchResults","NavLink","exact","to","tagName","Switch","Route","path","component","content","contextTypes","router","PropTypes","object","layout","trendsEnabled"],"mappings":"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","file":"js/features/explore-7b49f41769ef569e2e8e.chunk.js","sourcesContent":["import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { FormattedMessage } from 'react-intl';\n\nimport classNames from 'classnames';\n\nimport { Blurhash } from 'mastodon/components/blurhash';\nimport { accountsCountRenderer } from 'mastodon/components/hashtag';\nimport { RelativeTimestamp } from 'mastodon/components/relative_timestamp';\nimport { ShortNumber } from 'mastodon/components/short_number';\nimport { Skeleton } from 'mastodon/components/skeleton';\n\nexport default class Story extends PureComponent {\n\n  static propTypes = {\n    url: PropTypes.string,\n    title: PropTypes.string,\n    lang: PropTypes.string,\n    publisher: PropTypes.string,\n    publishedAt: PropTypes.string,\n    author: PropTypes.string,\n    sharedTimes: PropTypes.number,\n    thumbnail: PropTypes.string,\n    thumbnailDescription: PropTypes.string,\n    blurhash: PropTypes.string,\n    expanded: PropTypes.bool,\n  };\n\n  state = {\n    thumbnailLoaded: false,\n  };\n\n  handleImageLoad = () => this.setState({ thumbnailLoaded: true });\n\n  render () {\n    const { expanded, url, title, lang, publisher, author, publishedAt, sharedTimes, thumbnail, thumbnailDescription, blurhash } = this.props;\n\n    const { thumbnailLoaded } = this.state;\n\n    return (\n      <a className={classNames('story', { expanded })} href={url} target='blank' rel='noopener'>\n        <div className='story__details'>\n          <div className='story__details__publisher'>{publisher ? <span lang={lang}>{publisher}</span> : <Skeleton width={50} />}{publishedAt && <> · <RelativeTimestamp timestamp={publishedAt} /></>}</div>\n          <div className='story__details__title' lang={lang}>{title ? title : <Skeleton />}</div>\n          <div className='story__details__shared'>{author && <><FormattedMessage id='link_preview.author' defaultMessage='By {name}' values={{ name: <strong>{author}</strong> }} /> · </>}{typeof sharedTimes === 'number' ? <ShortNumber value={sharedTimes} renderer={accountsCountRenderer} /> : <Skeleton width={100} />}</div>\n        </div>\n\n        <div className='story__thumbnail'>\n          {thumbnail ? (\n            <>\n              <div className={classNames('story__thumbnail__preview', { 'story__thumbnail__preview--hidden': thumbnailLoaded })}><Blurhash hash={blurhash} /></div>\n              <img src={thumbnail} onLoad={this.handleImageLoad} alt={thumbnailDescription} title={thumbnailDescription} lang={lang} />\n            </>\n          ) : <Skeleton />}\n        </div>\n      </a>\n    );\n  }\n\n}\n","import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { FormattedMessage } from 'react-intl';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\n\nimport { fetchTrendingLinks } from 'mastodon/actions/trends';\nimport { DismissableBanner } from 'mastodon/components/dismissable_banner';\nimport { LoadingIndicator } from 'mastodon/components/loading_indicator';\n\nimport Story from './components/story';\n\nconst mapStateToProps = state => ({\n  links: state.getIn(['trends', 'links', 'items']),\n  isLoading: state.getIn(['trends', 'links', 'isLoading']),\n});\n\nclass Links extends PureComponent {\n\n  static propTypes = {\n    links: ImmutablePropTypes.list,\n    isLoading: PropTypes.bool,\n    dispatch: PropTypes.func.isRequired,\n  };\n\n  componentDidMount () {\n    const { dispatch } = this.props;\n    dispatch(fetchTrendingLinks());\n  }\n\n  render () {\n    const { isLoading, links } = this.props;\n\n    const banner = (\n      <DismissableBanner id='explore/links'>\n        <FormattedMessage id='dismissable_banner.explore_links' defaultMessage='These are news stories being shared the most on the social web today. Newer news stories posted by more different people are ranked higher.' />\n      </DismissableBanner>\n    );\n\n    if (!isLoading && links.isEmpty()) {\n      return (\n        <div className='explore__links scrollable scrollable--flex'>\n          {banner}\n\n          <div className='empty-column-indicator'>\n            <FormattedMessage id='empty_column.explore_statuses' defaultMessage='Nothing is trending right now. Check back later!' />\n          </div>\n        </div>\n      );\n    }\n\n    return (\n      <div className='explore__links scrollable' data-nosnippet>\n        {banner}\n\n        {isLoading ? (<LoadingIndicator />) : links.map((link, i) => (\n          <Story\n            key={link.get('id')}\n            expanded={i === 0}\n            lang={link.get('language')}\n            url={link.get('url')}\n            title={link.get('title')}\n            publisher={link.get('provider_name')}\n            publishedAt={link.get('published_at')}\n            author={link.get('author_name')}\n            sharedTimes={link.getIn(['history', 0, 'accounts']) * 1 + link.getIn(['history', 1, 'accounts']) * 1}\n            thumbnail={link.get('image')}\n            thumbnailDescription={link.get('image_description')}\n            blurhash={link.get('blurhash')}\n          />\n        ))}\n      </div>\n    );\n  }\n\n}\n\nexport default connect(mapStateToProps)(Links);\n","import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { injectIntl, defineMessages, FormattedMessage } from 'react-intl';\n\nimport { Helmet } from 'react-helmet';\n\nimport { List as ImmutableList } from 'immutable';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\n\nimport { submitSearch, expandSearch } from 'mastodon/actions/search';\nimport { ImmutableHashtag as Hashtag } from 'mastodon/components/hashtag';\nimport { Icon } from 'mastodon/components/icon';\nimport ScrollableList from 'mastodon/components/scrollable_list';\nimport Account from 'mastodon/containers/account_container';\nimport Status from 'mastodon/containers/status_container';\n\nimport { SearchSection } from './components/search_section';\n\nconst messages = defineMessages({\n  title: { id: 'search_results.title', defaultMessage: 'Search for {q}' },\n});\n\nconst mapStateToProps = state => ({\n  isLoading: state.getIn(['search', 'isLoading']),\n  results: state.getIn(['search', 'results']),\n  q: state.getIn(['search', 'searchTerm']),\n  submittedType: state.getIn(['search', 'type']),\n});\n\nconst INITIAL_PAGE_LIMIT = 10;\nconst INITIAL_DISPLAY = 4;\n\nconst hidePeek = list => {\n  if (list.size > INITIAL_PAGE_LIMIT && list.size % INITIAL_PAGE_LIMIT === 1) {\n    return list.skipLast(1);\n  } else {\n    return list;\n  }\n};\n\nconst renderAccounts = accounts => hidePeek(accounts).map(id => (\n  <Account key={id} id={id} />\n));\n\nconst renderHashtags = hashtags => hidePeek(hashtags).map(hashtag => (\n  <Hashtag key={hashtag.get('name')} hashtag={hashtag} />\n));\n\nconst renderStatuses = statuses => hidePeek(statuses).map(id => (\n  <Status key={id} id={id} />\n));\n\nclass Results extends PureComponent {\n\n  static propTypes = {\n    results: ImmutablePropTypes.contains({\n      accounts: ImmutablePropTypes.orderedSet,\n      statuses: ImmutablePropTypes.orderedSet,\n      hashtags: ImmutablePropTypes.orderedSet,\n    }),\n    isLoading: PropTypes.bool,\n    multiColumn: PropTypes.bool,\n    dispatch: PropTypes.func.isRequired,\n    q: PropTypes.string,\n    intl: PropTypes.object,\n    submittedType: PropTypes.oneOf(['accounts', 'statuses', 'hashtags']),\n  };\n\n  state = {\n    type: this.props.submittedType || 'all',\n  };\n\n  static getDerivedStateFromProps(props, state) {\n    if (props.submittedType !== state.type) {\n      return {\n        type: props.submittedType || 'all',\n      };\n    }\n\n    return null;\n  };\n\n  handleSelectAll = () => {\n    const { submittedType, dispatch } = this.props;\n\n    // If we originally searched for a specific type, we need to resubmit\n    // the query to get all types of results\n    if (submittedType) {\n      dispatch(submitSearch());\n    }\n\n    this.setState({ type: 'all' });\n  };\n\n  handleSelectAccounts = () => {\n    const { submittedType, dispatch } = this.props;\n\n    // If we originally searched for something else (but not everything),\n    // we need to resubmit the query for this specific type\n    if (submittedType !== 'accounts') {\n      dispatch(submitSearch('accounts'));\n    }\n\n    this.setState({ type: 'accounts' });\n  };\n\n  handleSelectHashtags = () => {\n    const { submittedType, dispatch } = this.props;\n\n    // If we originally searched for something else (but not everything),\n    // we need to resubmit the query for this specific type\n    if (submittedType !== 'hashtags') {\n      dispatch(submitSearch('hashtags'));\n    }\n\n    this.setState({ type: 'hashtags' });\n  }\n\n  handleSelectStatuses = () => {\n    const { submittedType, dispatch } = this.props;\n\n    // If we originally searched for something else (but not everything),\n    // we need to resubmit the query for this specific type\n    if (submittedType !== 'statuses') {\n      dispatch(submitSearch('statuses'));\n    }\n\n    this.setState({ type: 'statuses' });\n  }\n\n  handleLoadMoreAccounts = () => this._loadMore('accounts');\n  handleLoadMoreStatuses = () => this._loadMore('statuses');\n  handleLoadMoreHashtags = () => this._loadMore('hashtags');\n\n  _loadMore (type) {\n    const { dispatch } = this.props;\n    dispatch(expandSearch(type));\n  }\n\n  handleLoadMore = () => {\n    const { type } = this.state;\n\n    if (type !== 'all') {\n      this._loadMore(type);\n    }\n  };\n\n  render () {\n    const { intl, isLoading, q, results } = this.props;\n    const { type } = this.state;\n\n    // We request 1 more result than we display so we can tell if there'd be a next page\n    const hasMore = type !== 'all' ? results.get(type, ImmutableList()).size > INITIAL_PAGE_LIMIT && results.get(type).size % INITIAL_PAGE_LIMIT === 1 : false;\n\n    let filteredResults;\n\n    const accounts = results.get('accounts', ImmutableList());\n    const hashtags = results.get('hashtags', ImmutableList());\n    const statuses = results.get('statuses', ImmutableList());\n\n    switch(type) {\n    case 'all':\n      filteredResults = (accounts.size + hashtags.size + statuses.size) > 0 ? (\n        <>\n          {accounts.size > 0 && (\n            <SearchSection key='accounts' title={<><Icon id='users' fixedWidth /><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></>} onClickMore={this.handleLoadMoreAccounts}>\n              {accounts.take(INITIAL_DISPLAY).map(id => <Account key={id} id={id} />)}\n            </SearchSection>\n          )}\n\n          {hashtags.size > 0 && (\n            <SearchSection key='hashtags' title={<><Icon id='hashtag' fixedWidth /><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></>} onClickMore={this.handleLoadMoreHashtags}>\n              {hashtags.take(INITIAL_DISPLAY).map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}\n            </SearchSection>\n          )}\n\n          {statuses.size > 0 && (\n            <SearchSection key='statuses' title={<><Icon id='quote-right' fixedWidth /><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></>} onClickMore={this.handleLoadMoreStatuses}>\n              {statuses.take(INITIAL_DISPLAY).map(id => <Status key={id} id={id} />)}\n            </SearchSection>\n          )}\n        </>\n      ) : [];\n      break;\n    case 'accounts':\n      filteredResults = renderAccounts(accounts);\n      break;\n    case 'hashtags':\n      filteredResults = renderHashtags(hashtags);\n      break;\n    case 'statuses':\n      filteredResults = renderStatuses(statuses);\n      break;\n    }\n\n    return (\n      <>\n        <div className='account__section-headline'>\n          <button onClick={this.handleSelectAll} className={type === 'all' ? 'active' : undefined}><FormattedMessage id='search_results.all' defaultMessage='All' /></button>\n          <button onClick={this.handleSelectAccounts} className={type === 'accounts' ? 'active' : undefined}><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></button>\n          <button onClick={this.handleSelectHashtags} className={type === 'hashtags' ? 'active' : undefined}><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></button>\n          <button onClick={this.handleSelectStatuses} className={type === 'statuses' ? 'active' : undefined}><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></button>\n        </div>\n\n        <div className='explore__search-results' data-nosnippet>\n          <ScrollableList\n            scrollKey='search-results'\n            isLoading={isLoading}\n            onLoadMore={this.handleLoadMore}\n            hasMore={hasMore}\n            emptyMessage={<FormattedMessage id='search_results.nothing_found' defaultMessage='Could not find anything for these search terms' />}\n            bindToDocument\n          >\n            {filteredResults}\n          </ScrollableList>\n        </div>\n\n        <Helmet>\n          <title>{intl.formatMessage(messages.title, { q })}</title>\n        </Helmet>\n      </>\n    );\n  }\n\n}\n\nexport default connect(mapStateToProps)(injectIntl(Results));\n","import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { FormattedMessage } from 'react-intl';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\n\nimport { debounce } from 'lodash';\n\nimport { fetchTrendingStatuses, expandTrendingStatuses } from 'mastodon/actions/trends';\nimport { DismissableBanner } from 'mastodon/components/dismissable_banner';\nimport StatusList from 'mastodon/components/status_list';\nimport { getStatusList } from 'mastodon/selectors';\n\nconst mapStateToProps = state => ({\n  statusIds: getStatusList(state, 'trending'),\n  isLoading: state.getIn(['status_lists', 'trending', 'isLoading'], true),\n  hasMore: !!state.getIn(['status_lists', 'trending', 'next']),\n});\n\nclass Statuses extends PureComponent {\n\n  static propTypes = {\n    statusIds: ImmutablePropTypes.list,\n    isLoading: PropTypes.bool,\n    hasMore: PropTypes.bool,\n    multiColumn: PropTypes.bool,\n    dispatch: PropTypes.func.isRequired,\n  };\n\n  componentDidMount () {\n    const { dispatch } = this.props;\n    dispatch(fetchTrendingStatuses());\n  }\n\n  handleLoadMore = debounce(() => {\n    const { dispatch } = this.props;\n    dispatch(expandTrendingStatuses());\n  }, 300, { leading: true });\n\n  render () {\n    const { isLoading, hasMore, statusIds, multiColumn } = this.props;\n\n    const emptyMessage = <FormattedMessage id='empty_column.explore_statuses' defaultMessage='Nothing is trending right now. Check back later!' />;\n\n    return (\n      <StatusList\n        trackScroll\n        prepend={<DismissableBanner id='explore/statuses'><FormattedMessage id='dismissable_banner.explore_statuses' defaultMessage='These are posts from across the social web that are gaining traction today. Newer posts with more boosts and favorites are ranked higher.' /></DismissableBanner>}\n        alwaysPrepend\n        timelineId='explore'\n        statusIds={statusIds}\n        scrollKey='explore-statuses'\n        hasMore={hasMore}\n        isLoading={isLoading}\n        onLoadMore={this.handleLoadMore}\n        emptyMessage={emptyMessage}\n        bindToDocument={!multiColumn}\n        withCounters\n      />\n    );\n  }\n\n}\n\nexport default connect(mapStateToProps)(Statuses);\n","import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { FormattedMessage } from 'react-intl';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\n\nimport { fetchSuggestions } from 'mastodon/actions/suggestions';\nimport { LoadingIndicator } from 'mastodon/components/loading_indicator';\nimport AccountCard from 'mastodon/features/directory/components/account_card';\n\nconst mapStateToProps = state => ({\n  suggestions: state.getIn(['suggestions', 'items']),\n  isLoading: state.getIn(['suggestions', 'isLoading']),\n});\n\nclass Suggestions extends PureComponent {\n\n  static propTypes = {\n    isLoading: PropTypes.bool,\n    suggestions: ImmutablePropTypes.list,\n    dispatch: PropTypes.func.isRequired,\n  };\n\n  componentDidMount () {\n    const { dispatch } = this.props;\n    dispatch(fetchSuggestions(true));\n  }\n\n  render () {\n    const { isLoading, suggestions } = this.props;\n\n    if (!isLoading && suggestions.isEmpty()) {\n      return (\n        <div className='explore__suggestions scrollable scrollable--flex'>\n          <div className='empty-column-indicator'>\n            <FormattedMessage id='empty_column.explore_statuses' defaultMessage='Nothing is trending right now. Check back later!' />\n          </div>\n        </div>\n      );\n    }\n\n    return (\n      <div className='explore__suggestions scrollable' data-nosnippet>\n        {isLoading ? <LoadingIndicator /> : suggestions.map(suggestion => (\n          <AccountCard key={suggestion.get('account')} id={suggestion.get('account')} />\n        ))}\n      </div>\n    );\n  }\n\n}\n\nexport default connect(mapStateToProps)(Suggestions);\n","import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { FormattedMessage } from 'react-intl';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\n\nimport { fetchTrendingHashtags } from 'mastodon/actions/trends';\nimport { DismissableBanner } from 'mastodon/components/dismissable_banner';\nimport { ImmutableHashtag as Hashtag } from 'mastodon/components/hashtag';\nimport { LoadingIndicator } from 'mastodon/components/loading_indicator';\n\nconst mapStateToProps = state => ({\n  hashtags: state.getIn(['trends', 'tags', 'items']),\n  isLoadingHashtags: state.getIn(['trends', 'tags', 'isLoading']),\n});\n\nclass Tags extends PureComponent {\n\n  static propTypes = {\n    hashtags: ImmutablePropTypes.list,\n    isLoading: PropTypes.bool,\n    dispatch: PropTypes.func.isRequired,\n  };\n\n  componentDidMount () {\n    const { dispatch } = this.props;\n    dispatch(fetchTrendingHashtags());\n  }\n\n  render () {\n    const { isLoading, hashtags } = this.props;\n\n    const banner = (\n      <DismissableBanner id='explore/tags'>\n        <FormattedMessage id='dismissable_banner.explore_tags' defaultMessage='These are hashtags that are gaining traction on the social web today. Hashtags that are used by more different people are ranked higher.' />\n      </DismissableBanner>\n    );\n\n    if (!isLoading && hashtags.isEmpty()) {\n      return (\n        <div className='explore__links scrollable scrollable--flex'>\n          {banner}\n\n          <div className='empty-column-indicator'>\n            <FormattedMessage id='empty_column.explore_statuses' defaultMessage='Nothing is trending right now. Check back later!' />\n          </div>\n        </div>\n      );\n    }\n\n    return (\n      <div className='scrollable explore__links' data-nosnippet>\n        {banner}\n\n        {isLoading ? (<LoadingIndicator />) : hashtags.map(hashtag => (\n          <Hashtag key={hashtag.get('name')} hashtag={hashtag} />\n        ))}\n      </div>\n    );\n  }\n\n}\n\nexport default connect(mapStateToProps)(Tags);\n","import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\n\nimport { Helmet } from 'react-helmet';\nimport { NavLink, Switch, Route } from 'react-router-dom';\n\nimport { connect } from 'react-redux';\n\nimport Column from 'mastodon/components/column';\nimport ColumnHeader from 'mastodon/components/column_header';\nimport Search from 'mastodon/features/compose/containers/search_container';\nimport { trendsEnabled } from 'mastodon/initial_state';\n\nimport Links from './links';\nimport SearchResults from './results';\nimport Statuses from './statuses';\nimport Suggestions from './suggestions';\nimport Tags from './tags';\n\nconst messages = defineMessages({\n  title: { id: 'explore.title', defaultMessage: 'Explore' },\n  searchResults: { id: 'explore.search_results', defaultMessage: 'Search results' },\n});\n\nconst mapStateToProps = state => ({\n  layout: state.getIn(['meta', 'layout']),\n  isSearching: state.getIn(['search', 'submitted']) || !trendsEnabled,\n});\n\nclass Explore extends PureComponent {\n\n  static contextTypes = {\n    router: PropTypes.object,\n    identity: PropTypes.object,\n  };\n\n  static propTypes = {\n    intl: PropTypes.object.isRequired,\n    multiColumn: PropTypes.bool,\n    isSearching: PropTypes.bool,\n  };\n\n  handleHeaderClick = () => {\n    this.column.scrollTop();\n  };\n\n  setRef = c => {\n    this.column = c;\n  };\n\n  render() {\n    const { intl, multiColumn, isSearching } = this.props;\n    const { signedIn } = this.context.identity;\n\n    return (\n      <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n        <ColumnHeader\n          icon={isSearching ? 'search' : 'hashtag'}\n          title={intl.formatMessage(isSearching ? messages.searchResults : messages.title)}\n          onClick={this.handleHeaderClick}\n          multiColumn={multiColumn}\n        />\n\n        <div className='explore__search-header'>\n          <Search />\n        </div>\n\n        {isSearching ? (\n          <SearchResults />\n        ) : (\n          <>\n            <div className='account__section-headline'>\n              <NavLink exact to='/explore'>\n                <FormattedMessage tagName='div' id='explore.trending_statuses' defaultMessage='Posts' />\n              </NavLink>\n\n              <NavLink exact to='/explore/tags'>\n                <FormattedMessage tagName='div' id='explore.trending_tags' defaultMessage='Hashtags' />\n              </NavLink>\n\n              {signedIn && (\n                <NavLink exact to='/explore/suggestions'>\n                  <FormattedMessage tagName='div' id='explore.suggested_follows' defaultMessage='People' />\n                </NavLink>\n              )}\n\n              <NavLink exact to='/explore/links'>\n                <FormattedMessage tagName='div' id='explore.trending_links' defaultMessage='News' />\n              </NavLink>\n            </div>\n\n            <Switch>\n              <Route path='/explore/tags' component={Tags} />\n              <Route path='/explore/links' component={Links} />\n              <Route path='/explore/suggestions' component={Suggestions} />\n              <Route exact path={['/explore', '/explore/posts', '/search']}>\n                <Statuses multiColumn={multiColumn} />\n              </Route>\n            </Switch>\n\n            <Helmet>\n              <title>{intl.formatMessage(messages.title)}</title>\n              <meta name='robots' content={isSearching ? 'noindex' : 'all'} />\n            </Helmet>\n          </>\n        )}\n      </Column>\n    );\n  }\n\n}\n\nexport default connect(mapStateToProps)(injectIntl(Explore));\n"],"sourceRoot":""}