Mailspring/internal_packages/account-sidebar/lib/account-sidebar-category-item.cjsx

99 lines
3 KiB
CoffeeScript

React = require 'react'
classNames = require 'classnames'
{Actions,
Utils,
UnreadCountStore,
WorkspaceStore,
NamespaceStore,
FocusedCategoryStore,
ChangeLabelsTask,
ChangeFolderTask,
CategoryStore} = require 'nylas-exports'
{RetinaImg, DropZone} = require 'nylas-component-kit'
class AccountSidebarCategoryItem extends React.Component
@displayName: 'AccountSidebarCategoryItem'
constructor: (@props) ->
@state =
unreadCount: UnreadCountStore.count() ? 0
componentWillMount: =>
@_usub = UnreadCountStore.listen @_onUnreadCountChange
componentWillUnmount: =>
@_usub()
_onUnreadCountChange: =>
@setState unreadCount: UnreadCountStore.count()
shouldComponentUpdate: (nextProps, nextState) =>
!Utils.isEqualReact(@props, nextProps) or !Utils.isEqualReact(@state, nextState)
render: =>
unread = []
if @props.item.name is "inbox" and @state.unreadCount > 0
unread = <div className="unread item-count-box">{@state.unreadCount}</div>
containerClass = classNames
'item': true
'selected': @props.select
'dropping': @state.isDropping
<DropZone className={containerClass}
onClick={@_onClick}
id={@props.item.id}
shouldAcceptDrop={@_shouldAcceptDrop}
onDragStateChange={ ({isDropping}) => @setState({isDropping}) }
onDrop={@_onDrop}>
{unread}
{@_renderIcon()}
<span className="name"> {@props.item.displayName}</span>
</DropZone>
_renderIcon: ->
if @props.sectionType is "category" and NamespaceStore.current()
if NamespaceStore.current().usesLabels()
<RetinaImg name={"tag.png"} mode={RetinaImg.Mode.ContentIsMask} />
else
<RetinaImg name={"folder.png"} mode={RetinaImg.Mode.ContentIsMask} />
else if @props.sectionType is "mailboxes"
<RetinaImg name={"#{@props.item.name}.png"} fallback={'folder.png'} mode={RetinaImg.Mode.ContentIsMask} />
_shouldAcceptDrop: (e) =>
return false if @props.item.name in CategoryStore.LockedCategoryNames
return false if @props.item.name is FocusedCategoryStore.categoryName()
'nylas-thread-ids' in e.dataTransfer.types
_onDrop: (e) =>
jsonString = e.dataTransfer.getData('nylas-thread-ids')
try
ids = JSON.parse(jsonString)
catch err
console.error("AccountSidebarCategoryItem onDrop: JSON parse #{err}")
return unless ids
if NamespaceStore.current().usesLabels()
currentLabel = FocusedCategoryStore.category()
if currentLabel and not (currentLabel in CategoryStore.LockedCategoryNames)
labelsToRemove = [currentLabel]
task = new ChangeLabelsTask
threadIds: ids,
labelsToAdd: [@props.item],
labelsToRemove: labelsToRemove
else
task = new ChangeFolderTask
folderOrId: @props.item,
threadIds: ids
Actions.queueTask(task)
_onClick: (event) =>
event.preventDefault()
Actions.selectRootSheet(WorkspaceStore.Sheet.Threads)
Actions.focusCategory(@props.item)
module.exports = AccountSidebarCategoryItem