Merge branch 'stable' into release/2.0.0
[akkoma] / priv / static / packs / features / notifications.js.map
index 275353bfc4a356f936c2da4a28f0f4b694179666..d466060de5a7444bcf68ca0fb8a6e387f274ca0b 100644 (file)
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/notification.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/notification_container.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/clear_column_button.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/column_settings.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/column_settings_container.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/filter_bar.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/filter_bar_container.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/index.js"],"names":["notificationForScreenReader","intl","message","timestamp","output","push","formatDate","hour","minute","month","day","join","Notification","injectIntl","_this$props","_this","props","notification","onMoveUp","get","_this$props2","onMoveDown","context","router","history","handleOpenProfile","getIn","e","preventDefault","_this$props3","onMention","status","onFavourite","onReblog","onToggleHidden","getHandlers","reply","this","handleMention","favourite","handleHotkeyFavourite","boost","handleHotkeyBoost","mention","open","handleOpen","openProfile","moveUp","handleMoveUp","moveDown","handleMoveDown","toggleHidden","handleHotkeyToggleHidden","renderFollow","account","link","Object","jsx","react_hotkeys_index_es","handlers","className","tabIndex","aria-label","formatMessage","id","defaultMessage","name","icon","fixedWidth","title","index_es","values","account_container","withNote","hidden","renderMention","status_container","withDismiss","contextType","getScrollPosition","updateScrollBottom","cachedMediaWidth","cacheMediaWidth","renderFavourite","muted","renderReblog","renderPoll","render","displayNameHtml","__html","permalink","href","to","dangerouslySetInnerHTML","ImmutablePureComponent","PropTypes","object","ImmutablePropTypes","map","isRequired","bool","func","number","connect","getNotification","makeGetNotification","getStatus","makeGetStatus","state","accountId","dispatch","mentionCompose","onModalReblog","reblog","unreblog","shiftKey","boostModal","openModal","unfavourite","revealStatus","hideStatus","ClearColumnButton","onClick","React","PureComponent","ColumnSettings","path","checked","onChange","concat","settings","pushSettings","onClear","filterShowStr","filterAdvancedStr","alertStr","showStr","soundStr","showPushSettings","pushStr","clear_column_button_ClearColumnButton","role","aria-labelledby","setting_toggle","prefix","settingPath","label","onPushChange","messages","defineMessages","clearMessage","clearConfirm","_ref","changePushNotifications","slice","changeSetting","setFilter","confirm","onConfirm","clearNotifications","tooltips","mentions","favourites","boosts","polls","follows","FilterBar","notificationType","selectFilter","selectedFilter","advancedMode","newActiveFilter","getNotifications","createSelector","ImmutableList","filter","item","keys","showFilterBar","allowedType","excludedTypes","notifications","filterNot","includes","Notifications","isLoading","isUnread","hasMore","maxId","expandNotifications","debounce_default","last","leading","scrollTopNotifications","columnId","removeColumn","addColumn","dir","moveColumn","column","scrollTop","c","elementIndex","findIndex","_selectChild","componentWillUnmount","handleLoadOlder","cancel","handleScrollToTop","handleScroll","index","element","node","querySelector","focus","_this2","shouldUpdateScroll","multiColumn","pinned","emptyMessage","scrollableContent","filterBarContainer","filter_bar_container","size","load_gap","disabled","handleLoadGap","notification_container","scrollContainer","scrollable_list","scrollKey","trackScroll","showLoading","onLoadMore","onScrollToTop","onScroll","react_default","a","createElement","ref","setColumnRef","column_header","active","onPin","handlePin","onMove","handleMove","handleHeaderClick","column_settings_container"],"mappings":"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","file":"features/notifications.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport StatusContainer from '../../../containers/status_container';\nimport AccountContainer from '../../../containers/account_container';\nimport { injectIntl, FormattedMessage } from 'react-intl';\nimport Permalink from '../../../components/permalink';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { HotKeys } from 'react-hotkeys';\nimport Icon from 'mastodon/components/icon';\n\nconst notificationForScreenReader = (intl, message, timestamp) => {\n  const output = [message];\n\n  output.push(intl.formatDate(timestamp, { hour: '2-digit', minute: '2-digit', month: 'short', day: 'numeric' }));\n\n  return output.join(', ');\n};\n\nexport default @injectIntl\nclass Notification extends ImmutablePureComponent {\n\n  static contextTypes = {\n    router: PropTypes.object,\n  };\n\n  static propTypes = {\n    notification: ImmutablePropTypes.map.isRequired,\n    hidden: PropTypes.bool,\n    onMoveUp: PropTypes.func.isRequired,\n    onMoveDown: PropTypes.func.isRequired,\n    onMention: PropTypes.func.isRequired,\n    onFavourite: PropTypes.func.isRequired,\n    onReblog: PropTypes.func.isRequired,\n    onToggleHidden: PropTypes.func.isRequired,\n    status: ImmutablePropTypes.map,\n    intl: PropTypes.object.isRequired,\n    getScrollPosition: PropTypes.func,\n    updateScrollBottom: PropTypes.func,\n    cacheMediaWidth: PropTypes.func,\n    cachedMediaWidth: PropTypes.number,\n  };\n\n  handleMoveUp = () => {\n    const { notification, onMoveUp } = this.props;\n    onMoveUp(notification.get('id'));\n  }\n\n  handleMoveDown = () => {\n    const { notification, onMoveDown } = this.props;\n    onMoveDown(notification.get('id'));\n  }\n\n  handleOpen = () => {\n    const { notification } = this.props;\n\n    if (notification.get('status')) {\n      this.context.router.history.push(`/statuses/${notification.get('status')}`);\n    } else {\n      this.handleOpenProfile();\n    }\n  }\n\n  handleOpenProfile = () => {\n    const { notification } = this.props;\n    this.context.router.history.push(`/accounts/${notification.getIn(['account', 'id'])}`);\n  }\n\n  handleMention = e => {\n    e.preventDefault();\n\n    const { notification, onMention } = this.props;\n    onMention(notification.get('account'), this.context.router.history);\n  }\n\n  handleHotkeyFavourite = () => {\n    const { status } = this.props;\n    if (status) this.props.onFavourite(status);\n  }\n\n  handleHotkeyBoost = e => {\n    const { status } = this.props;\n    if (status) this.props.onReblog(status, e);\n  }\n\n  handleHotkeyToggleHidden = () => {\n    const { status } = this.props;\n    if (status) this.props.onToggleHidden(status);\n  }\n\n  getHandlers () {\n    return {\n      reply: this.handleMention,\n      favourite: this.handleHotkeyFavourite,\n      boost: this.handleHotkeyBoost,\n      mention: this.handleMention,\n      open: this.handleOpen,\n      openProfile: this.handleOpenProfile,\n      moveUp: this.handleMoveUp,\n      moveDown: this.handleMoveDown,\n      toggleHidden: this.handleHotkeyToggleHidden,\n    };\n  }\n\n  renderFollow (notification, account, link) {\n    const { intl } = this.props;\n\n    return (\n      <HotKeys handlers={this.getHandlers()}>\n        <div className='notification notification-follow focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.follow', defaultMessage: '{name} followed you' }, { name: account.get('acct') }), notification.get('created_at'))}>\n          <div className='notification__message'>\n            <div className='notification__favourite-icon-wrapper'>\n              <Icon id='user-plus' fixedWidth />\n            </div>\n\n            <span title={notification.get('created_at')}>\n              <FormattedMessage id='notification.follow' defaultMessage='{name} followed you' values={{ name: link }} />\n            </span>\n          </div>\n\n          <AccountContainer id={account.get('id')} withNote={false} hidden={this.props.hidden} />\n        </div>\n      </HotKeys>\n    );\n  }\n\n  renderMention (notification) {\n    return (\n      <StatusContainer\n        id={notification.get('status')}\n        withDismiss\n        hidden={this.props.hidden}\n        onMoveDown={this.handleMoveDown}\n        onMoveUp={this.handleMoveUp}\n        contextType='notifications'\n        getScrollPosition={this.props.getScrollPosition}\n        updateScrollBottom={this.props.updateScrollBottom}\n        cachedMediaWidth={this.props.cachedMediaWidth}\n        cacheMediaWidth={this.props.cacheMediaWidth}\n      />\n    );\n  }\n\n  renderFavourite (notification, link) {\n    const { intl } = this.props;\n\n    return (\n      <HotKeys handlers={this.getHandlers()}>\n        <div className='notification notification-favourite focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.favourite', defaultMessage: '{name} favourited your status' }, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>\n          <div className='notification__message'>\n            <div className='notification__favourite-icon-wrapper'>\n              <Icon id='star' className='star-icon' fixedWidth />\n            </div>\n\n            <span title={notification.get('created_at')}>\n              <FormattedMessage id='notification.favourite' defaultMessage='{name} favourited your status' values={{ name: link }} />\n            </span>\n          </div>\n\n          <StatusContainer\n            id={notification.get('status')}\n            account={notification.get('account')}\n            muted\n            withDismiss\n            hidden={!!this.props.hidden}\n            getScrollPosition={this.props.getScrollPosition}\n            updateScrollBottom={this.props.updateScrollBottom}\n            cachedMediaWidth={this.props.cachedMediaWidth}\n            cacheMediaWidth={this.props.cacheMediaWidth}\n          />\n        </div>\n      </HotKeys>\n    );\n  }\n\n  renderReblog (notification, link) {\n    const { intl } = this.props;\n\n    return (\n      <HotKeys handlers={this.getHandlers()}>\n        <div className='notification notification-reblog focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.reblog', defaultMessage: '{name} boosted your status' }, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>\n          <div className='notification__message'>\n            <div className='notification__favourite-icon-wrapper'>\n              <Icon id='retweet' fixedWidth />\n            </div>\n\n            <span title={notification.get('created_at')}>\n              <FormattedMessage id='notification.reblog' defaultMessage='{name} boosted your status' values={{ name: link }} />\n            </span>\n          </div>\n\n          <StatusContainer\n            id={notification.get('status')}\n            account={notification.get('account')}\n            muted\n            withDismiss\n            hidden={this.props.hidden}\n            getScrollPosition={this.props.getScrollPosition}\n            updateScrollBottom={this.props.updateScrollBottom}\n            cachedMediaWidth={this.props.cachedMediaWidth}\n            cacheMediaWidth={this.props.cacheMediaWidth}\n          />\n        </div>\n      </HotKeys>\n    );\n  }\n\n  renderPoll (notification) {\n    const { intl } = this.props;\n\n    return (\n      <HotKeys handlers={this.getHandlers()}>\n        <div className='notification notification-poll focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.poll', defaultMessage: 'A poll you have voted in has ended' }), notification.get('created_at'))}>\n          <div className='notification__message'>\n            <div className='notification__favourite-icon-wrapper'>\n              <Icon id='tasks' fixedWidth />\n            </div>\n\n            <span title={notification.get('created_at')}>\n              <FormattedMessage id='notification.poll' defaultMessage='A poll you have voted in has ended' />\n            </span>\n          </div>\n\n          <StatusContainer\n            id={notification.get('status')}\n            account={notification.get('account')}\n            muted\n            withDismiss\n            hidden={this.props.hidden}\n            getScrollPosition={this.props.getScrollPosition}\n            updateScrollBottom={this.props.updateScrollBottom}\n            cachedMediaWidth={this.props.cachedMediaWidth}\n            cacheMediaWidth={this.props.cacheMediaWidth}\n          />\n        </div>\n      </HotKeys>\n    );\n  }\n\n  render () {\n    const { notification } = this.props;\n    const account          = notification.get('account');\n    const displayNameHtml  = { __html: account.get('display_name_html') };\n    const link             = <bdi><Permalink className='notification__display-name' href={account.get('url')} title={account.get('acct')} to={`/accounts/${account.get('id')}`} dangerouslySetInnerHTML={displayNameHtml} /></bdi>;\n\n    switch(notification.get('type')) {\n    case 'follow':\n      return this.renderFollow(notification, account, link);\n    case 'mention':\n      return this.renderMention(notification);\n    case 'favourite':\n      return this.renderFavourite(notification, link);\n    case 'reblog':\n      return this.renderReblog(notification, link);\n    case 'poll':\n      return this.renderPoll(notification);\n    }\n\n    return null;\n  }\n\n}\n","import { connect } from 'react-redux';\nimport { makeGetNotification, makeGetStatus } from '../../../selectors';\nimport Notification from '../components/notification';\nimport { openModal } from '../../../actions/modal';\nimport { mentionCompose } from '../../../actions/compose';\nimport {\n  reblog,\n  favourite,\n  unreblog,\n  unfavourite,\n} from '../../../actions/interactions';\nimport {\n  hideStatus,\n  revealStatus,\n} from '../../../actions/statuses';\nimport { boostModal } from '../../../initial_state';\n\nconst makeMapStateToProps = () => {\n  const getNotification = makeGetNotification();\n  const getStatus = makeGetStatus();\n\n  const mapStateToProps = (state, props) => {\n    const notification = getNotification(state, props.notification, props.accountId);\n    return {\n      notification: notification,\n      status: notification.get('status') ? getStatus(state, { id: notification.get('status') }) : null,\n    };\n  };\n\n  return mapStateToProps;\n};\n\nconst mapDispatchToProps = dispatch => ({\n  onMention: (account, router) => {\n    dispatch(mentionCompose(account, router));\n  },\n\n  onModalReblog (status) {\n    dispatch(reblog(status));\n  },\n\n  onReblog (status, e) {\n    if (status.get('reblogged')) {\n      dispatch(unreblog(status));\n    } else {\n      if (e.shiftKey || !boostModal) {\n        this.onModalReblog(status);\n      } else {\n        dispatch(openModal('BOOST', { status, onReblog: this.onModalReblog }));\n      }\n    }\n  },\n\n  onFavourite (status) {\n    if (status.get('favourited')) {\n      dispatch(unfavourite(status));\n    } else {\n      dispatch(favourite(status));\n    }\n  },\n\n  onToggleHidden (status) {\n    if (status.get('hidden')) {\n      dispatch(revealStatus(status.get('id')));\n    } else {\n      dispatch(hideStatus(status.get('id')));\n    }\n  },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(Notification);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage } from 'react-intl';\nimport Icon from 'mastodon/components/icon';\n\nexport default class ClearColumnButton extends React.PureComponent {\n\n  static propTypes = {\n    onClick: PropTypes.func.isRequired,\n  };\n\n  render () {\n    return (\n      <button className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.props.onClick}><Icon id='eraser' /> <FormattedMessage id='notifications.clear' defaultMessage='Clear notifications' /></button>\n    );\n  }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { FormattedMessage } from 'react-intl';\nimport ClearColumnButton from './clear_column_button';\nimport SettingToggle from './setting_toggle';\n\nexport default class ColumnSettings extends React.PureComponent {\n\n  static propTypes = {\n    settings: ImmutablePropTypes.map.isRequired,\n    pushSettings: ImmutablePropTypes.map.isRequired,\n    onChange: PropTypes.func.isRequired,\n    onClear: PropTypes.func.isRequired,\n  };\n\n  onPushChange = (path, checked) => {\n    this.props.onChange(['push', ...path], checked);\n  }\n\n  render () {\n    const { settings, pushSettings, onChange, onClear } = this.props;\n\n    const filterShowStr = <FormattedMessage id='notifications.column_settings.filter_bar.show' defaultMessage='Show' />;\n    const filterAdvancedStr = <FormattedMessage id='notifications.column_settings.filter_bar.advanced' defaultMessage='Display all categories' />;\n    const alertStr  = <FormattedMessage id='notifications.column_settings.alert' defaultMessage='Desktop notifications' />;\n    const showStr   = <FormattedMessage id='notifications.column_settings.show' defaultMessage='Show in column' />;\n    const soundStr  = <FormattedMessage id='notifications.column_settings.sound' defaultMessage='Play sound' />;\n\n    const showPushSettings = pushSettings.get('browserSupport') && pushSettings.get('isSubscribed');\n    const pushStr = showPushSettings && <FormattedMessage id='notifications.column_settings.push' defaultMessage='Push notifications' />;\n\n    return (\n      <div>\n        <div className='column-settings__row'>\n          <ClearColumnButton onClick={onClear} />\n        </div>\n\n        <div role='group' aria-labelledby='notifications-filter-bar'>\n          <span id='notifications-filter-bar' className='column-settings__section'>\n            <FormattedMessage id='notifications.column_settings.filter_bar.category' defaultMessage='Quick filter bar' />\n          </span>\n          <div className='column-settings__row'>\n            <SettingToggle id='show-filter-bar' prefix='notifications' settings={settings} settingPath={['quickFilter', 'show']} onChange={onChange} label={filterShowStr} />\n            <SettingToggle id='show-filter-bar' prefix='notifications' settings={settings} settingPath={['quickFilter', 'advanced']} onChange={onChange} label={filterAdvancedStr} />\n          </div>\n        </div>\n\n        <div role='group' aria-labelledby='notifications-follow'>\n          <span id='notifications-follow' className='column-settings__section'><FormattedMessage id='notifications.column_settings.follow' defaultMessage='New followers:' /></span>\n\n          <div className='column-settings__row'>\n            <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow']} onChange={onChange} label={alertStr} />\n            {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'follow']} onChange={this.onPushChange} label={pushStr} />}\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'follow']} onChange={onChange} label={showStr} />\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'follow']} onChange={onChange} label={soundStr} />\n          </div>\n        </div>\n\n        <div role='group' aria-labelledby='notifications-favourite'>\n          <span id='notifications-favourite' className='column-settings__section'><FormattedMessage id='notifications.column_settings.favourite' defaultMessage='Favourites:' /></span>\n\n          <div className='column-settings__row'>\n            <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'favourite']} onChange={onChange} label={alertStr} />\n            {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'favourite']} onChange={this.onPushChange} label={pushStr} />}\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'favourite']} onChange={onChange} label={showStr} />\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'favourite']} onChange={onChange} label={soundStr} />\n          </div>\n        </div>\n\n        <div role='group' aria-labelledby='notifications-mention'>\n          <span id='notifications-mention' className='column-settings__section'><FormattedMessage id='notifications.column_settings.mention' defaultMessage='Mentions:' /></span>\n\n          <div className='column-settings__row'>\n            <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'mention']} onChange={onChange} label={alertStr} />\n            {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'mention']} onChange={this.onPushChange} label={pushStr} />}\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'mention']} onChange={onChange} label={showStr} />\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'mention']} onChange={onChange} label={soundStr} />\n          </div>\n        </div>\n\n        <div role='group' aria-labelledby='notifications-reblog'>\n          <span id='notifications-reblog' className='column-settings__section'><FormattedMessage id='notifications.column_settings.reblog' defaultMessage='Boosts:' /></span>\n\n          <div className='column-settings__row'>\n            <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'reblog']} onChange={onChange} label={alertStr} />\n            {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'reblog']} onChange={this.onPushChange} label={pushStr} />}\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'reblog']} onChange={onChange} label={showStr} />\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'reblog']} onChange={onChange} label={soundStr} />\n          </div>\n        </div>\n\n        <div role='group' aria-labelledby='notifications-poll'>\n          <span id='notifications-poll' className='column-settings__section'><FormattedMessage id='notifications.column_settings.poll' defaultMessage='Poll results:' /></span>\n\n          <div className='column-settings__row'>\n            <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'poll']} onChange={onChange} label={alertStr} />\n            {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'poll']} onChange={this.onPushChange} label={pushStr} />}\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'poll']} onChange={onChange} label={showStr} />\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'poll']} onChange={onChange} label={soundStr} />\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n}\n","import { connect } from 'react-redux';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ColumnSettings from '../components/column_settings';\nimport { changeSetting } from '../../../actions/settings';\nimport { setFilter } from '../../../actions/notifications';\nimport { clearNotifications } from '../../../actions/notifications';\nimport { changeAlerts as changePushNotifications } from '../../../actions/push_notifications';\nimport { openModal } from '../../../actions/modal';\n\nconst messages = defineMessages({\n  clearMessage: { id: 'notifications.clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all your notifications?' },\n  clearConfirm: { id: 'notifications.clear', defaultMessage: 'Clear notifications' },\n});\n\nconst mapStateToProps = state => ({\n  settings: state.getIn(['settings', 'notifications']),\n  pushSettings: state.get('push_notifications'),\n});\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n\n  onChange (path, checked) {\n    if (path[0] === 'push') {\n      dispatch(changePushNotifications(path.slice(1), checked));\n    } else if (path[0] === 'quickFilter') {\n      dispatch(changeSetting(['notifications', ...path], checked));\n      dispatch(setFilter('all'));\n    } else {\n      dispatch(changeSetting(['notifications', ...path], checked));\n    }\n  },\n\n  onClear () {\n    dispatch(openModal('CONFIRM', {\n      message: intl.formatMessage(messages.clearMessage),\n      confirm: intl.formatMessage(messages.clearConfirm),\n      onConfirm: () => dispatch(clearNotifications()),\n    }));\n  },\n\n});\n\nexport default injectIntl(connect(mapStateToProps, mapDispatchToProps)(ColumnSettings));\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport Icon from 'mastodon/components/icon';\n\nconst tooltips = defineMessages({\n  mentions: { id: 'notifications.filter.mentions', defaultMessage: 'Mentions' },\n  favourites: { id: 'notifications.filter.favourites', defaultMessage: 'Favourites' },\n  boosts: { id: 'notifications.filter.boosts', defaultMessage: 'Boosts' },\n  polls: { id: 'notifications.filter.polls', defaultMessage: 'Poll results' },\n  follows: { id: 'notifications.filter.follows', defaultMessage: 'Follows' },\n});\n\nexport default @injectIntl\nclass FilterBar extends React.PureComponent {\n\n  static propTypes = {\n    selectFilter: PropTypes.func.isRequired,\n    selectedFilter: PropTypes.string.isRequired,\n    advancedMode: PropTypes.bool.isRequired,\n    intl: PropTypes.object.isRequired,\n  };\n\n  onClick (notificationType) {\n    return () => this.props.selectFilter(notificationType);\n  }\n\n  render () {\n    const { selectedFilter, advancedMode, intl } = this.props;\n    const renderedElement = !advancedMode ? (\n      <div className='notification__filter-bar'>\n        <button\n          className={selectedFilter === 'all' ? 'active' : ''}\n          onClick={this.onClick('all')}\n        >\n          <FormattedMessage\n            id='notifications.filter.all'\n            defaultMessage='All'\n          />\n        </button>\n        <button\n          className={selectedFilter === 'mention' ? 'active' : ''}\n          onClick={this.onClick('mention')}\n        >\n          <FormattedMessage\n            id='notifications.filter.mentions'\n            defaultMessage='Mentions'\n          />\n        </button>\n      </div>\n    ) : (\n      <div className='notification__filter-bar'>\n        <button\n          className={selectedFilter === 'all' ? 'active' : ''}\n          onClick={this.onClick('all')}\n        >\n          <FormattedMessage\n            id='notifications.filter.all'\n            defaultMessage='All'\n          />\n        </button>\n        <button\n          className={selectedFilter === 'mention' ? 'active' : ''}\n          onClick={this.onClick('mention')}\n          title={intl.formatMessage(tooltips.mentions)}\n        >\n          <Icon id='at' fixedWidth />\n        </button>\n        <button\n          className={selectedFilter === 'favourite' ? 'active' : ''}\n          onClick={this.onClick('favourite')}\n          title={intl.formatMessage(tooltips.favourites)}\n        >\n          <Icon id='star' fixedWidth />\n        </button>\n        <button\n          className={selectedFilter === 'reblog' ? 'active' : ''}\n          onClick={this.onClick('reblog')}\n          title={intl.formatMessage(tooltips.boosts)}\n        >\n          <Icon id='retweet' fixedWidth />\n        </button>\n        <button\n          className={selectedFilter === 'poll' ? 'active' : ''}\n          onClick={this.onClick('poll')}\n          title={intl.formatMessage(tooltips.polls)}\n        >\n          <Icon id='tasks' fixedWidth />\n        </button>\n        <button\n          className={selectedFilter === 'follow' ? 'active' : ''}\n          onClick={this.onClick('follow')}\n          title={intl.formatMessage(tooltips.follows)}\n        >\n          <Icon id='user-plus' fixedWidth />\n        </button>\n      </div>\n    );\n    return renderedElement;\n  }\n\n}\n","import { connect } from 'react-redux';\nimport FilterBar from '../components/filter_bar';\nimport { setFilter } from '../../../actions/notifications';\n\nconst makeMapStateToProps = state => ({\n  selectedFilter: state.getIn(['settings', 'notifications', 'quickFilter', 'active']),\n  advancedMode: state.getIn(['settings', 'notifications', 'quickFilter', 'advanced']),\n});\n\nconst mapDispatchToProps = (dispatch) => ({\n  selectFilter (newActiveFilter) {\n    dispatch(setFilter(newActiveFilter));\n  },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(FilterBar);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { expandNotifications, scrollTopNotifications } from '../../actions/notifications';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport NotificationContainer from './containers/notification_container';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport FilterBarContainer from './containers/filter_bar_container';\nimport { createSelector } from 'reselect';\nimport { List as ImmutableList } from 'immutable';\nimport { debounce } from 'lodash';\nimport ScrollableList from '../../components/scrollable_list';\nimport LoadGap from '../../components/load_gap';\n\nconst messages = defineMessages({\n  title: { id: 'column.notifications', defaultMessage: 'Notifications' },\n});\n\nconst getNotifications = createSelector([\n  state => state.getIn(['settings', 'notifications', 'quickFilter', 'show']),\n  state => state.getIn(['settings', 'notifications', 'quickFilter', 'active']),\n  state => ImmutableList(state.getIn(['settings', 'notifications', 'shows']).filter(item => !item).keys()),\n  state => state.getIn(['notifications', 'items']),\n], (showFilterBar, allowedType, excludedTypes, notifications) => {\n  if (!showFilterBar || allowedType === 'all') {\n    // used if user changed the notification settings after loading the notifications from the server\n    // otherwise a list of notifications will come pre-filtered from the backend\n    // we need to turn it off for FilterBar in order not to block ourselves from seeing a specific category\n    return notifications.filterNot(item => item !== null && excludedTypes.includes(item.get('type')));\n  }\n  return notifications.filter(item => item !== null && allowedType === item.get('type'));\n});\n\nconst mapStateToProps = state => ({\n  showFilterBar: state.getIn(['settings', 'notifications', 'quickFilter', 'show']),\n  notifications: getNotifications(state),\n  isLoading: state.getIn(['notifications', 'isLoading'], true),\n  isUnread: state.getIn(['notifications', 'unread']) > 0,\n  hasMore: state.getIn(['notifications', 'hasMore']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Notifications extends React.PureComponent {\n\n  static propTypes = {\n    columnId: PropTypes.string,\n    notifications: ImmutablePropTypes.list.isRequired,\n    showFilterBar: PropTypes.bool.isRequired,\n    dispatch: PropTypes.func.isRequired,\n    shouldUpdateScroll: PropTypes.func,\n    intl: PropTypes.object.isRequired,\n    isLoading: PropTypes.bool,\n    isUnread: PropTypes.bool,\n    multiColumn: PropTypes.bool,\n    hasMore: PropTypes.bool,\n  };\n\n  static defaultProps = {\n    trackScroll: true,\n  };\n\n  componentWillUnmount () {\n    this.handleLoadOlder.cancel();\n    this.handleScrollToTop.cancel();\n    this.handleScroll.cancel();\n    this.props.dispatch(scrollTopNotifications(false));\n  }\n\n  handleLoadGap = (maxId) => {\n    this.props.dispatch(expandNotifications({ maxId }));\n  };\n\n  handleLoadOlder = debounce(() => {\n    const last = this.props.notifications.last();\n    this.props.dispatch(expandNotifications({ maxId: last && last.get('id') }));\n  }, 300, { leading: true });\n\n  handleScrollToTop = debounce(() => {\n    this.props.dispatch(scrollTopNotifications(true));\n  }, 100);\n\n  handleScroll = debounce(() => {\n    this.props.dispatch(scrollTopNotifications(false));\n  }, 100);\n\n  handlePin = () => {\n    const { columnId, dispatch } = this.props;\n\n    if (columnId) {\n      dispatch(removeColumn(columnId));\n    } else {\n      dispatch(addColumn('NOTIFICATIONS', {}));\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  setColumnRef = c => {\n    this.column = c;\n  }\n\n  handleMoveUp = id => {\n    const elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) - 1;\n    this._selectChild(elementIndex);\n  }\n\n  handleMoveDown = id => {\n    const elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) + 1;\n    this._selectChild(elementIndex);\n  }\n\n  _selectChild (index) {\n    const element = this.column.node.querySelector(`article:nth-of-type(${index + 1}) .focusable`);\n\n    if (element) {\n      element.focus();\n    }\n  }\n\n  render () {\n    const { intl, notifications, shouldUpdateScroll, isLoading, isUnread, columnId, multiColumn, hasMore, showFilterBar } = this.props;\n    const pinned = !!columnId;\n    const emptyMessage = <FormattedMessage id='empty_column.notifications' defaultMessage=\"You don't have any notifications yet. Interact with others to start the conversation.\" />;\n\n    let scrollableContent = null;\n\n    const filterBarContainer = showFilterBar\n      ? (<FilterBarContainer />)\n      : null;\n\n    if (isLoading && this.scrollableContent) {\n      scrollableContent = this.scrollableContent;\n    } else if (notifications.size > 0 || hasMore) {\n      scrollableContent = notifications.map((item, index) => item === null ? (\n        <LoadGap\n          key={'gap:' + notifications.getIn([index + 1, 'id'])}\n          disabled={isLoading}\n          maxId={index > 0 ? notifications.getIn([index - 1, 'id']) : null}\n          onClick={this.handleLoadGap}\n        />\n      ) : (\n        <NotificationContainer\n          key={item.get('id')}\n          notification={item}\n          accountId={item.get('account')}\n          onMoveUp={this.handleMoveUp}\n          onMoveDown={this.handleMoveDown}\n        />\n      ));\n    } else {\n      scrollableContent = null;\n    }\n\n    this.scrollableContent = scrollableContent;\n\n    const scrollContainer = (\n      <ScrollableList\n        scrollKey={`notifications-${columnId}`}\n        trackScroll={!pinned}\n        isLoading={isLoading}\n        showLoading={isLoading && notifications.size === 0}\n        hasMore={hasMore}\n        emptyMessage={emptyMessage}\n        onLoadMore={this.handleLoadOlder}\n        onScrollToTop={this.handleScrollToTop}\n        onScroll={this.handleScroll}\n        shouldUpdateScroll={shouldUpdateScroll}\n      >\n        {scrollableContent}\n      </ScrollableList>\n    );\n\n    return (\n      <Column ref={this.setColumnRef} label={intl.formatMessage(messages.title)}>\n        <ColumnHeader\n          icon='bell'\n          active={isUnread}\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        >\n          <ColumnSettingsContainer />\n        </ColumnHeader>\n        {filterBarContainer}\n        {scrollContainer}\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/mastodon/features/notifications/components/follow_request.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/follow_request_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/notification.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/notification_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/clear_column_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/column_settings.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/column_settings_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/filter_bar.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/filter_bar_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/index.js"],"names":["messages","defineMessages","authorize","reject","FollowRequest","injectIntl","render","this","props","intl","hidden","account","onAuthorize","onReject","get","className","title","href","to","size","formatMessage","icon","onClick","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","func","object","connect","getAccount","makeGetAccount","state","id","dispatch","authorizeFollowRequest","rejectFollowRequest","favourite","follow","ownPoll","poll","reblog","notificationForScreenReader","message","timestamp","output","push","formatDate","hour","minute","month","day","join","Notification","notification","onMoveUp","onMoveDown","context","router","history","handleOpenProfile","getIn","e","preventDefault","onMention","status","onFavourite","onReblog","onToggleHidden","getHandlers","reply","handleMention","handleHotkeyFavourite","boost","handleHotkeyBoost","mention","open","handleOpen","openProfile","moveUp","handleMoveUp","moveDown","handleMoveDown","toggleHidden","handleHotkeyToggleHidden","renderFollow","link","handlers","tabIndex","aria-label","name","fixedWidth","defaultMessage","values","renderFollowRequest","withNote","renderMention","withDismiss","contextType","getScrollPosition","updateScrollBottom","cachedMediaWidth","cacheMediaWidth","renderFavourite","muted","renderReblog","renderPoll","me","displayNameHtml","__html","dangerouslySetInnerHTML","bool","number","getNotification","makeGetNotification","getStatus","makeGetStatus","accountId","mentionCompose","onModalReblog","unreblog","shiftKey","boostModal","openModal","unfavourite","revealStatus","hideStatus","ClearColumnButton","React","PureComponent","ColumnSettings","path","checked","onChange","settings","pushSettings","onClear","filterShowStr","filterAdvancedStr","alertStr","showStr","soundStr","showPushSettings","pushStr","role","aria-labelledby","prefix","settingPath","label","onPushChange","clearMessage","clearConfirm","changePushNotifications","slice","changeSetting","setFilter","confirm","onConfirm","clearNotifications","tooltips","mentions","favourites","boosts","polls","follows","FilterBar","notificationType","selectFilter","selectedFilter","advancedMode","newActiveFilter","getNotifications","createSelector","ImmutableList","filter","item","keys","showFilterBar","allowedType","excludedTypes","notifications","filterNot","includes","Notifications","isLoading","isUnread","hasMore","numPending","maxId","expandNotifications","last","leading","loadPending","scrollTopNotifications","columnId","removeColumn","addColumn","dir","moveColumn","column","scrollTop","c","elementIndex","findIndex","_selectChild","componentWillMount","mountNotifications","componentWillUnmount","handleLoadOlder","cancel","handleScrollToTop","handleScroll","unmountNotifications","index","align_top","container","node","element","querySelector","offsetTop","scrollIntoView","clientHeight","offsetHeight","focus","shouldUpdateScroll","multiColumn","pinned","emptyMessage","scrollableContent","filterBarContainer","disabled","handleLoadGap","scrollContainer","scrollKey","trackScroll","showLoading","onLoadMore","onLoadPending","handleLoadPending","onScrollToTop","onScroll","bindToDocument","ref","setColumnRef","active","onPin","handlePin","onMove","handleMove","handleHeaderClick"],"mappings":"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","file":"features/notifications.js","sourcesContent":["import React, { Fragment } from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport Avatar from 'mastodon/components/avatar';\nimport DisplayName from 'mastodon/components/display_name';\nimport Permalink from 'mastodon/components/permalink';\nimport IconButton from 'mastodon/components/icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nconst messages = defineMessages({\n  authorize: { id: 'follow_request.authorize', defaultMessage: 'Authorize' },\n  reject: { id: 'follow_request.reject', defaultMessage: 'Reject' },\n});\n\nexport default @injectIntl\nclass FollowRequest extends ImmutablePureComponent {\n\n  static propTypes = {\n    account: ImmutablePropTypes.map.isRequired,\n    onAuthorize: PropTypes.func.isRequired,\n    onReject: PropTypes.func.isRequired,\n    intl: PropTypes.object.isRequired,\n  };\n\n  render () {\n    const { intl, hidden, account, onAuthorize, onReject } = this.props;\n\n    if (!account) {\n      return <div />;\n    }\n\n    if (hidden) {\n      return (\n        <Fragment>\n          {account.get('display_name')}\n          {account.get('username')}\n        </Fragment>\n      );\n    }\n\n    return (\n      <div className='account'>\n        <div className='account__wrapper'>\n          <Permalink key={account.get('id')} className='account__display-name' title={account.get('acct')} href={account.get('url')} to={`/accounts/${account.get('id')}`}>\n            <div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div>\n            <DisplayName account={account} />\n          </Permalink>\n\n          <div className='account__relationship'>\n            <IconButton title={intl.formatMessage(messages.authorize)} icon='check' onClick={onAuthorize} />\n            <IconButton title={intl.formatMessage(messages.reject)} icon='times' onClick={onReject} />\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n}\n","import { connect } from 'react-redux';\nimport { makeGetAccount } from 'mastodon/selectors';\nimport FollowRequest from '../components/follow_request';\nimport { authorizeFollowRequest, rejectFollowRequest } from 'mastodon/actions/accounts';\n\nconst makeMapStateToProps = () => {\n  const getAccount = makeGetAccount();\n\n  const mapStateToProps = (state, props) => ({\n    account: getAccount(state, props.id),\n  });\n\n  return mapStateToProps;\n};\n\nconst mapDispatchToProps = (dispatch, { id }) => ({\n  onAuthorize () {\n    dispatch(authorizeFollowRequest(id));\n  },\n\n  onReject () {\n    dispatch(rejectFollowRequest(id));\n  },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(FollowRequest);\n","import React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { injectIntl, FormattedMessage, defineMessages } from 'react-intl';\nimport { HotKeys } from 'react-hotkeys';\nimport PropTypes from 'prop-types';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { me } from 'mastodon/initial_state';\nimport StatusContainer from 'mastodon/containers/status_container';\nimport AccountContainer from 'mastodon/containers/account_container';\nimport FollowRequestContainer from '../containers/follow_request_container';\nimport Icon from 'mastodon/components/icon';\nimport Permalink from 'mastodon/components/permalink';\n\nconst messages = defineMessages({\n  favourite: { id: 'notification.favourite', defaultMessage: '{name} favourited your status' },\n  follow: { id: 'notification.follow', defaultMessage: '{name} followed you' },\n  ownPoll: { id: 'notification.own_poll', defaultMessage: 'Your poll has ended' },\n  poll: { id: 'notification.poll', defaultMessage: 'A poll you have voted in has ended' },\n  reblog: { id: 'notification.reblog', defaultMessage: '{name} boosted your status' },\n});\n\nconst notificationForScreenReader = (intl, message, timestamp) => {\n  const output = [message];\n\n  output.push(intl.formatDate(timestamp, { hour: '2-digit', minute: '2-digit', month: 'short', day: 'numeric' }));\n\n  return output.join(', ');\n};\n\nexport default @injectIntl\nclass Notification extends ImmutablePureComponent {\n\n  static contextTypes = {\n    router: PropTypes.object,\n  };\n\n  static propTypes = {\n    notification: ImmutablePropTypes.map.isRequired,\n    hidden: PropTypes.bool,\n    onMoveUp: PropTypes.func.isRequired,\n    onMoveDown: PropTypes.func.isRequired,\n    onMention: PropTypes.func.isRequired,\n    onFavourite: PropTypes.func.isRequired,\n    onReblog: PropTypes.func.isRequired,\n    onToggleHidden: PropTypes.func.isRequired,\n    status: ImmutablePropTypes.map,\n    intl: PropTypes.object.isRequired,\n    getScrollPosition: PropTypes.func,\n    updateScrollBottom: PropTypes.func,\n    cacheMediaWidth: PropTypes.func,\n    cachedMediaWidth: PropTypes.number,\n  };\n\n  handleMoveUp = () => {\n    const { notification, onMoveUp } = this.props;\n    onMoveUp(notification.get('id'));\n  }\n\n  handleMoveDown = () => {\n    const { notification, onMoveDown } = this.props;\n    onMoveDown(notification.get('id'));\n  }\n\n  handleOpen = () => {\n    const { notification } = this.props;\n\n    if (notification.get('status')) {\n      this.context.router.history.push(`/statuses/${notification.get('status')}`);\n    } else {\n      this.handleOpenProfile();\n    }\n  }\n\n  handleOpenProfile = () => {\n    const { notification } = this.props;\n    this.context.router.history.push(`/accounts/${notification.getIn(['account', 'id'])}`);\n  }\n\n  handleMention = e => {\n    e.preventDefault();\n\n    const { notification, onMention } = this.props;\n    onMention(notification.get('account'), this.context.router.history);\n  }\n\n  handleHotkeyFavourite = () => {\n    const { status } = this.props;\n    if (status) this.props.onFavourite(status);\n  }\n\n  handleHotkeyBoost = e => {\n    const { status } = this.props;\n    if (status) this.props.onReblog(status, e);\n  }\n\n  handleHotkeyToggleHidden = () => {\n    const { status } = this.props;\n    if (status) this.props.onToggleHidden(status);\n  }\n\n  getHandlers () {\n    return {\n      reply: this.handleMention,\n      favourite: this.handleHotkeyFavourite,\n      boost: this.handleHotkeyBoost,\n      mention: this.handleMention,\n      open: this.handleOpen,\n      openProfile: this.handleOpenProfile,\n      moveUp: this.handleMoveUp,\n      moveDown: this.handleMoveDown,\n      toggleHidden: this.handleHotkeyToggleHidden,\n    };\n  }\n\n  renderFollow (notification, account, link) {\n    const { intl } = this.props;\n\n    return (\n      <HotKeys handlers={this.getHandlers()}>\n        <div className='notification notification-follow focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.follow, { name: account.get('acct') }), notification.get('created_at'))}>\n          <div className='notification__message'>\n            <div className='notification__favourite-icon-wrapper'>\n              <Icon id='user-plus' fixedWidth />\n            </div>\n\n            <span title={notification.get('created_at')}>\n              <FormattedMessage id='notification.follow' defaultMessage='{name} followed you' values={{ name: link }} />\n            </span>\n          </div>\n\n          <AccountContainer id={account.get('id')} hidden={this.props.hidden} />\n        </div>\n      </HotKeys>\n    );\n  }\n\n  renderFollowRequest (notification, account, link) {\n    const { intl } = this.props;\n\n    return (\n      <HotKeys handlers={this.getHandlers()}>\n        <div className='notification notification-follow-request focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.follow_request', defaultMessage: '{name} has requested to follow you' }, { name: account.get('acct') }), notification.get('created_at'))}>\n          <div className='notification__message'>\n            <div className='notification__favourite-icon-wrapper'>\n              <Icon id='user' fixedWidth />\n            </div>\n\n            <span title={notification.get('created_at')}>\n              <FormattedMessage id='notification.follow_request' defaultMessage='{name} has requested to follow you' values={{ name: link }} />\n            </span>\n          </div>\n\n          <FollowRequestContainer id={account.get('id')} withNote={false} hidden={this.props.hidden} />\n        </div>\n      </HotKeys>\n    );\n  }\n\n  renderMention (notification) {\n    return (\n      <StatusContainer\n        id={notification.get('status')}\n        withDismiss\n        hidden={this.props.hidden}\n        onMoveDown={this.handleMoveDown}\n        onMoveUp={this.handleMoveUp}\n        contextType='notifications'\n        getScrollPosition={this.props.getScrollPosition}\n        updateScrollBottom={this.props.updateScrollBottom}\n        cachedMediaWidth={this.props.cachedMediaWidth}\n        cacheMediaWidth={this.props.cacheMediaWidth}\n      />\n    );\n  }\n\n  renderFavourite (notification, link) {\n    const { intl } = this.props;\n\n    return (\n      <HotKeys handlers={this.getHandlers()}>\n        <div className='notification notification-favourite focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.favourite, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>\n          <div className='notification__message'>\n            <div className='notification__favourite-icon-wrapper'>\n              <Icon id='star' className='star-icon' fixedWidth />\n            </div>\n\n            <span title={notification.get('created_at')}>\n              <FormattedMessage id='notification.favourite' defaultMessage='{name} favourited your status' values={{ name: link }} />\n            </span>\n          </div>\n\n          <StatusContainer\n            id={notification.get('status')}\n            account={notification.get('account')}\n            muted\n            withDismiss\n            hidden={!!this.props.hidden}\n            getScrollPosition={this.props.getScrollPosition}\n            updateScrollBottom={this.props.updateScrollBottom}\n            cachedMediaWidth={this.props.cachedMediaWidth}\n            cacheMediaWidth={this.props.cacheMediaWidth}\n          />\n        </div>\n      </HotKeys>\n    );\n  }\n\n  renderReblog (notification, link) {\n    const { intl } = this.props;\n\n    return (\n      <HotKeys handlers={this.getHandlers()}>\n        <div className='notification notification-reblog focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.reblog, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>\n          <div className='notification__message'>\n            <div className='notification__favourite-icon-wrapper'>\n              <Icon id='retweet' fixedWidth />\n            </div>\n\n            <span title={notification.get('created_at')}>\n              <FormattedMessage id='notification.reblog' defaultMessage='{name} boosted your status' values={{ name: link }} />\n            </span>\n          </div>\n\n          <StatusContainer\n            id={notification.get('status')}\n            account={notification.get('account')}\n            muted\n            withDismiss\n            hidden={this.props.hidden}\n            getScrollPosition={this.props.getScrollPosition}\n            updateScrollBottom={this.props.updateScrollBottom}\n            cachedMediaWidth={this.props.cachedMediaWidth}\n            cacheMediaWidth={this.props.cacheMediaWidth}\n          />\n        </div>\n      </HotKeys>\n    );\n  }\n\n  renderPoll (notification, account) {\n    const { intl } = this.props;\n    const ownPoll  = me === account.get('id');\n    const message  = ownPoll ? intl.formatMessage(messages.ownPoll) : intl.formatMessage(messages.poll);\n\n    return (\n      <HotKeys handlers={this.getHandlers()}>\n        <div className='notification notification-poll focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, message, notification.get('created_at'))}>\n          <div className='notification__message'>\n            <div className='notification__favourite-icon-wrapper'>\n              <Icon id='tasks' fixedWidth />\n            </div>\n\n            <span title={notification.get('created_at')}>\n              {ownPoll ? (\n                <FormattedMessage id='notification.own_poll' defaultMessage='Your poll has ended' />\n              ) : (\n                <FormattedMessage id='notification.poll' defaultMessage='A poll you have voted in has ended' />\n              )}\n            </span>\n          </div>\n\n          <StatusContainer\n            id={notification.get('status')}\n            account={account}\n            muted\n            withDismiss\n            hidden={this.props.hidden}\n            getScrollPosition={this.props.getScrollPosition}\n            updateScrollBottom={this.props.updateScrollBottom}\n            cachedMediaWidth={this.props.cachedMediaWidth}\n            cacheMediaWidth={this.props.cacheMediaWidth}\n          />\n        </div>\n      </HotKeys>\n    );\n  }\n\n  render () {\n    const { notification } = this.props;\n    const account          = notification.get('account');\n    const displayNameHtml  = { __html: account.get('display_name_html') };\n    const link             = <bdi><Permalink className='notification__display-name' href={account.get('url')} title={account.get('acct')} to={`/accounts/${account.get('id')}`} dangerouslySetInnerHTML={displayNameHtml} /></bdi>;\n\n    switch(notification.get('type')) {\n    case 'follow':\n      return this.renderFollow(notification, account, link);\n    case 'follow_request':\n      return this.renderFollowRequest(notification, account, link);\n    case 'mention':\n      return this.renderMention(notification);\n    case 'favourite':\n      return this.renderFavourite(notification, link);\n    case 'reblog':\n      return this.renderReblog(notification, link);\n    case 'poll':\n      return this.renderPoll(notification, account);\n    }\n\n    return null;\n  }\n\n}\n","import { connect } from 'react-redux';\nimport { makeGetNotification, makeGetStatus } from '../../../selectors';\nimport Notification from '../components/notification';\nimport { openModal } from '../../../actions/modal';\nimport { mentionCompose } from '../../../actions/compose';\nimport {\n  reblog,\n  favourite,\n  unreblog,\n  unfavourite,\n} from '../../../actions/interactions';\nimport {\n  hideStatus,\n  revealStatus,\n} from '../../../actions/statuses';\nimport { boostModal } from '../../../initial_state';\n\nconst makeMapStateToProps = () => {\n  const getNotification = makeGetNotification();\n  const getStatus = makeGetStatus();\n\n  const mapStateToProps = (state, props) => {\n    const notification = getNotification(state, props.notification, props.accountId);\n    return {\n      notification: notification,\n      status: notification.get('status') ? getStatus(state, { id: notification.get('status') }) : null,\n    };\n  };\n\n  return mapStateToProps;\n};\n\nconst mapDispatchToProps = dispatch => ({\n  onMention: (account, router) => {\n    dispatch(mentionCompose(account, router));\n  },\n\n  onModalReblog (status) {\n    dispatch(reblog(status));\n  },\n\n  onReblog (status, e) {\n    if (status.get('reblogged')) {\n      dispatch(unreblog(status));\n    } else {\n      if (e.shiftKey || !boostModal) {\n        this.onModalReblog(status);\n      } else {\n        dispatch(openModal('BOOST', { status, onReblog: this.onModalReblog }));\n      }\n    }\n  },\n\n  onFavourite (status) {\n    if (status.get('favourited')) {\n      dispatch(unfavourite(status));\n    } else {\n      dispatch(favourite(status));\n    }\n  },\n\n  onToggleHidden (status) {\n    if (status.get('hidden')) {\n      dispatch(revealStatus(status.get('id')));\n    } else {\n      dispatch(hideStatus(status.get('id')));\n    }\n  },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(Notification);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage } from 'react-intl';\nimport Icon from 'mastodon/components/icon';\n\nexport default class ClearColumnButton extends React.PureComponent {\n\n  static propTypes = {\n    onClick: PropTypes.func.isRequired,\n  };\n\n  render () {\n    return (\n      <button className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.props.onClick}><Icon id='eraser' /> <FormattedMessage id='notifications.clear' defaultMessage='Clear notifications' /></button>\n    );\n  }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { FormattedMessage } from 'react-intl';\nimport ClearColumnButton from './clear_column_button';\nimport SettingToggle from './setting_toggle';\n\nexport default class ColumnSettings extends React.PureComponent {\n\n  static propTypes = {\n    settings: ImmutablePropTypes.map.isRequired,\n    pushSettings: ImmutablePropTypes.map.isRequired,\n    onChange: PropTypes.func.isRequired,\n    onClear: PropTypes.func.isRequired,\n  };\n\n  onPushChange = (path, checked) => {\n    this.props.onChange(['push', ...path], checked);\n  }\n\n  render () {\n    const { settings, pushSettings, onChange, onClear } = this.props;\n\n    const filterShowStr = <FormattedMessage id='notifications.column_settings.filter_bar.show' defaultMessage='Show' />;\n    const filterAdvancedStr = <FormattedMessage id='notifications.column_settings.filter_bar.advanced' defaultMessage='Display all categories' />;\n    const alertStr  = <FormattedMessage id='notifications.column_settings.alert' defaultMessage='Desktop notifications' />;\n    const showStr   = <FormattedMessage id='notifications.column_settings.show' defaultMessage='Show in column' />;\n    const soundStr  = <FormattedMessage id='notifications.column_settings.sound' defaultMessage='Play sound' />;\n\n    const showPushSettings = pushSettings.get('browserSupport') && pushSettings.get('isSubscribed');\n    const pushStr = showPushSettings && <FormattedMessage id='notifications.column_settings.push' defaultMessage='Push notifications' />;\n\n    return (\n      <div>\n        <div className='column-settings__row'>\n          <ClearColumnButton onClick={onClear} />\n        </div>\n\n        <div role='group' aria-labelledby='notifications-filter-bar'>\n          <span id='notifications-filter-bar' className='column-settings__section'>\n            <FormattedMessage id='notifications.column_settings.filter_bar.category' defaultMessage='Quick filter bar' />\n          </span>\n          <div className='column-settings__row'>\n            <SettingToggle id='show-filter-bar' prefix='notifications' settings={settings} settingPath={['quickFilter', 'show']} onChange={onChange} label={filterShowStr} />\n            <SettingToggle id='show-filter-bar' prefix='notifications' settings={settings} settingPath={['quickFilter', 'advanced']} onChange={onChange} label={filterAdvancedStr} />\n          </div>\n        </div>\n\n        <div role='group' aria-labelledby='notifications-follow'>\n          <span id='notifications-follow' className='column-settings__section'><FormattedMessage id='notifications.column_settings.follow' defaultMessage='New followers:' /></span>\n\n          <div className='column-settings__row'>\n            <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow']} onChange={onChange} label={alertStr} />\n            {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'follow']} onChange={this.onPushChange} label={pushStr} />}\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'follow']} onChange={onChange} label={showStr} />\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'follow']} onChange={onChange} label={soundStr} />\n          </div>\n        </div>\n\n        <div role='group' aria-labelledby='notifications-follow-request'>\n          <span id='notifications-follow-request' className='column-settings__section'><FormattedMessage id='notifications.column_settings.follow_request' defaultMessage='New follow requests:' /></span>\n\n          <div className='column-settings__row'>\n            <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow_request']} onChange={onChange} label={alertStr} />\n            {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'follow_request']} onChange={this.onPushChange} label={pushStr} />}\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'follow_request']} onChange={onChange} label={showStr} />\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'follow_request']} onChange={onChange} label={soundStr} />\n          </div>\n        </div>\n\n        <div role='group' aria-labelledby='notifications-favourite'>\n          <span id='notifications-favourite' className='column-settings__section'><FormattedMessage id='notifications.column_settings.favourite' defaultMessage='Favourites:' /></span>\n\n          <div className='column-settings__row'>\n            <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'favourite']} onChange={onChange} label={alertStr} />\n            {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'favourite']} onChange={this.onPushChange} label={pushStr} />}\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'favourite']} onChange={onChange} label={showStr} />\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'favourite']} onChange={onChange} label={soundStr} />\n          </div>\n        </div>\n\n        <div role='group' aria-labelledby='notifications-mention'>\n          <span id='notifications-mention' className='column-settings__section'><FormattedMessage id='notifications.column_settings.mention' defaultMessage='Mentions:' /></span>\n\n          <div className='column-settings__row'>\n            <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'mention']} onChange={onChange} label={alertStr} />\n            {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'mention']} onChange={this.onPushChange} label={pushStr} />}\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'mention']} onChange={onChange} label={showStr} />\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'mention']} onChange={onChange} label={soundStr} />\n          </div>\n        </div>\n\n        <div role='group' aria-labelledby='notifications-reblog'>\n          <span id='notifications-reblog' className='column-settings__section'><FormattedMessage id='notifications.column_settings.reblog' defaultMessage='Boosts:' /></span>\n\n          <div className='column-settings__row'>\n            <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'reblog']} onChange={onChange} label={alertStr} />\n            {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'reblog']} onChange={this.onPushChange} label={pushStr} />}\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'reblog']} onChange={onChange} label={showStr} />\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'reblog']} onChange={onChange} label={soundStr} />\n          </div>\n        </div>\n\n        <div role='group' aria-labelledby='notifications-poll'>\n          <span id='notifications-poll' className='column-settings__section'><FormattedMessage id='notifications.column_settings.poll' defaultMessage='Poll results:' /></span>\n\n          <div className='column-settings__row'>\n            <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'poll']} onChange={onChange} label={alertStr} />\n            {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'poll']} onChange={this.onPushChange} label={pushStr} />}\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'poll']} onChange={onChange} label={showStr} />\n            <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'poll']} onChange={onChange} label={soundStr} />\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n}\n","import { connect } from 'react-redux';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ColumnSettings from '../components/column_settings';\nimport { changeSetting } from '../../../actions/settings';\nimport { setFilter } from '../../../actions/notifications';\nimport { clearNotifications } from '../../../actions/notifications';\nimport { changeAlerts as changePushNotifications } from '../../../actions/push_notifications';\nimport { openModal } from '../../../actions/modal';\n\nconst messages = defineMessages({\n  clearMessage: { id: 'notifications.clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all your notifications?' },\n  clearConfirm: { id: 'notifications.clear', defaultMessage: 'Clear notifications' },\n});\n\nconst mapStateToProps = state => ({\n  settings: state.getIn(['settings', 'notifications']),\n  pushSettings: state.get('push_notifications'),\n});\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n\n  onChange (path, checked) {\n    if (path[0] === 'push') {\n      dispatch(changePushNotifications(path.slice(1), checked));\n    } else if (path[0] === 'quickFilter') {\n      dispatch(changeSetting(['notifications', ...path], checked));\n      dispatch(setFilter('all'));\n    } else {\n      dispatch(changeSetting(['notifications', ...path], checked));\n    }\n  },\n\n  onClear () {\n    dispatch(openModal('CONFIRM', {\n      message: intl.formatMessage(messages.clearMessage),\n      confirm: intl.formatMessage(messages.clearConfirm),\n      onConfirm: () => dispatch(clearNotifications()),\n    }));\n  },\n\n});\n\nexport default injectIntl(connect(mapStateToProps, mapDispatchToProps)(ColumnSettings));\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport Icon from 'mastodon/components/icon';\n\nconst tooltips = defineMessages({\n  mentions: { id: 'notifications.filter.mentions', defaultMessage: 'Mentions' },\n  favourites: { id: 'notifications.filter.favourites', defaultMessage: 'Favourites' },\n  boosts: { id: 'notifications.filter.boosts', defaultMessage: 'Boosts' },\n  polls: { id: 'notifications.filter.polls', defaultMessage: 'Poll results' },\n  follows: { id: 'notifications.filter.follows', defaultMessage: 'Follows' },\n});\n\nexport default @injectIntl\nclass FilterBar extends React.PureComponent {\n\n  static propTypes = {\n    selectFilter: PropTypes.func.isRequired,\n    selectedFilter: PropTypes.string.isRequired,\n    advancedMode: PropTypes.bool.isRequired,\n    intl: PropTypes.object.isRequired,\n  };\n\n  onClick (notificationType) {\n    return () => this.props.selectFilter(notificationType);\n  }\n\n  render () {\n    const { selectedFilter, advancedMode, intl } = this.props;\n    const renderedElement = !advancedMode ? (\n      <div className='notification__filter-bar'>\n        <button\n          className={selectedFilter === 'all' ? 'active' : ''}\n          onClick={this.onClick('all')}\n        >\n          <FormattedMessage\n            id='notifications.filter.all'\n            defaultMessage='All'\n          />\n        </button>\n        <button\n          className={selectedFilter === 'mention' ? 'active' : ''}\n          onClick={this.onClick('mention')}\n        >\n          <FormattedMessage\n            id='notifications.filter.mentions'\n            defaultMessage='Mentions'\n          />\n        </button>\n      </div>\n    ) : (\n      <div className='notification__filter-bar'>\n        <button\n          className={selectedFilter === 'all' ? 'active' : ''}\n          onClick={this.onClick('all')}\n        >\n          <FormattedMessage\n            id='notifications.filter.all'\n            defaultMessage='All'\n          />\n        </button>\n        <button\n          className={selectedFilter === 'mention' ? 'active' : ''}\n          onClick={this.onClick('mention')}\n          title={intl.formatMessage(tooltips.mentions)}\n        >\n          <Icon id='reply-all' fixedWidth />\n        </button>\n        <button\n          className={selectedFilter === 'favourite' ? 'active' : ''}\n          onClick={this.onClick('favourite')}\n          title={intl.formatMessage(tooltips.favourites)}\n        >\n          <Icon id='star' fixedWidth />\n        </button>\n        <button\n          className={selectedFilter === 'reblog' ? 'active' : ''}\n          onClick={this.onClick('reblog')}\n          title={intl.formatMessage(tooltips.boosts)}\n        >\n          <Icon id='retweet' fixedWidth />\n        </button>\n        <button\n          className={selectedFilter === 'poll' ? 'active' : ''}\n          onClick={this.onClick('poll')}\n          title={intl.formatMessage(tooltips.polls)}\n        >\n          <Icon id='tasks' fixedWidth />\n        </button>\n        <button\n          className={selectedFilter === 'follow' ? 'active' : ''}\n          onClick={this.onClick('follow')}\n          title={intl.formatMessage(tooltips.follows)}\n        >\n          <Icon id='user-plus' fixedWidth />\n        </button>\n      </div>\n    );\n    return renderedElement;\n  }\n\n}\n","import { connect } from 'react-redux';\nimport FilterBar from '../components/filter_bar';\nimport { setFilter } from '../../../actions/notifications';\n\nconst makeMapStateToProps = state => ({\n  selectedFilter: state.getIn(['settings', 'notifications', 'quickFilter', 'active']),\n  advancedMode: state.getIn(['settings', 'notifications', 'quickFilter', 'advanced']),\n});\n\nconst mapDispatchToProps = (dispatch) => ({\n  selectFilter (newActiveFilter) {\n    dispatch(setFilter(newActiveFilter));\n  },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(FilterBar);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { expandNotifications, scrollTopNotifications, loadPending, mountNotifications, unmountNotifications } from '../../actions/notifications';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport NotificationContainer from './containers/notification_container';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport FilterBarContainer from './containers/filter_bar_container';\nimport { createSelector } from 'reselect';\nimport { List as ImmutableList } from 'immutable';\nimport { debounce } from 'lodash';\nimport ScrollableList from '../../components/scrollable_list';\nimport LoadGap from '../../components/load_gap';\n\nconst messages = defineMessages({\n  title: { id: 'column.notifications', defaultMessage: 'Notifications' },\n});\n\nconst getNotifications = createSelector([\n  state => state.getIn(['settings', 'notifications', 'quickFilter', 'show']),\n  state => state.getIn(['settings', 'notifications', 'quickFilter', 'active']),\n  state => ImmutableList(state.getIn(['settings', 'notifications', 'shows']).filter(item => !item).keys()),\n  state => state.getIn(['notifications', 'items']),\n], (showFilterBar, allowedType, excludedTypes, notifications) => {\n  if (!showFilterBar || allowedType === 'all') {\n    // used if user changed the notification settings after loading the notifications from the server\n    // otherwise a list of notifications will come pre-filtered from the backend\n    // we need to turn it off for FilterBar in order not to block ourselves from seeing a specific category\n    return notifications.filterNot(item => item !== null && excludedTypes.includes(item.get('type')));\n  }\n  return notifications.filter(item => item !== null && allowedType === item.get('type'));\n});\n\nconst mapStateToProps = state => ({\n  showFilterBar: state.getIn(['settings', 'notifications', 'quickFilter', 'show']),\n  notifications: getNotifications(state),\n  isLoading: state.getIn(['notifications', 'isLoading'], true),\n  isUnread: state.getIn(['notifications', 'unread']) > 0 || state.getIn(['notifications', 'pendingItems']).size > 0,\n  hasMore: state.getIn(['notifications', 'hasMore']),\n  numPending: state.getIn(['notifications', 'pendingItems'], ImmutableList()).size,\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Notifications extends React.PureComponent {\n\n  static propTypes = {\n    columnId: PropTypes.string,\n    notifications: ImmutablePropTypes.list.isRequired,\n    showFilterBar: PropTypes.bool.isRequired,\n    dispatch: PropTypes.func.isRequired,\n    shouldUpdateScroll: PropTypes.func,\n    intl: PropTypes.object.isRequired,\n    isLoading: PropTypes.bool,\n    isUnread: PropTypes.bool,\n    multiColumn: PropTypes.bool,\n    hasMore: PropTypes.bool,\n    numPending: PropTypes.number,\n  };\n\n  static defaultProps = {\n    trackScroll: true,\n  };\n\n  componentWillMount() {\n    this.props.dispatch(mountNotifications());\n  }\n\n  componentWillUnmount () {\n    this.handleLoadOlder.cancel();\n    this.handleScrollToTop.cancel();\n    this.handleScroll.cancel();\n    this.props.dispatch(scrollTopNotifications(false));\n    this.props.dispatch(unmountNotifications());\n  }\n\n  handleLoadGap = (maxId) => {\n    this.props.dispatch(expandNotifications({ maxId }));\n  };\n\n  handleLoadOlder = debounce(() => {\n    const last = this.props.notifications.last();\n    this.props.dispatch(expandNotifications({ maxId: last && last.get('id') }));\n  }, 300, { leading: true });\n\n  handleLoadPending = () => {\n    this.props.dispatch(loadPending());\n  };\n\n  handleScrollToTop = debounce(() => {\n    this.props.dispatch(scrollTopNotifications(true));\n  }, 100);\n\n  handleScroll = debounce(() => {\n    this.props.dispatch(scrollTopNotifications(false));\n  }, 100);\n\n  handlePin = () => {\n    const { columnId, dispatch } = this.props;\n\n    if (columnId) {\n      dispatch(removeColumn(columnId));\n    } else {\n      dispatch(addColumn('NOTIFICATIONS', {}));\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  setColumnRef = c => {\n    this.column = c;\n  }\n\n  handleMoveUp = id => {\n    const elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) - 1;\n    this._selectChild(elementIndex, true);\n  }\n\n  handleMoveDown = id => {\n    const elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) + 1;\n    this._selectChild(elementIndex, false);\n  }\n\n  _selectChild (index, align_top) {\n    const container = this.column.node;\n    const element = container.querySelector(`article:nth-of-type(${index + 1}) .focusable`);\n\n    if (element) {\n      if (align_top && container.scrollTop > element.offsetTop) {\n        element.scrollIntoView(true);\n      } else if (!align_top && container.scrollTop + container.clientHeight < element.offsetTop + element.offsetHeight) {\n        element.scrollIntoView(false);\n      }\n      element.focus();\n    }\n  }\n\n  render () {\n    const { intl, notifications, shouldUpdateScroll, isLoading, isUnread, columnId, multiColumn, hasMore, numPending, showFilterBar } = this.props;\n    const pinned = !!columnId;\n    const emptyMessage = <FormattedMessage id='empty_column.notifications' defaultMessage=\"You don't have any notifications yet. Interact with others to start the conversation.\" />;\n\n    let scrollableContent = null;\n\n    const filterBarContainer = showFilterBar\n      ? (<FilterBarContainer />)\n      : null;\n\n    if (isLoading && this.scrollableContent) {\n      scrollableContent = this.scrollableContent;\n    } else if (notifications.size > 0 || hasMore) {\n      scrollableContent = notifications.map((item, index) => item === null ? (\n        <LoadGap\n          key={'gap:' + notifications.getIn([index + 1, 'id'])}\n          disabled={isLoading}\n          maxId={index > 0 ? notifications.getIn([index - 1, 'id']) : null}\n          onClick={this.handleLoadGap}\n        />\n      ) : (\n        <NotificationContainer\n          key={item.get('id')}\n          notification={item}\n          accountId={item.get('account')}\n          onMoveUp={this.handleMoveUp}\n          onMoveDown={this.handleMoveDown}\n        />\n      ));\n    } else {\n      scrollableContent = null;\n    }\n\n    this.scrollableContent = scrollableContent;\n\n    const scrollContainer = (\n      <ScrollableList\n        scrollKey={`notifications-${columnId}`}\n        trackScroll={!pinned}\n        isLoading={isLoading}\n        showLoading={isLoading && notifications.size === 0}\n        hasMore={hasMore}\n        numPending={numPending}\n        emptyMessage={emptyMessage}\n        onLoadMore={this.handleLoadOlder}\n        onLoadPending={this.handleLoadPending}\n        onScrollToTop={this.handleScrollToTop}\n        onScroll={this.handleScroll}\n        shouldUpdateScroll={shouldUpdateScroll}\n        bindToDocument={!multiColumn}\n      >\n        {scrollableContent}\n      </ScrollableList>\n    );\n\n    return (\n      <Column bindToDocument={!multiColumn} ref={this.setColumnRef} label={intl.formatMessage(messages.title)}>\n        <ColumnHeader\n          icon='bell'\n          active={isUnread}\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        >\n          <ColumnSettingsContainer />\n        </ColumnHeader>\n        {filterBarContainer}\n        {scrollContainer}\n      </Column>\n    );\n  }\n\n}\n"],"sourceRoot":""}
\ No newline at end of file