Merge branch 'feature/mastofe-admin-scope' into 'develop'
[akkoma] / priv / static / packs / features / direct_timeline.js.map
index 0caf2661d04a4208d2df407e294bb9b22384dec3..d0ef3c943e867f3f91de8f427bf6f22df1bb8d45 100644 (file)
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/components/conversation.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/components/conversations_list.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/containers/conversations_list_container.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/index.js"],"names":["Conversation","_this","context","router","_this$props","props","lastStatusId","unread","markRead","history","push","onMoveUp","conversationId","onMoveDown","render","_this$props2","this","accounts","Object","jsx","status_container","id","otherAccounts","handleHotkeyMoveUp","handleHotkeyMoveDown","onClick","handleClick","ImmutablePureComponent","PropTypes","object","string","isRequired","ImmutablePropTypes","list","bool","func","connect","state","_ref","conversation","getIn","find","x","get","map","accountId","dispatch","_ref2","markConversationRead","ConversationsList","conversations","findIndex","elementIndex","getCurrentIndex","_selectChild","c","node","debounce_default","last","onLoadMore","leading","index","element","querySelector","focus","_this2","other","objectWithoutPropertiesLoose","react_default","a","createElement","scrollable_list","esm_extends","handleLoadOlder","scrollKey","ref","setRef","item","conversation_container","handleMoveUp","handleMoveDown","hasMore","isLoading","shouldUpdateScroll","maxId","expandConversations","messages","defineMessages","title","defaultMessage","DirectTimeline","injectIntl","columnId","removeColumn","addColumn","dir","moveColumn","column","scrollTop","componentDidMount","mountConversations","disconnect","connectDirectStream","componentWillUnmount","unmountConversations","_this$props3","intl","hasUnread","multiColumn","pinned","label","formatMessage","column_header","icon","active","onPin","handlePin","onMove","handleMove","handleHeaderClick","conversations_list_container","trackScroll","timelineId","handleLoadMore","emptyMessage","index_es","React","PureComponent"],"mappings":"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","file":"features/direct_timeline.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport StatusContainer from '../../../containers/status_container';\n\nexport default class Conversation extends ImmutablePureComponent {\n\n  static contextTypes = {\n    router: PropTypes.object,\n  };\n\n  static propTypes = {\n    conversationId: PropTypes.string.isRequired,\n    accounts: ImmutablePropTypes.list.isRequired,\n    lastStatusId: PropTypes.string,\n    unread:PropTypes.bool.isRequired,\n    onMoveUp: PropTypes.func,\n    onMoveDown: PropTypes.func,\n    markRead: PropTypes.func.isRequired,\n  };\n\n  handleClick = () => {\n    if (!this.context.router) {\n      return;\n    }\n\n    const { lastStatusId, unread, markRead } = this.props;\n\n    if (unread) {\n      markRead();\n    }\n\n    this.context.router.history.push(`/statuses/${lastStatusId}`);\n  }\n\n  handleHotkeyMoveUp = () => {\n    this.props.onMoveUp(this.props.conversationId);\n  }\n\n  handleHotkeyMoveDown = () => {\n    this.props.onMoveDown(this.props.conversationId);\n  }\n\n  render () {\n    const { accounts, lastStatusId, unread } = this.props;\n\n    if (lastStatusId === null) {\n      return null;\n    }\n\n    return (\n      <StatusContainer\n        id={lastStatusId}\n        unread={unread}\n        otherAccounts={accounts}\n        onMoveUp={this.handleHotkeyMoveUp}\n        onMoveDown={this.handleHotkeyMoveDown}\n        onClick={this.handleClick}\n      />\n    );\n  }\n\n}\n","import { connect } from 'react-redux';\nimport Conversation from '../components/conversation';\nimport { markConversationRead } from '../../../actions/conversations';\n\nconst mapStateToProps = (state, { conversationId }) => {\n  const conversation = state.getIn(['conversations', 'items']).find(x => x.get('id') === conversationId);\n\n  return {\n    accounts: conversation.get('accounts').map(accountId => state.getIn(['accounts', accountId], null)),\n    unread: conversation.get('unread'),\n    lastStatusId: conversation.get('last_status', null),\n  };\n};\n\nconst mapDispatchToProps = (dispatch, { conversationId }) => ({\n  markRead: () => dispatch(markConversationRead(conversationId)),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Conversation);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ConversationContainer from '../containers/conversation_container';\nimport ScrollableList from '../../../components/scrollable_list';\nimport { debounce } from 'lodash';\n\nexport default class ConversationsList extends ImmutablePureComponent {\n\n  static propTypes = {\n    conversations: ImmutablePropTypes.list.isRequired,\n    hasMore: PropTypes.bool,\n    isLoading: PropTypes.bool,\n    onLoadMore: PropTypes.func,\n    shouldUpdateScroll: PropTypes.func,\n  };\n\n  getCurrentIndex = id => this.props.conversations.findIndex(x => x.get('id') === id)\n\n  handleMoveUp = id => {\n    const elementIndex = this.getCurrentIndex(id) - 1;\n    this._selectChild(elementIndex);\n  }\n\n  handleMoveDown = id => {\n    const elementIndex = this.getCurrentIndex(id) + 1;\n    this._selectChild(elementIndex);\n  }\n\n  _selectChild (index) {\n    const element = this.node.node.querySelector(`article:nth-of-type(${index + 1}) .focusable`);\n\n    if (element) {\n      element.focus();\n    }\n  }\n\n  setRef = c => {\n    this.node = c;\n  }\n\n  handleLoadOlder = debounce(() => {\n    const last = this.props.conversations.last();\n\n    if (last && last.get('last_status')) {\n      this.props.onLoadMore(last.get('last_status'));\n    }\n  }, 300, { leading: true })\n\n  render () {\n    const { conversations, onLoadMore, ...other } = this.props;\n\n    return (\n      <ScrollableList {...other} onLoadMore={onLoadMore && this.handleLoadOlder} scrollKey='direct' ref={this.setRef}>\n        {conversations.map(item => (\n          <ConversationContainer\n            key={item.get('id')}\n            conversationId={item.get('id')}\n            onMoveUp={this.handleMoveUp}\n            onMoveDown={this.handleMoveDown}\n          />\n        ))}\n      </ScrollableList>\n    );\n  }\n\n}\n","import { connect } from 'react-redux';\nimport ConversationsList from '../components/conversations_list';\nimport { expandConversations } from '../../../actions/conversations';\n\nconst mapStateToProps = state => ({\n  conversations: state.getIn(['conversations', 'items']),\n  isLoading: state.getIn(['conversations', 'isLoading'], true),\n  hasMore: state.getIn(['conversations', 'hasMore'], false),\n});\n\nconst mapDispatchToProps = dispatch => ({\n  onLoadMore: maxId => dispatch(expandConversations({ maxId })),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ConversationsList);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { mountConversations, unmountConversations, expandConversations } from '../../actions/conversations';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport { connectDirectStream } from '../../actions/streaming';\nimport ConversationsListContainer from './containers/conversations_list_container';\n\nconst messages = defineMessages({\n  title: { id: 'column.direct', defaultMessage: 'Direct messages' },\n});\n\nexport default @connect()\n@injectIntl\nclass DirectTimeline extends React.PureComponent {\n\n  static propTypes = {\n    dispatch: PropTypes.func.isRequired,\n    shouldUpdateScroll: PropTypes.func,\n    columnId: PropTypes.string,\n    intl: PropTypes.object.isRequired,\n    hasUnread: PropTypes.bool,\n    multiColumn: PropTypes.bool,\n  };\n\n  handlePin = () => {\n    const { columnId, dispatch } = this.props;\n\n    if (columnId) {\n      dispatch(removeColumn(columnId));\n    } else {\n      dispatch(addColumn('DIRECT', {}));\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  componentDidMount () {\n    const { dispatch } = this.props;\n\n    dispatch(mountConversations());\n    dispatch(expandConversations());\n    this.disconnect = dispatch(connectDirectStream());\n  }\n\n  componentWillUnmount () {\n    this.props.dispatch(unmountConversations());\n\n    if (this.disconnect) {\n      this.disconnect();\n      this.disconnect = null;\n    }\n  }\n\n  setRef = c => {\n    this.column = c;\n  }\n\n  handleLoadMore = maxId => {\n    this.props.dispatch(expandConversations({ maxId }));\n  }\n\n  render () {\n    const { intl, hasUnread, columnId, multiColumn, shouldUpdateScroll } = this.props;\n    const pinned = !!columnId;\n\n    return (\n      <Column ref={this.setRef} label={intl.formatMessage(messages.title)}>\n        <ColumnHeader\n          icon='envelope'\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        />\n\n        <ConversationsListContainer\n          trackScroll={!pinned}\n          scrollKey={`direct_timeline-${columnId}`}\n          timelineId='direct'\n          onLoadMore={this.handleLoadMore}\n          emptyMessage={<FormattedMessage id='empty_column.direct' defaultMessage=\"You don't have any direct messages yet. When you send or receive one, it will show up here.\" />}\n          shouldUpdateScroll={shouldUpdateScroll}\n        />\n      </Column>\n    );\n  }\n\n}\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/components/conversation.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/components/conversations_list.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/containers/conversations_list_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/index.js"],"names":["messages","defineMessages","more","open","reply","markAsRead","delete","muteConversation","unmuteConversation","Conversation","injectIntl","target","src","getAttribute","context","router","props","lastStatus","unread","markRead","history","push","get","onMoveUp","conversationId","onMoveDown","onMute","onToggleHidden","c","namesNode","_updateEmojis","node","this","autoPlayGif","emojis","querySelectorAll","i","length","emoji","classList","contains","add","addEventListener","handleEmojiMouseEnter","handleEmojiMouseLeave","componentDidMount","componentDidUpdate","render","accounts","intl","menu","text","formatMessage","action","handleClick","handleConversationMute","handleMarkAsRead","handleDelete","names","map","a","to","href","title","className","dangerouslySetInnerHTML","__html","reduce","prev","cur","handlers","handleReply","moveUp","handleHotkeyMoveUp","moveDown","handleHotkeyMoveDown","toggleHidden","handleShowMore","classNames","tabIndex","size","timestamp","ref","setNamesRef","id","defaultMessage","values","status","onClick","expanded","onExpandedToggle","collapsable","compact","media","icon","items","direction","ImmutablePureComponent","PropTypes","object","string","isRequired","ImmutablePropTypes","list","bool","func","replyConfirm","replyMessage","connect","getStatus","makeGetStatus","state","conversation","getIn","find","x","lastStatusId","accountId","dispatch","markConversationRead","_","getState","trim","openModal","message","confirm","onConfirm","replyCompose","deleteConversation","unmuteStatus","muteStatus","revealStatus","hideStatus","ConversationsList","conversations","findIndex","elementIndex","getCurrentIndex","_selectChild","last","onLoadMore","leading","index","align_top","container","element","querySelector","scrollTop","offsetTop","scrollIntoView","clientHeight","offsetHeight","focus","other","handleLoadOlder","scrollKey","setRef","item","handleMoveUp","handleMoveDown","hasMore","isLoading","shouldUpdateScroll","maxId","expandConversations","DirectTimeline","columnId","removeColumn","addColumn","dir","moveColumn","column","mountConversations","disconnect","connectDirectStream","componentWillUnmount","unmountConversations","hasUnread","multiColumn","pinned","bindToDocument","label","active","onPin","handlePin","onMove","handleMove","handleHeaderClick","trackScroll","timelineId","handleLoadMore","emptyMessage","React","PureComponent"],"mappings":"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","file":"features/direct_timeline.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport StatusContent from 'mastodon/components/status_content';\nimport AttachmentList from 'mastodon/components/attachment_list';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container';\nimport AvatarComposite from 'mastodon/components/avatar_composite';\nimport Permalink from 'mastodon/components/permalink';\nimport IconButton from 'mastodon/components/icon_button';\nimport RelativeTimestamp from 'mastodon/components/relative_timestamp';\nimport { HotKeys } from 'react-hotkeys';\nimport { autoPlayGif } from 'mastodon/initial_state';\nimport classNames from 'classnames';\n\nconst messages = defineMessages({\n  more: { id: 'status.more', defaultMessage: 'More' },\n  open: { id: 'conversation.open', defaultMessage: 'View conversation' },\n  reply: { id: 'status.reply', defaultMessage: 'Reply' },\n  markAsRead: { id: 'conversation.mark_as_read', defaultMessage: 'Mark as read' },\n  delete: { id: 'conversation.delete', defaultMessage: 'Delete conversation' },\n  muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },\n  unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },\n});\n\nexport default @injectIntl\nclass Conversation extends ImmutablePureComponent {\n\n  static contextTypes = {\n    router: PropTypes.object,\n  };\n\n  static propTypes = {\n    conversationId: PropTypes.string.isRequired,\n    accounts: ImmutablePropTypes.list.isRequired,\n    lastStatus: ImmutablePropTypes.map,\n    unread:PropTypes.bool.isRequired,\n    onMoveUp: PropTypes.func,\n    onMoveDown: PropTypes.func,\n    markRead: PropTypes.func.isRequired,\n    delete: PropTypes.func.isRequired,\n    intl: PropTypes.object.isRequired,\n  };\n\n  _updateEmojis () {\n    const node = this.namesNode;\n\n    if (!node || autoPlayGif) {\n      return;\n    }\n\n    const emojis = node.querySelectorAll('.custom-emoji');\n\n    for (var i = 0; i < emojis.length; i++) {\n      let emoji = emojis[i];\n      if (emoji.classList.contains('status-emoji')) {\n        continue;\n      }\n      emoji.classList.add('status-emoji');\n\n      emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false);\n      emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false);\n    }\n  }\n\n  componentDidMount () {\n    this._updateEmojis();\n  }\n\n  componentDidUpdate () {\n    this._updateEmojis();\n  }\n\n  handleEmojiMouseEnter = ({ target }) => {\n    target.src = target.getAttribute('data-original');\n  }\n\n  handleEmojiMouseLeave = ({ target }) => {\n    target.src = target.getAttribute('data-static');\n  }\n\n  handleClick = () => {\n    if (!this.context.router) {\n      return;\n    }\n\n    const { lastStatus, unread, markRead } = this.props;\n\n    if (unread) {\n      markRead();\n    }\n\n    this.context.router.history.push(`/statuses/${lastStatus.get('id')}`);\n  }\n\n  handleMarkAsRead = () => {\n    this.props.markRead();\n  }\n\n  handleReply = () => {\n    this.props.reply(this.props.lastStatus, this.context.router.history);\n  }\n\n  handleDelete = () => {\n    this.props.delete();\n  }\n\n  handleHotkeyMoveUp = () => {\n    this.props.onMoveUp(this.props.conversationId);\n  }\n\n  handleHotkeyMoveDown = () => {\n    this.props.onMoveDown(this.props.conversationId);\n  }\n\n  handleConversationMute = () => {\n    this.props.onMute(this.props.lastStatus);\n  }\n\n  handleShowMore = () => {\n    this.props.onToggleHidden(this.props.lastStatus);\n  }\n\n  setNamesRef = (c) => {\n    this.namesNode = c;\n  }\n\n  render () {\n    const { accounts, lastStatus, unread, intl } = this.props;\n\n    if (lastStatus === null) {\n      return null;\n    }\n\n    const menu = [\n      { text: intl.formatMessage(messages.open), action: this.handleClick },\n      null,\n    ];\n\n    menu.push({ text: intl.formatMessage(lastStatus.get('muted') ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMute });\n\n    if (unread) {\n      menu.push({ text: intl.formatMessage(messages.markAsRead), action: this.handleMarkAsRead });\n      menu.push(null);\n    }\n\n    menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDelete });\n\n    const names = accounts.map(a => <Permalink to={`/accounts/${a.get('id')}`} href={a.get('url')} key={a.get('id')} title={a.get('acct')}><bdi><strong className='display-name__html' dangerouslySetInnerHTML={{ __html: a.get('display_name_html') }} /></bdi></Permalink>).reduce((prev, cur) => [prev, ', ', cur]);\n\n    const handlers = {\n      reply: this.handleReply,\n      open: this.handleClick,\n      moveUp: this.handleHotkeyMoveUp,\n      moveDown: this.handleHotkeyMoveDown,\n      toggleHidden: this.handleShowMore,\n    };\n\n    return (\n      <HotKeys handlers={handlers}>\n        <div className={classNames('conversation focusable muted', { 'conversation--unread': unread })} tabIndex='0'>\n          <div className='conversation__avatar'>\n            <AvatarComposite accounts={accounts} size={48} />\n          </div>\n\n          <div className='conversation__content'>\n            <div className='conversation__content__info'>\n              <div className='conversation__content__relative-time'>\n                {unread && <span className='conversation__unread' />} <RelativeTimestamp timestamp={lastStatus.get('created_at')} />\n              </div>\n\n              <div className='conversation__content__names' ref={this.setNamesRef}>\n                <FormattedMessage id='conversation.with' defaultMessage='With {names}' values={{ names: <span>{names}</span> }} />\n              </div>\n            </div>\n\n            <StatusContent\n              status={lastStatus}\n              onClick={this.handleClick}\n              expanded={!lastStatus.get('hidden')}\n              onExpandedToggle={this.handleShowMore}\n              collapsable\n            />\n\n            {lastStatus.get('media_attachments').size > 0 && (\n              <AttachmentList\n                compact\n                media={lastStatus.get('media_attachments')}\n              />\n            )}\n\n            <div className='status__action-bar'>\n              <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.reply)} icon='reply' onClick={this.handleReply} />\n\n              <div className='status__action-bar-dropdown'>\n                <DropdownMenuContainer status={lastStatus} items={menu} icon='ellipsis-h' size={18} direction='right' title={intl.formatMessage(messages.more)} />\n              </div>\n            </div>\n          </div>\n        </div>\n      </HotKeys>\n    );\n  }\n\n}\n","import { connect } from 'react-redux';\nimport Conversation from '../components/conversation';\nimport { markConversationRead, deleteConversation } from 'mastodon/actions/conversations';\nimport { makeGetStatus } from 'mastodon/selectors';\nimport { replyCompose } from 'mastodon/actions/compose';\nimport { openModal } from 'mastodon/actions/modal';\nimport { muteStatus, unmuteStatus, hideStatus, revealStatus } from 'mastodon/actions/statuses';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n  replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },\n  replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },\n});\n\nconst mapStateToProps = () => {\n  const getStatus = makeGetStatus();\n\n  return (state, { conversationId }) => {\n    const conversation = state.getIn(['conversations', 'items']).find(x => x.get('id') === conversationId);\n    const lastStatusId = conversation.get('last_status', null);\n\n    return {\n      accounts: conversation.get('accounts').map(accountId => state.getIn(['accounts', accountId], null)),\n      unread: conversation.get('unread'),\n      lastStatus: lastStatusId && getStatus(state, { id: lastStatusId }),\n    };\n  };\n};\n\nconst mapDispatchToProps = (dispatch, { intl, conversationId }) => ({\n\n  markRead () {\n    dispatch(markConversationRead(conversationId));\n  },\n\n  reply (status, router) {\n    dispatch((_, getState) => {\n      let state = getState();\n\n      if (state.getIn(['compose', 'text']).trim().length !== 0) {\n        dispatch(openModal('CONFIRM', {\n          message: intl.formatMessage(messages.replyMessage),\n          confirm: intl.formatMessage(messages.replyConfirm),\n          onConfirm: () => dispatch(replyCompose(status, router)),\n        }));\n      } else {\n        dispatch(replyCompose(status, router));\n      }\n    });\n  },\n\n  delete () {\n    dispatch(deleteConversation(conversationId));\n  },\n\n  onMute (status) {\n    if (status.get('muted')) {\n      dispatch(unmuteStatus(status.get('id')));\n    } else {\n      dispatch(muteStatus(status.get('id')));\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});\n\nexport default injectIntl(connect(mapStateToProps, mapDispatchToProps)(Conversation));\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ConversationContainer from '../containers/conversation_container';\nimport ScrollableList from '../../../components/scrollable_list';\nimport { debounce } from 'lodash';\n\nexport default class ConversationsList extends ImmutablePureComponent {\n\n  static propTypes = {\n    conversations: ImmutablePropTypes.list.isRequired,\n    hasMore: PropTypes.bool,\n    isLoading: PropTypes.bool,\n    onLoadMore: PropTypes.func,\n    shouldUpdateScroll: PropTypes.func,\n  };\n\n  getCurrentIndex = id => this.props.conversations.findIndex(x => x.get('id') === id)\n\n  handleMoveUp = id => {\n    const elementIndex = this.getCurrentIndex(id) - 1;\n    this._selectChild(elementIndex, true);\n  }\n\n  handleMoveDown = id => {\n    const elementIndex = this.getCurrentIndex(id) + 1;\n    this._selectChild(elementIndex, false);\n  }\n\n  _selectChild (index, align_top) {\n    const container = this.node.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  setRef = c => {\n    this.node = c;\n  }\n\n  handleLoadOlder = debounce(() => {\n    const last = this.props.conversations.last();\n\n    if (last && last.get('last_status')) {\n      this.props.onLoadMore(last.get('last_status'));\n    }\n  }, 300, { leading: true })\n\n  render () {\n    const { conversations, onLoadMore, ...other } = this.props;\n\n    return (\n      <ScrollableList {...other} onLoadMore={onLoadMore && this.handleLoadOlder} scrollKey='direct' ref={this.setRef}>\n        {conversations.map(item => (\n          <ConversationContainer\n            key={item.get('id')}\n            conversationId={item.get('id')}\n            onMoveUp={this.handleMoveUp}\n            onMoveDown={this.handleMoveDown}\n          />\n        ))}\n      </ScrollableList>\n    );\n  }\n\n}\n","import { connect } from 'react-redux';\nimport ConversationsList from '../components/conversations_list';\nimport { expandConversations } from '../../../actions/conversations';\n\nconst mapStateToProps = state => ({\n  conversations: state.getIn(['conversations', 'items']),\n  isLoading: state.getIn(['conversations', 'isLoading'], true),\n  hasMore: state.getIn(['conversations', 'hasMore'], false),\n});\n\nconst mapDispatchToProps = dispatch => ({\n  onLoadMore: maxId => dispatch(expandConversations({ maxId })),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ConversationsList);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { mountConversations, unmountConversations, expandConversations } from '../../actions/conversations';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport { connectDirectStream } from '../../actions/streaming';\nimport ConversationsListContainer from './containers/conversations_list_container';\n\nconst messages = defineMessages({\n  title: { id: 'column.direct', defaultMessage: 'Direct messages' },\n});\n\nexport default @connect()\n@injectIntl\nclass DirectTimeline extends React.PureComponent {\n\n  static propTypes = {\n    dispatch: PropTypes.func.isRequired,\n    shouldUpdateScroll: PropTypes.func,\n    columnId: PropTypes.string,\n    intl: PropTypes.object.isRequired,\n    hasUnread: PropTypes.bool,\n    multiColumn: PropTypes.bool,\n  };\n\n  handlePin = () => {\n    const { columnId, dispatch } = this.props;\n\n    if (columnId) {\n      dispatch(removeColumn(columnId));\n    } else {\n      dispatch(addColumn('DIRECT', {}));\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  componentDidMount () {\n    const { dispatch } = this.props;\n\n    dispatch(mountConversations());\n    dispatch(expandConversations());\n    this.disconnect = dispatch(connectDirectStream());\n  }\n\n  componentWillUnmount () {\n    this.props.dispatch(unmountConversations());\n\n    if (this.disconnect) {\n      this.disconnect();\n      this.disconnect = null;\n    }\n  }\n\n  setRef = c => {\n    this.column = c;\n  }\n\n  handleLoadMore = maxId => {\n    this.props.dispatch(expandConversations({ maxId }));\n  }\n\n  render () {\n    const { intl, hasUnread, columnId, multiColumn, shouldUpdateScroll } = this.props;\n    const pinned = !!columnId;\n\n    return (\n      <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n        <ColumnHeader\n          icon='envelope'\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        />\n\n        <ConversationsListContainer\n          trackScroll={!pinned}\n          scrollKey={`direct_timeline-${columnId}`}\n          timelineId='direct'\n          onLoadMore={this.handleLoadMore}\n          emptyMessage={<FormattedMessage id='empty_column.direct' defaultMessage=\"You don't have any direct messages yet. When you send or receive one, it will show up here.\" />}\n          shouldUpdateScroll={shouldUpdateScroll}\n        />\n      </Column>\n    );\n  }\n\n}\n"],"sourceRoot":""}
\ No newline at end of file