mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-01-06 08:08:10 +08:00
c952ea3b12
Summary: Eventually, notification stuff should be moved out of InboxAPI into a separate package, and we should have some documented way of watching for "new" things. (Right now it'd be a bit hard to do on the database store...) Additional fixes: - AddRemoveTagsTask now optimistically updates the version. Before it would get the new version from the API response. This was bad because it could still cause local changes to be overwritten if you were changing tags really fast. - AddRemoveTagsTask now takes a threadId, not a thread for consistency with all the rest of our Tasks Test Plan: Run tests Reviewers: evan Reviewed By: evan Differential Revision: https://review.inboxapp.com/D1214
100 lines
2.9 KiB
CoffeeScript
100 lines
2.9 KiB
CoffeeScript
Reflux = require 'reflux'
|
|
_ = require 'underscore-plus'
|
|
{DatabaseStore, NamespaceStore, Actions, Tag, Thread} = require 'inbox-exports'
|
|
|
|
AccountSidebarStore = Reflux.createStore
|
|
init: ->
|
|
@_setStoreDefaults()
|
|
@_registerListeners()
|
|
@_populate()
|
|
|
|
|
|
########### PUBLIC #####################################################
|
|
|
|
sections: ->
|
|
@_sections
|
|
|
|
selectedId: ->
|
|
@_selectedId
|
|
|
|
########### PRIVATE ####################################################
|
|
|
|
_setStoreDefaults: ->
|
|
@_sections = []
|
|
@_selectedId = null
|
|
|
|
_registerListeners: ->
|
|
@listenTo Actions.selectTagId, @_onSelectTagID
|
|
@listenTo DatabaseStore, @_onDataChanged
|
|
@listenTo NamespaceStore, @_onNamespaceChanged
|
|
|
|
_populate: ->
|
|
namespace = NamespaceStore.current()
|
|
return unless namespace
|
|
|
|
DatabaseStore.findAll(Tag, namespaceId: namespace.id).then (tags) =>
|
|
# Collect the built-in tags we want to display, and the user tags
|
|
# (which can be identified by having non-hardcoded IDs)
|
|
mainTagIDs = ['inbox', 'important', 'drafts', 'sent', 'archive', 'trash']
|
|
mainTags = _.filter tags, (tag) -> _.contains(mainTagIDs, tag.id)
|
|
userTags = _.filter tags, (tag) -> tag.name != tag.id
|
|
|
|
# Sort the main tags so they always appear in a standard order
|
|
mainTags = _.sortBy mainTags, (tag) -> mainTagIDs.indexOf(tag.id)
|
|
|
|
lastSections = @_sections
|
|
@_sections = [
|
|
{ label: namespace.emailAddress, tags: mainTags }
|
|
]
|
|
|
|
if _.isEqual(@_sections, lastSections) is false
|
|
@_populateUnreadCounts()
|
|
@trigger(@)
|
|
|
|
_populateUnreadCounts: ->
|
|
namespace = NamespaceStore.current()
|
|
return unless namespace
|
|
|
|
@_sections.forEach (section) =>
|
|
section.tags.forEach (tag) =>
|
|
# Some tags don't have unread counts
|
|
return if tag.id in ['archive', 'drafts', 'sent', 'trash']
|
|
|
|
# Make a web request for unread count
|
|
atom.inbox.makeRequest
|
|
method: 'GET'
|
|
path: "/n/#{namespace.id}/tags/#{tag.id}"
|
|
returnsModel: true
|
|
|
|
# Unfortunately, the joins necessary to compute unread counts are expensive.
|
|
# Rather than update unread counts every time threads change in the database,
|
|
# we debounce aggressively and update only after changes have stopped.
|
|
# Remove this when JOIN query speed is fixed!
|
|
_populateUnreadCountsDebounced: _.debounce ->
|
|
@_populateUnreadCounts()
|
|
, 750
|
|
|
|
_refetchFromAPI: ->
|
|
namespace = NamespaceStore.current()
|
|
return unless namespace
|
|
|
|
# Trigger a request to the API
|
|
atom.inbox.getCollection(namespace.id, 'tags')
|
|
|
|
# Inbound Events
|
|
|
|
_onNamespaceChanged: ->
|
|
@_refetchFromAPI()
|
|
@_populate()
|
|
|
|
_onDataChanged: (change) ->
|
|
if change.objectClass == Tag.name
|
|
@_populate()
|
|
if change.objectClass == Thread.name
|
|
@_populateUnreadCountsDebounced()
|
|
|
|
_onSelectTagID: (tagID) ->
|
|
@_selectedId = tagID
|
|
@trigger(@)
|
|
|
|
module.exports = AccountSidebarStore
|