Mailspring/app/internal_packages/thread-search/lib/search-mailbox-perspective.es6

86 lines
2.5 KiB
JavaScript

import {
Folder,
ChangeLabelsTask,
ChangeFolderTask,
AccountStore,
CategoryStore,
TaskFactory,
MailboxPerspective,
} from 'mailspring-exports';
import SearchQuerySubscription from './search-query-subscription';
class SearchMailboxPerspective extends MailboxPerspective {
constructor(sourcePerspective, searchQuery) {
super(sourcePerspective.accountIds);
if (typeof searchQuery !== 'string') {
throw new Error('SearchMailboxPerspective: Expected a `string` search query');
}
this.searchQuery = searchQuery;
if (sourcePerspective instanceof SearchMailboxPerspective) {
this.sourcePerspective = sourcePerspective.sourcePerspective;
} else {
this.sourcePerspective = sourcePerspective;
}
this.name = `Searching ${this.sourcePerspective.name}`;
}
_folderScope() {
// When the inbox is focused we don't specify a folder scope. If the user
// wants to search just the inbox then they have to specify it explicitly.
if (this.sourcePerspective.isInbox()) {
return '';
}
const folderQuery = this.sourcePerspective
.categories()
.map(c => c.displayName)
.join('" OR in:"');
return `AND (in:"${folderQuery}")`;
}
emptyMessage() {
return 'No search results available';
}
isEqual(other) {
return super.isEqual(other) && other.searchQuery === this.searchQuery;
}
threads() {
return new SearchQuerySubscription(
`(${this.searchQuery}) ${this._folderScope()}`,
this.accountIds
);
}
canReceiveThreadsFromAccountIds() {
return false;
}
tasksForRemovingItems(threads) {
return TaskFactory.tasksForThreadsByAccountId(threads, (accountThreads, accountId) => {
const account = AccountStore.accountForId(accountId);
const dest = account.preferredRemovalDestination();
if (dest instanceof Folder) {
return new ChangeFolderTask({
threads: accountThreads,
source: 'Dragged out of list',
folder: dest,
});
}
if (dest.role === 'all') {
// if you're searching and archive something, it really just removes the inbox label
return new ChangeLabelsTask({
threads: accountThreads,
source: 'Dragged out of list',
labelsToRemove: [CategoryStore.getInboxCategory(accountId)],
});
}
throw new Error('Unexpected destination returned from preferredRemovalDestination()');
});
}
}
export default SearchMailboxPerspective;