{"version":3,"sources":["webpack:///./app/javascript/mastodon/features/getting_started/components/announcements.jsx","webpack:///./app/javascript/mastodon/features/getting_started/containers/announcements_container.js","webpack:///./app/javascript/mastodon/features/home_timeline/components/column_settings.tsx","webpack:///./app/javascript/mastodon/features/home_timeline/components/critical_update_banner.tsx","webpack:///./app/javascript/mastodon/features/home_timeline/index.jsx"],"names":["messages","defineMessages","close","id","defaultMessage","previous","next","ContentWithRouter","ImmutablePureComponent","constructor","arguments","_defineProperty","c","this","node","mention","e","props","history","button","ctrlKey","metaKey","preventDefault","push","get","hashtag","replace","status","getIn","_ref","currentTarget","autoPlayGif","emojis","querySelectorAll","i","length","emoji","src","getAttribute","_ref2","componentDidMount","_updateLinks","componentDidUpdate","links","link","classList","contains","add","announcement","find","item","href","addEventListener","onMentionClick","bind","setAttribute","textContent","previousSibling","onHashtagClick","text","onStatusClick","render","_jsx","className","ref","setRef","dangerouslySetInnerHTML","__html","onMouseEnter","handleMouseEnter","onMouseLeave","handleMouseLeave","ImmutablePropTypes","map","isRequired","WithRouterPropTypes","Content","withRouter","Emoji","PureComponent","emojiMap","hovered","unicodeMapping","filename","shortCode","title","_jsx2","draggable","alt","assetHost","Reaction","reaction","announcementId","addReaction","removeReaction","setState","classNames","active","onClick","handleClick","style","state","AnimatedNumber","value","PropTypes","string","func","object","ReactionsBar","data","native","willEnter","scale","reduceMotion","willLeave","spring","stiffness","damping","reactions","visibleReactions","filter","x","styles","key","toArray","TransitionMotion","items","isEmpty","_ref3","transform","position","size","EmojiPickerDropdown","onPickEmoji","handleEmojiPick","Icon","icon","AddIcon","list","Announcement","unread","selected","startsAt","Date","endsAt","now","hasTimeRange","skipYear","getFullYear","skipEndDate","getDate","getMonth","skipTime","FormattedMessage","FormattedDate","year","undefined","month","day","hour","minute","intl","bool","Announcements","index","announcements","getDerivedStateFromProps","_markAnnouncementAsRead","dismissAnnouncement","mascot","elephantUIPlane","ReactSwipeableViews","animateHeight","animateTransitions","onChangeIndex","handleChangeIndex","idx","disabled","disableSwiping","reverse","IconButton","formatMessage","iconComponent","ChevronLeftIcon","handlePrevClick","ChevronRightIcon","handleNextClick","injectIntl","customEmojiMap","createSelector","reduce","set","ImmutableMap","connect","dispatch","name","ColumnSettings","settings","useAppSelector","useAppDispatch","onChange","useCallback","checked","changeSetting","SettingToggle","prefix","settingPath","label","CriticalUpdateBanner","show_announcements","hide_announcements","HomeTimeline","columnId","removeColumn","addColumn","dir","moveColumn","column","scrollTop","maxId","expandHomeTimeline","stopPropagation","toggleShowAnnouncements","setTimeout","fetchAnnouncements","_checkIfReloadNeeded","isPartial","prevProps","componentWillUnmount","_stopPolling","wasPartial","polling","setInterval","clearInterval","hasUnread","multiColumn","hasAnnouncements","unreadAnnouncements","showAnnouncements","pinned","signedIn","identity","banners","announcementsButton","type","handleToggleAnnouncementsClick","IconWithBadge","CampaignIcon","count","criticalUpdatesPending","_jsxs","Column","bindToDocument","children","ColumnHeader","HomeIcon","onPin","handlePin","onMove","handleMove","handleHeaderClick","extraButton","appendContent","AnnouncementsContainer","StatusListContainer","prepend","alwaysPrepend","trackScroll","scrollKey","onLoadMore","handleLoadMore","timelineId","emptyMessage","NotSignedInIndicator","Helmet","content","withIdentity"],"mappings":"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","file":"js/features/home_timeline-97179dff7c67c72b530f.chunk.js","sourcesContent":["import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { defineMessages, injectIntl, FormattedMessage, FormattedDate } from 'react-intl';\n\nimport classNames from 'classnames';\nimport { withRouter } from 'react-router-dom';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nimport TransitionMotion from 'react-motion/lib/TransitionMotion';\nimport spring from 'react-motion/lib/spring';\nimport ReactSwipeableViews from 'react-swipeable-views';\n\nimport elephantUIPlane from '@/images/elephant_ui_plane.svg';\nimport AddIcon from '@/material-icons/400-24px/add.svg?react';\nimport ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react';\nimport ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react';\nimport { AnimatedNumber } from 'mastodon/components/animated_number';\nimport { Icon }  from 'mastodon/components/icon';\nimport { IconButton } from 'mastodon/components/icon_button';\nimport EmojiPickerDropdown from 'mastodon/features/compose/containers/emoji_picker_dropdown_container';\nimport { unicodeMapping } from 'mastodon/features/emoji/emoji_unicode_mapping_light';\nimport { autoPlayGif, reduceMotion, disableSwiping, mascot } from 'mastodon/initial_state';\nimport { assetHost } from 'mastodon/utils/config';\nimport { WithRouterPropTypes } from 'mastodon/utils/react_router';\n\nconst messages = defineMessages({\n  close: { id: 'lightbox.close', defaultMessage: 'Close' },\n  previous: { id: 'lightbox.previous', defaultMessage: 'Previous' },\n  next: { id: 'lightbox.next', defaultMessage: 'Next' },\n});\n\nclass ContentWithRouter extends ImmutablePureComponent {\n  static propTypes = {\n    announcement: ImmutablePropTypes.map.isRequired,\n    ...WithRouterPropTypes,\n  };\n\n  setRef = c => {\n    this.node = c;\n  };\n\n  componentDidMount () {\n    this._updateLinks();\n  }\n\n  componentDidUpdate () {\n    this._updateLinks();\n  }\n\n  _updateLinks () {\n    const node = this.node;\n\n    if (!node) {\n      return;\n    }\n\n    const links = node.querySelectorAll('a');\n\n    for (var i = 0; i < links.length; ++i) {\n      let link = links[i];\n\n      if (link.classList.contains('status-link')) {\n        continue;\n      }\n\n      link.classList.add('status-link');\n\n      let mention = this.props.announcement.get('mentions').find(item => link.href === item.get('url'));\n\n      if (mention) {\n        link.addEventListener('click', this.onMentionClick.bind(this, mention), false);\n        link.setAttribute('title', mention.get('acct'));\n      } else if (link.textContent[0] === '#' || (link.previousSibling && link.previousSibling.textContent && link.previousSibling.textContent[link.previousSibling.textContent.length - 1] === '#')) {\n        link.addEventListener('click', this.onHashtagClick.bind(this, link.text), false);\n      } else {\n        let status = this.props.announcement.get('statuses').find(item => link.href === item.get('url'));\n        if (status) {\n          link.addEventListener('click', this.onStatusClick.bind(this, status), false);\n        }\n        link.setAttribute('title', link.href);\n        link.classList.add('unhandled-link');\n      }\n\n      link.setAttribute('target', '_blank');\n      link.setAttribute('rel', 'noopener noreferrer');\n    }\n  }\n\n  onMentionClick = (mention, e) => {\n    if (this.props.history && e.button === 0 && !(e.ctrlKey || e.metaKey)) {\n      e.preventDefault();\n      this.props.history.push(`/@${mention.get('acct')}`);\n    }\n  };\n\n  onHashtagClick = (hashtag, e) => {\n    hashtag = hashtag.replace(/^#/, '');\n\n    if (this.props.history&& e.button === 0 && !(e.ctrlKey || e.metaKey)) {\n      e.preventDefault();\n      this.props.history.push(`/tags/${hashtag}`);\n    }\n  };\n\n  onStatusClick = (status, e) => {\n    if (this.props.history && e.button === 0 && !(e.ctrlKey || e.metaKey)) {\n      e.preventDefault();\n      this.props.history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`);\n    }\n  };\n\n  handleMouseEnter = ({ currentTarget }) => {\n    if (autoPlayGif) {\n      return;\n    }\n\n    const emojis = currentTarget.querySelectorAll('.custom-emoji');\n\n    for (var i = 0; i < emojis.length; i++) {\n      let emoji = emojis[i];\n      emoji.src = emoji.getAttribute('data-original');\n    }\n  };\n\n  handleMouseLeave = ({ currentTarget }) => {\n    if (autoPlayGif) {\n      return;\n    }\n\n    const emojis = currentTarget.querySelectorAll('.custom-emoji');\n\n    for (var i = 0; i < emojis.length; i++) {\n      let emoji = emojis[i];\n      emoji.src = emoji.getAttribute('data-static');\n    }\n  };\n\n  render () {\n    const { announcement } = this.props;\n\n    return (\n      <div\n        className='announcements__item__content translate'\n        ref={this.setRef}\n        dangerouslySetInnerHTML={{ __html: announcement.get('contentHtml') }}\n        onMouseEnter={this.handleMouseEnter}\n        onMouseLeave={this.handleMouseLeave}\n      />\n    );\n  }\n\n}\n\nconst Content = withRouter(ContentWithRouter);\n\nclass Emoji extends PureComponent {\n\n  static propTypes = {\n    emoji: PropTypes.string.isRequired,\n    emojiMap: ImmutablePropTypes.map.isRequired,\n    hovered: PropTypes.bool.isRequired,\n  };\n\n  render () {\n    const { emoji, emojiMap, hovered } = this.props;\n\n    if (unicodeMapping[emoji]) {\n      const { filename, shortCode } = unicodeMapping[this.props.emoji];\n      const title = shortCode ? `:${shortCode}:` : '';\n\n      return (\n        <img\n          draggable='false'\n          className='emojione'\n          alt={emoji}\n          title={title}\n          src={`${assetHost}/emoji/${filename}.svg`}\n        />\n      );\n    } else if (emojiMap.get(emoji)) {\n      const filename  = (autoPlayGif || hovered) ? emojiMap.getIn([emoji, 'url']) : emojiMap.getIn([emoji, 'static_url']);\n      const shortCode = `:${emoji}:`;\n\n      return (\n        <img\n          draggable='false'\n          className='emojione custom-emoji'\n          alt={shortCode}\n          title={shortCode}\n          src={filename}\n        />\n      );\n    } else {\n      return null;\n    }\n  }\n\n}\n\nclass Reaction extends ImmutablePureComponent {\n\n  static propTypes = {\n    announcementId: PropTypes.string.isRequired,\n    reaction: ImmutablePropTypes.map.isRequired,\n    addReaction: PropTypes.func.isRequired,\n    removeReaction: PropTypes.func.isRequired,\n    emojiMap: ImmutablePropTypes.map.isRequired,\n    style: PropTypes.object,\n  };\n\n  state = {\n    hovered: false,\n  };\n\n  handleClick = () => {\n    const { reaction, announcementId, addReaction, removeReaction } = this.props;\n\n    if (reaction.get('me')) {\n      removeReaction(announcementId, reaction.get('name'));\n    } else {\n      addReaction(announcementId, reaction.get('name'));\n    }\n  };\n\n  handleMouseEnter = () => this.setState({ hovered: true });\n\n  handleMouseLeave = () => this.setState({ hovered: false });\n\n  render () {\n    const { reaction } = this.props;\n\n    let shortCode = reaction.get('name');\n\n    if (unicodeMapping[shortCode]) {\n      shortCode = unicodeMapping[shortCode].shortCode;\n    }\n\n    return (\n      <button className={classNames('reactions-bar__item', { active: reaction.get('me') })} onClick={this.handleClick} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} title={`:${shortCode}:`} style={this.props.style}>\n        <span className='reactions-bar__item__emoji'><Emoji hovered={this.state.hovered} emoji={reaction.get('name')} emojiMap={this.props.emojiMap} /></span>\n        <span className='reactions-bar__item__count'><AnimatedNumber value={reaction.get('count')} /></span>\n      </button>\n    );\n  }\n\n}\n\nclass ReactionsBar extends ImmutablePureComponent {\n\n  static propTypes = {\n    announcementId: PropTypes.string.isRequired,\n    reactions: ImmutablePropTypes.list.isRequired,\n    addReaction: PropTypes.func.isRequired,\n    removeReaction: PropTypes.func.isRequired,\n    emojiMap: ImmutablePropTypes.map.isRequired,\n  };\n\n  handleEmojiPick = data => {\n    const { addReaction, announcementId } = this.props;\n    addReaction(announcementId, data.native.replace(/:/g, ''));\n  };\n\n  willEnter () {\n    return { scale: reduceMotion ? 1 : 0 };\n  }\n\n  willLeave () {\n    return { scale: reduceMotion ? 0 : spring(0, { stiffness: 170, damping: 26 }) };\n  }\n\n  render () {\n    const { reactions } = this.props;\n    const visibleReactions = reactions.filter(x => x.get('count') > 0);\n\n    const styles = visibleReactions.map(reaction => ({\n      key: reaction.get('name'),\n      data: reaction,\n      style: { scale: reduceMotion ? 1 : spring(1, { stiffness: 150, damping: 13 }) },\n    })).toArray();\n\n    return (\n      <TransitionMotion styles={styles} willEnter={this.willEnter} willLeave={this.willLeave}>\n        {items => (\n          <div className={classNames('reactions-bar', { 'reactions-bar--empty': visibleReactions.isEmpty() })}>\n            {items.map(({ key, data, style }) => (\n              <Reaction\n                key={key}\n                reaction={data}\n                style={{ transform: `scale(${style.scale})`, position: style.scale < 0.5 ? 'absolute' : 'static' }}\n                announcementId={this.props.announcementId}\n                addReaction={this.props.addReaction}\n                removeReaction={this.props.removeReaction}\n                emojiMap={this.props.emojiMap}\n              />\n            ))}\n\n            {visibleReactions.size < 8 && <EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} button={<Icon id='plus' icon={AddIcon} />} />}\n          </div>\n        )}\n      </TransitionMotion>\n    );\n  }\n\n}\n\nclass Announcement extends ImmutablePureComponent {\n\n  static propTypes = {\n    announcement: ImmutablePropTypes.map.isRequired,\n    emojiMap: ImmutablePropTypes.map.isRequired,\n    addReaction: PropTypes.func.isRequired,\n    removeReaction: PropTypes.func.isRequired,\n    intl: PropTypes.object.isRequired,\n    selected: PropTypes.bool,\n  };\n\n  state = {\n    unread: !this.props.announcement.get('read'),\n  };\n\n  componentDidUpdate () {\n    const { selected, announcement } = this.props;\n    if (!selected && this.state.unread !== !announcement.get('read')) {\n      this.setState({ unread: !announcement.get('read') });\n    }\n  }\n\n  render () {\n    const { announcement } = this.props;\n    const { unread } = this.state;\n    const startsAt = announcement.get('starts_at') && new Date(announcement.get('starts_at'));\n    const endsAt = announcement.get('ends_at') && new Date(announcement.get('ends_at'));\n    const now = new Date();\n    const hasTimeRange = startsAt && endsAt;\n    const skipYear = hasTimeRange && startsAt.getFullYear() === endsAt.getFullYear() && endsAt.getFullYear() === now.getFullYear();\n    const skipEndDate = hasTimeRange && startsAt.getDate() === endsAt.getDate() && startsAt.getMonth() === endsAt.getMonth() && startsAt.getFullYear() === endsAt.getFullYear();\n    const skipTime = announcement.get('all_day');\n\n    return (\n      <div className='announcements__item'>\n        <strong className='announcements__item__range'>\n          <FormattedMessage id='announcement.announcement' defaultMessage='Announcement' />\n          {hasTimeRange && <span> · <FormattedDate value={startsAt} year={(skipYear || startsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month='short' day='2-digit' hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /> - <FormattedDate value={endsAt} year={(skipYear || endsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month={skipEndDate ? undefined : 'short'} day={skipEndDate ? undefined : '2-digit'} hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /></span>}\n        </strong>\n\n        <Content announcement={announcement} />\n\n        <ReactionsBar\n          reactions={announcement.get('reactions')}\n          announcementId={announcement.get('id')}\n          addReaction={this.props.addReaction}\n          removeReaction={this.props.removeReaction}\n          emojiMap={this.props.emojiMap}\n        />\n\n        {unread && <span className='announcements__item__unread' />}\n      </div>\n    );\n  }\n\n}\n\nclass Announcements extends ImmutablePureComponent {\n\n  static propTypes = {\n    announcements: ImmutablePropTypes.list,\n    emojiMap: ImmutablePropTypes.map.isRequired,\n    dismissAnnouncement: PropTypes.func.isRequired,\n    addReaction: PropTypes.func.isRequired,\n    removeReaction: PropTypes.func.isRequired,\n    intl: PropTypes.object.isRequired,\n  };\n\n  state = {\n    index: 0,\n  };\n\n  static getDerivedStateFromProps(props, state) {\n    if (props.announcements.size > 0 && state.index >= props.announcements.size) {\n      return { index: props.announcements.size - 1 };\n    } else {\n      return null;\n    }\n  }\n\n  componentDidMount () {\n    this._markAnnouncementAsRead();\n  }\n\n  componentDidUpdate () {\n    this._markAnnouncementAsRead();\n  }\n\n  _markAnnouncementAsRead () {\n    const { dismissAnnouncement, announcements } = this.props;\n    const { index } = this.state;\n    const announcement = announcements.get(announcements.size - 1 - index);\n    if (!announcement.get('read')) dismissAnnouncement(announcement.get('id'));\n  }\n\n  handleChangeIndex = index => {\n    this.setState({ index: index % this.props.announcements.size });\n  };\n\n  handleNextClick = () => {\n    this.setState({ index: (this.state.index + 1) % this.props.announcements.size });\n  };\n\n  handlePrevClick = () => {\n    this.setState({ index: (this.props.announcements.size + this.state.index - 1) % this.props.announcements.size });\n  };\n\n  render () {\n    const { announcements, intl } = this.props;\n    const { index } = this.state;\n\n    if (announcements.isEmpty()) {\n      return null;\n    }\n\n    return (\n      <div className='announcements'>\n        <img className='announcements__mastodon' alt='' draggable='false' src={mascot || elephantUIPlane} />\n\n        <div className='announcements__container'>\n          <ReactSwipeableViews animateHeight animateTransitions={!reduceMotion} index={index} onChangeIndex={this.handleChangeIndex}>\n            {announcements.map((announcement, idx) => (\n              <Announcement\n                key={announcement.get('id')}\n                announcement={announcement}\n                emojiMap={this.props.emojiMap}\n                addReaction={this.props.addReaction}\n                removeReaction={this.props.removeReaction}\n                intl={intl}\n                selected={index === idx}\n                disabled={disableSwiping}\n              />\n            )).reverse()}\n          </ReactSwipeableViews>\n\n          {announcements.size > 1 && (\n            <div className='announcements__pagination'>\n              <IconButton disabled={announcements.size === 1} title={intl.formatMessage(messages.previous)} icon='chevron-left' iconComponent={ChevronLeftIcon} onClick={this.handlePrevClick} size={13} />\n              <span>{index + 1} / {announcements.size}</span>\n              <IconButton disabled={announcements.size === 1} title={intl.formatMessage(messages.next)} icon='chevron-right' iconComponent={ChevronRightIcon} onClick={this.handleNextClick} size={13} />\n            </div>\n          )}\n        </div>\n      </div>\n    );\n  }\n\n}\n\nexport default injectIntl(Announcements);\n","import { createSelector } from '@reduxjs/toolkit';\nimport { Map as ImmutableMap } from 'immutable';\nimport { connect } from 'react-redux';\n\n\nimport { addReaction, removeReaction, dismissAnnouncement } from 'mastodon/actions/announcements';\n\nimport Announcements from '../components/announcements';\n\nconst customEmojiMap = createSelector([state => state.get('custom_emojis')], items => items.reduce((map, emoji) => map.set(emoji.get('shortcode'), emoji), ImmutableMap()));\n\nconst mapStateToProps = state => ({\n  announcements: state.getIn(['announcements', 'items']),\n  emojiMap: customEmojiMap(state),\n});\n\nconst mapDispatchToProps = dispatch => ({\n  dismissAnnouncement: id => dispatch(dismissAnnouncement(id)),\n  addReaction: (id, name) => dispatch(addReaction(id, name)),\n  removeReaction: (id, name) => dispatch(removeReaction(id, name)),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Announcements);\n","/* eslint-disable @typescript-eslint/no-unsafe-call,\n                  @typescript-eslint/no-unsafe-return,\n                  @typescript-eslint/no-unsafe-assignment,\n                  @typescript-eslint/no-unsafe-member-access\n                  -- the settings store is not yet typed */\nimport { useCallback } from 'react';\n\nimport { FormattedMessage } from 'react-intl';\n\nimport { useAppSelector, useAppDispatch } from 'mastodon/store';\n\nimport { changeSetting } from '../../../actions/settings';\nimport SettingToggle from '../../notifications/components/setting_toggle';\n\nexport const ColumnSettings: React.FC = () => {\n  const settings = useAppSelector((state) => state.settings.get('home'));\n\n  const dispatch = useAppDispatch();\n  const onChange = useCallback(\n    (key: string, checked: boolean) => {\n      dispatch(changeSetting(['home', ...key], checked));\n    },\n    [dispatch],\n  );\n\n  return (\n    <div className='column-settings'>\n      <section>\n        <div className='column-settings__row'>\n          <SettingToggle\n            prefix='home_timeline'\n            settings={settings}\n            settingPath={['shows', 'reblog']}\n            onChange={onChange}\n            label={\n              <FormattedMessage\n                id='home.column_settings.show_reblogs'\n                defaultMessage='Show boosts'\n              />\n            }\n          />\n\n          <SettingToggle\n            prefix='home_timeline'\n            settings={settings}\n            settingPath={['shows', 'reply']}\n            onChange={onChange}\n            label={\n              <FormattedMessage\n                id='home.column_settings.show_replies'\n                defaultMessage='Show replies'\n              />\n            }\n          />\n        </div>\n      </section>\n    </div>\n  );\n};\n","import { FormattedMessage } from 'react-intl';\n\nexport const CriticalUpdateBanner = () => (\n  <div className='warning-banner'>\n    <div className='warning-banner__message'>\n      <h1>\n        <FormattedMessage\n          id='home.pending_critical_update.title'\n          defaultMessage='Critical security update available!'\n        />\n      </h1>\n      <p>\n        <FormattedMessage\n          id='home.pending_critical_update.body'\n          defaultMessage='Please update your Mastodon server as soon as possible!'\n        />{' '}\n        <a href='/admin/software_updates'>\n          <FormattedMessage\n            id='home.pending_critical_update.link'\n            defaultMessage='See updates'\n          />\n        </a>\n      </p>\n    </div>\n  </div>\n);\n","import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\n\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\n\nimport classNames from 'classnames';\nimport { Helmet } from 'react-helmet';\n\nimport { connect } from 'react-redux';\n\nimport CampaignIcon from '@/material-icons/400-24px/campaign.svg?react';\nimport HomeIcon from '@/material-icons/400-24px/home-fill.svg?react';\nimport { fetchAnnouncements, toggleShowAnnouncements } from 'mastodon/actions/announcements';\nimport { IconWithBadge } from 'mastodon/components/icon_with_badge';\nimport { NotSignedInIndicator } from 'mastodon/components/not_signed_in_indicator';\nimport AnnouncementsContainer from 'mastodon/features/getting_started/containers/announcements_container';\nimport { identityContextPropShape, withIdentity } from 'mastodon/identity_context';\nimport { criticalUpdatesPending } from 'mastodon/initial_state';\n\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport { expandHomeTimeline } from '../../actions/timelines';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport StatusListContainer from '../ui/containers/status_list_container';\n\nimport { ColumnSettings } from './components/column_settings';\nimport { CriticalUpdateBanner } from './components/critical_update_banner';\n\nconst messages = defineMessages({\n  title: { id: 'column.home', defaultMessage: 'Home' },\n  show_announcements: { id: 'home.show_announcements', defaultMessage: 'Show announcements' },\n  hide_announcements: { id: 'home.hide_announcements', defaultMessage: 'Hide announcements' },\n});\n\nconst mapStateToProps = state => ({\n  hasUnread: state.getIn(['timelines', 'home', 'unread']) > 0,\n  isPartial: state.getIn(['timelines', 'home', 'isPartial']),\n  hasAnnouncements: !state.getIn(['announcements', 'items']).isEmpty(),\n  unreadAnnouncements: state.getIn(['announcements', 'items']).count(item => !item.get('read')),\n  showAnnouncements: state.getIn(['announcements', 'show']),\n});\n\nclass HomeTimeline extends PureComponent {\n  static propTypes = {\n    identity: identityContextPropShape,\n    dispatch: PropTypes.func.isRequired,\n    intl: PropTypes.object.isRequired,\n    hasUnread: PropTypes.bool,\n    isPartial: PropTypes.bool,\n    columnId: PropTypes.string,\n    multiColumn: PropTypes.bool,\n    hasAnnouncements: PropTypes.bool,\n    unreadAnnouncements: PropTypes.number,\n    showAnnouncements: 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('HOME', {}));\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  setRef = c => {\n    this.column = c;\n  };\n\n  handleLoadMore = maxId => {\n    this.props.dispatch(expandHomeTimeline({ maxId }));\n  };\n\n  componentDidMount () {\n    setTimeout(() => this.props.dispatch(fetchAnnouncements()), 700);\n    this._checkIfReloadNeeded(false, this.props.isPartial);\n  }\n\n  componentDidUpdate (prevProps) {\n    this._checkIfReloadNeeded(prevProps.isPartial, this.props.isPartial);\n  }\n\n  componentWillUnmount () {\n    this._stopPolling();\n  }\n\n  _checkIfReloadNeeded (wasPartial, isPartial) {\n    const { dispatch } = this.props;\n\n    if (wasPartial === isPartial) {\n      return;\n    } else if (!wasPartial && isPartial) {\n      this.polling = setInterval(() => {\n        dispatch(expandHomeTimeline());\n      }, 3000);\n    } else if (wasPartial && !isPartial) {\n      this._stopPolling();\n    }\n  }\n\n  _stopPolling () {\n    if (this.polling) {\n      clearInterval(this.polling);\n      this.polling = null;\n    }\n  }\n\n  handleToggleAnnouncementsClick = (e) => {\n    e.stopPropagation();\n    this.props.dispatch(toggleShowAnnouncements());\n  };\n\n  render () {\n    const { intl, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props;\n    const pinned = !!columnId;\n    const { signedIn } = this.props.identity;\n    const banners = [];\n\n    let announcementsButton;\n\n    if (hasAnnouncements) {\n      announcementsButton = (\n        <button\n          type='button'\n          className={classNames('column-header__button', { 'active': showAnnouncements })}\n          title={intl.formatMessage(showAnnouncements ? messages.hide_announcements : messages.show_announcements)}\n          aria-label={intl.formatMessage(showAnnouncements ? messages.hide_announcements : messages.show_announcements)}\n          onClick={this.handleToggleAnnouncementsClick}\n        >\n          <IconWithBadge id='bullhorn' icon={CampaignIcon} count={unreadAnnouncements} />\n        </button>\n      );\n    }\n\n    if (criticalUpdatesPending) {\n      banners.push(<CriticalUpdateBanner key='critical-update-banner' />);\n    }\n\n    return (\n      <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n        <ColumnHeader\n          icon='home'\n          iconComponent={HomeIcon}\n          active={hasUnread}\n          title={intl.formatMessage(messages.title)}\n          onPin={this.handlePin}\n          onMove={this.handleMove}\n          onClick={this.handleHeaderClick}\n          pinned={pinned}\n          multiColumn={multiColumn}\n          extraButton={announcementsButton}\n          appendContent={hasAnnouncements && showAnnouncements && <AnnouncementsContainer />}\n        >\n          <ColumnSettings />\n        </ColumnHeader>\n\n        {signedIn ? (\n          <StatusListContainer\n            prepend={banners}\n            alwaysPrepend\n            trackScroll={!pinned}\n            scrollKey={`home_timeline-${columnId}`}\n            onLoadMore={this.handleLoadMore}\n            timelineId='home'\n            emptyMessage={<FormattedMessage id='empty_column.home' defaultMessage='Your home timeline is empty! Follow more people to fill it up.' />}\n            bindToDocument={!multiColumn}\n          />\n        ) : <NotSignedInIndicator />}\n\n        <Helmet>\n          <title>{intl.formatMessage(messages.title)}</title>\n          <meta name='robots' content='noindex' />\n        </Helmet>\n      </Column>\n    );\n  }\n\n}\n\nexport default connect(mapStateToProps)(withIdentity(injectIntl(HomeTimeline)));\n"],"sourceRoot":""}