mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-01-04 07:10:06 +08:00
ac089c4d8d
Summary: - FocusedPerspectiveStore now holds the state of the accounts that are currently being displayed in the sidebar, i.e. unified inbox or not, which makes it globally accessible state. The SidebarStore just reads this state directly off of the FocusedPerspectiveStore to decide which sections and items to display in the sidebar. - Updates `Actions.focusDefaultMailboxPerspectiveForAccounts` to take an optional array of `sidebarAccountIds` to set in the sidebar. The default behavior is to show the accounts of the perspective that will be focused. E.g. when selecting an account via the account switcher, it will just show the sidebar items for the single account that was selected, but when adding a new account, we are setting the sidebar accounts to all account although we are still focusing the perspective for a single account. - Will now show unified inbox sidebar with correctly focused account when new account added. - Cleans up the code a little bit, but this package still needs major refactor Test Plan: Missing! Reviewers: jackie, bengotow Reviewed By: bengotow Differential Revision: https://phab.nylas.com/D3002
152 lines
5.2 KiB
CoffeeScript
152 lines
5.2 KiB
CoffeeScript
_ = require 'underscore'
|
|
_str = require 'underscore.string'
|
|
{WorkspaceStore,
|
|
MailboxPerspective,
|
|
FocusedPerspectiveStore,
|
|
SyncbackCategoryTask,
|
|
DestroyCategoryTask,
|
|
CategoryStore,
|
|
Actions,
|
|
Utils} = require 'nylas-exports'
|
|
{OutlineViewItem} = require 'nylas-component-kit'
|
|
|
|
SidebarActions = require './sidebar-actions'
|
|
|
|
idForCategories = (categories) ->
|
|
_.pluck(categories, 'id').join('-')
|
|
|
|
countForItem = (perspective) ->
|
|
unreadCountEnabled = NylasEnv.config.get('core.workspace.showUnreadForAllCategories')
|
|
if perspective.isInbox() or unreadCountEnabled
|
|
return perspective.unreadCount()
|
|
return 0
|
|
|
|
isItemSelected = (perspective) ->
|
|
(WorkspaceStore.rootSheet() in [WorkspaceStore.Sheet.Threads, WorkspaceStore.Sheet.Drafts] and
|
|
FocusedPerspectiveStore.current().isEqual(perspective))
|
|
|
|
isItemDeleted = (perspective) ->
|
|
_.any perspective.categories(), (c) -> c.isDeleted
|
|
|
|
isItemCollapsed = (id) ->
|
|
if NylasEnv.savedState.sidebarKeysCollapsed[id] isnt undefined
|
|
NylasEnv.savedState.sidebarKeysCollapsed[id]
|
|
else
|
|
true
|
|
|
|
toggleItemCollapsed = (item) ->
|
|
return unless item.children.length > 0
|
|
SidebarActions.setKeyCollapsed(item.id, not isItemCollapsed(item.id))
|
|
|
|
onDeleteItem = (item) ->
|
|
# TODO Delete multiple categories at once
|
|
return if item.deleted is true
|
|
category = item.perspective.category()
|
|
return unless category
|
|
|
|
Actions.queueTask(new DestroyCategoryTask({category}))
|
|
|
|
onEditItem = (item, value) ->
|
|
return unless value
|
|
return if item.deleted is true
|
|
category = item.perspective.category()
|
|
return unless category
|
|
Actions.queueTask(new SyncbackCategoryTask({category, displayName: value}))
|
|
|
|
|
|
class SidebarItem
|
|
|
|
@forPerspective: (id, perspective, opts = {}) ->
|
|
counterStyle = OutlineViewItem.CounterStyles.Alt if perspective.isInbox()
|
|
|
|
return _.extend({
|
|
id: id
|
|
name: perspective.name
|
|
contextMenuLabel: perspective.name
|
|
count: countForItem(perspective)
|
|
iconName: perspective.iconName
|
|
children: []
|
|
perspective: perspective
|
|
className: if isItemDeleted(perspective) then 'deleted' else ''
|
|
selected: isItemSelected(perspective)
|
|
collapsed: isItemCollapsed(id) ? true
|
|
counterStyle: counterStyle
|
|
dataTransferType: 'nylas-threads-data'
|
|
onDelete: if opts.deletable then onDeleteItem else undefined
|
|
onEdited: if opts.editable then onEditItem else undefined
|
|
onCollapseToggled: toggleItemCollapsed
|
|
onDrop: (item, event) ->
|
|
jsonString = event.dataTransfer.getData(item.dataTransferType)
|
|
data = Utils.jsonParse(jsonString)
|
|
return unless data
|
|
item.perspective.receiveThreads(data.threadIds)
|
|
shouldAcceptDrop: (item, event) ->
|
|
target = item.perspective
|
|
current = FocusedPerspectiveStore.current()
|
|
jsonString = event.dataTransfer.getData(item.dataTransferType)
|
|
data = Utils.jsonParse(jsonString)
|
|
return false unless data
|
|
return false unless target
|
|
return false if target.isEqual(current)
|
|
return false unless target.canReceiveThreadsFromAccountIds(data.accountIds)
|
|
return item.dataTransferType in event.dataTransfer.types
|
|
onSelect: (item) ->
|
|
Actions.focusMailboxPerspective(item.perspective)
|
|
}, opts)
|
|
|
|
|
|
@forCategories: (categories = [], opts = {}) ->
|
|
id = idForCategories(categories)
|
|
contextMenuLabel = _str.capitalize(categories[0]?.displayType())
|
|
perspective = MailboxPerspective.forCategories(categories)
|
|
|
|
opts.deletable ?= true
|
|
opts.editable ?= true
|
|
opts.contextMenuLabel = contextMenuLabel
|
|
@forPerspective(id, perspective, opts)
|
|
|
|
@forSnoozed: (accountIds, opts = {}) ->
|
|
# TODO This constant should be available elsewhere
|
|
constants = require('../../thread-snooze/lib/snooze-constants')
|
|
displayName = constants.SNOOZE_CATEGORY_NAME
|
|
id = displayName
|
|
id += "-#{opts.name}" if opts.name
|
|
opts.name = "Snoozed" unless opts.name
|
|
opts.iconName= 'snooze.png'
|
|
|
|
categories = accountIds.map (accId) =>
|
|
_.findWhere CategoryStore.categories(accId), {displayName}
|
|
categories = _.compact(categories)
|
|
|
|
perspective = MailboxPerspective.forCategories(categories)
|
|
perspective.name = id unless perspective.name
|
|
@forPerspective(id, perspective, opts)
|
|
|
|
@forStarred: (accountIds, opts = {}) ->
|
|
perspective = MailboxPerspective.forStarred(accountIds)
|
|
id = 'Starred'
|
|
id += "-#{opts.name}" if opts.name
|
|
@forPerspective(id, perspective, opts)
|
|
|
|
@forUnread: (accountIds, opts = {}) ->
|
|
categories = accountIds.map (accId) =>
|
|
CategoryStore.getStandardCategory(accId, 'inbox')
|
|
|
|
# NOTE: It's possible for an account to not yet have an `inbox`
|
|
# category. Since the `SidebarStore` triggers on `AccountStore`
|
|
# changes, it'll trigger the exact moment an account is added to the
|
|
# config. However, the API has not yet come back with the list of
|
|
# `categories` for that account.
|
|
categories = _.compact(categories)
|
|
|
|
perspective = MailboxPerspective.forUnread(categories)
|
|
id = 'Unread'
|
|
id += "-#{opts.name}" if opts.name
|
|
@forPerspective(id, perspective, opts)
|
|
|
|
@forDrafts: (accountIds, opts = {}) ->
|
|
perspective = MailboxPerspective.forDrafts(accountIds)
|
|
id = "Drafts-#{opts.name}"
|
|
@forPerspective(id, perspective, opts)
|
|
|
|
module.exports = SidebarItem
|