_ = require 'underscore' React = require 'react' classNames = require 'classnames' {ListTabular, MultiselectList, RetinaImg} = require 'nylas-component-kit' {timestamp, subject} = require './formatting-utils' {Actions, Utils, Thread, WorkspaceStore, NamespaceStore} = require 'nylas-exports' ThreadListParticipants = require './thread-list-participants' ThreadListQuickActions = require './thread-list-quick-actions' ThreadListStore = require './thread-list-store' ThreadListIcon = require './thread-list-icon' EmptyState = require './empty-state' class ThreadListScrollTooltip extends React.Component @displayName: 'ThreadListScrollTooltip' @propTypes: viewportCenter: React.PropTypes.number.isRequired totalHeight: React.PropTypes.number.isRequired componentWillMount: => @setupForProps(@props) componentWillReceiveProps: (newProps) => @setupForProps(newProps) shouldComponentUpdate: (newProps, newState) => @state?.idx isnt newState.idx setupForProps: (props) -> idx = Math.floor(ThreadListStore.view().count() / @props.totalHeight * @props.viewportCenter) @setState idx: idx item: ThreadListStore.view().get(idx) render: -> if @state.item content = timestamp(@state.item.lastMessageTimestamp) else content = "Loading..."
{content}
class ThreadList extends React.Component @displayName: 'ThreadList' @containerRequired: false constructor: (@props) -> @state = style: 'unknown' componentWillMount: => labelComponents = (thread) => for label in @state.threadLabelComponents LabelComponent = label.view c1 = new ListTabular.Column name: "★" resolver: (thread) => c2 = new ListTabular.Column name: "Name" width: 200 resolver: (thread) => hasDraft = _.find (thread.metadata ? []), (m) -> m.draft if hasDraft
else c3 = new ListTabular.Column name: "Message" flex: 4 resolver: (thread) => attachments = [] if thread.hasTagId('attachment') attachments =
{subject(thread.subject)} {thread.snippet} {attachments} c4 = new ListTabular.Column name: "Date" resolver: (thread) => {timestamp(thread.lastMessageTimestamp)} c5 = new ListTabular.Column name: "HoverActions" resolver: (thread) => @wideColumns = [c1, c2, c3, c4, c5] cNarrow = new ListTabular.Column name: "Item" resolver: (thread) => pencil = [] hasDraft = _.find (thread.metadata ? []), (m) -> m.draft if hasDraft pencil =
{timestamp(thread.lastMessageTimestamp)} {pencil}
{subject(thread.subject)}
{thread.snippet}
@narrowColumns = [cNarrow] @commands = 'core:remove-item': @_onArchive 'core:remove-and-previous': -> Actions.archiveAndPrevious() 'core:remove-and-next': -> Actions.archiveAndNext() 'application:reply': @_onReply 'application:reply-all': @_onReplyAll 'application:forward': @_onForward @itemPropsProvider = (item) -> className: classNames 'unread': item.isUnread() componentDidMount: => window.addEventListener('resize', @_onResize, true) @_onResize() componentWillUnmount: => window.removeEventListener('resize', @_onResize) render: => if @state.style is 'wide' else if @state.style is 'narrow' else
_onResize: (event) => current = @state.style desired = if React.findDOMNode(@).offsetWidth < 540 then 'narrow' else 'wide' if current isnt desired @setState(style: desired) # Additional Commands _onArchive: => if @_viewingFocusedThread() or ThreadListStore.view().selection.count() is 0 Actions.archive() else Actions.archiveSelection() _onReply: ({focusedId}) => return unless focusedId? and @_viewingFocusedThread() Actions.composeReply(threadId: focusedId) _onReplyAll: ({focusedId}) => return unless focusedId? and @_viewingFocusedThread() Actions.composeReplyAll(threadId: focusedId) _onForward: ({focusedId}) => return unless focusedId? and @_viewingFocusedThread() Actions.composeForward(threadId: focusedId) # Helpers _viewingFocusedThread: => if WorkspaceStore.layoutMode() is "list" WorkspaceStore.topSheet() is WorkspaceStore.Sheet.Thread else true module.exports = ThreadList