diff --git a/internal_packages/thread-list/lib/draft-list-store.coffee b/internal_packages/thread-list/lib/draft-list-store.coffee index 2cf646d02..d181c638b 100644 --- a/internal_packages/thread-list/lib/draft-list-store.coffee +++ b/internal_packages/thread-list/lib/draft-list-store.coffee @@ -49,6 +49,6 @@ class DraftListStore extends NylasStore return unless change.objectClass is Message.name containsDraft = _.some(change.objects, (msg) -> msg.draft) return unless containsDraft and @_view - @_view.invalidate() + @_view.invalidate({change: change, shallow: true}) module.exports = new DraftListStore() diff --git a/internal_packages/thread-list/lib/draft-list.cjsx b/internal_packages/thread-list/lib/draft-list.cjsx index 874dc5406..21a13d561 100644 --- a/internal_packages/thread-list/lib/draft-list.cjsx +++ b/internal_packages/thread-list/lib/draft-list.cjsx @@ -5,8 +5,10 @@ React = require 'react' InjectedComponent} = require 'nylas-component-kit' {timestamp, subject} = require './formatting-utils' {Actions, + FocusedContentStore, DatabaseStore} = require 'nylas-exports' DraftListStore = require './draft-list-store' +EmptyState = require './empty-state' class DraftList extends React.Component @displayName: 'DraftList' @@ -15,10 +17,14 @@ class DraftList extends React.Component componentWillMount: => snippet = (html) => - @draftSanitizer ?= document.createElement('div') - @draftSanitizer.innerHTML = html[0..400] - text = @draftSanitizer.innerText - text[0..200] + return "" unless html and typeof(html) is 'string' + try + @draftSanitizer ?= document.createElement('div') + @draftSanitizer.innerHTML = html[0..400] + text = @draftSanitizer.innerText + text[0..200] + catch + return "" c1 = new ListTabular.Column name: "Name" @@ -50,7 +56,7 @@ class DraftList extends React.Component @columns = [c1, c2, c3] @commands = - 'core:remove-from-view': @_onDelete + 'core:remove-from-view': @_onRemoveFromView render: => {} } itemHeight={39} className="draft-list" @@ -68,10 +75,10 @@ class DraftList extends React.Component # Additional Commands - _onDelete: ({focusedId}) => - item = DraftListStore.view().getById(focusedId) - return unless item - Actions.destroyDraft(item.clientId) + _onRemoveFromView: => + items = DraftListStore.view().selection.items() + for item in items + Actions.destroyDraft(item.clientId) module.exports = DraftList diff --git a/internal_packages/thread-list/lib/empty-state.cjsx b/internal_packages/thread-list/lib/empty-state.cjsx index 38258c7d5..6021232c9 100644 --- a/internal_packages/thread-list/lib/empty-state.cjsx +++ b/internal_packages/thread-list/lib/empty-state.cjsx @@ -5,6 +5,7 @@ classNames = require 'classnames' {DatabaseView, NylasAPI, NylasSyncStatusStore, + Message, WorkspaceStore} = require 'nylas-exports' EmptyMessages = [{ @@ -80,6 +81,8 @@ class EmptyState extends React.Component @_unlisteners = [] @_unlisteners.push WorkspaceStore.listen(@_onChange, @) @_unlisteners.push NylasSyncStatusStore.listen(@_onChange, @) + if @props.visible and not @state.active + @setState(active:true) shouldComponentUpdate: (nextProps, nextState) -> # Avoid deep comparison of dataView, which is a very complex object @@ -103,6 +106,8 @@ class EmptyState extends React.Component messageOverride = null if @props.dataView instanceof DatabaseView + if @props.dataView.klass is Message + messageOverride = "No messages to display." if @state.layoutMode is 'list' ContentComponent = ContentQuotes if @state.syncing diff --git a/src/flux/stores/database-view.coffee b/src/flux/stores/database-view.coffee index e22455bc1..10d6e1e5e 100644 --- a/src/flux/stores/database-view.coffee +++ b/src/flux/stores/database-view.coffee @@ -156,6 +156,8 @@ class DatabaseView extends ModelView @selection.updateModelReferences(items) @selection.removeItemsNotMatching(@_matchers) + if change.type is 'unpersist' + @selection.remove(item) for item in items if items.length > 5 @log("invalidateAfterDatabaseChange on #{items.length} items would be expensive. Invalidating entire range.")