Mailspring/internal_packages/thread-snooze/lib/snooze-store.js
Juan Tejada cfbbcd23d3 fix(snooze): Correctly query and create snooze categories per account
Summary:
- Was not properly updating the references to snoozed categories when
  accounts were added or removed
- Update whenCategoriesReady to make sure we listen until category syncing has concluded (Move inside CategoryStore)
- #1676, #1658

Test Plan: - TODO

Reviewers: evan, drew, bengotow

Reviewed By: bengotow

Differential Revision: https://phab.nylas.com/D2723
2016-03-14 15:36:39 -07:00

100 lines
3.1 KiB
JavaScript

/** @babel */
import _ from 'underscore';
import {Actions, NylasAPI, AccountStore, CategoryStore} from 'nylas-exports';
import {
moveThreadsToSnooze,
moveThreadsFromSnooze,
getSnoozeCategoriesByAccount,
} from './snooze-utils';
import {PLUGIN_ID, PLUGIN_NAME} from './snooze-constants';
import SnoozeActions from './snooze-actions';
class SnoozeStore {
constructor(pluginId = PLUGIN_ID, pluginName = PLUGIN_NAME) {
this.pluginId = pluginId
this.pluginName = pluginName
this.snoozeCategoriesPromise = getSnoozeCategoriesByAccount(AccountStore.accounts())
}
activate() {
this.unsubscribers = [
AccountStore.listen(this.onAccountsChanged),
SnoozeActions.snoozeThreads.listen(this.onSnoozeThreads),
]
}
recordSnoozeEvent(threads, snoozeDate, label) {
try {
const min = Math.round(((new Date(snoozeDate)).valueOf() - Date.now()) / 1000 / 60);
Actions.recordUserEvent("Snooze Threads", {
numThreads: threads.length,
snoozeTime: min,
buttonType: label,
});
} catch (e) {
// Do nothing
}
}
groupUpdatedThreads = (threads, snoozeCategoriesByAccount) => {
const getSnoozeCategory = (accId)=> snoozeCategoriesByAccount[accId]
const {getInboxCategory} = CategoryStore
const threadsByAccountId = {}
threads.forEach((thread)=> {
const accId = thread.accountId
if (!threadsByAccountId[accId]) {
threadsByAccountId[accId] = {
threads: [thread],
snoozeCategoryId: getSnoozeCategory(accId).serverId,
returnCategoryId: getInboxCategory(accId).serverId,
}
} else {
threadsByAccountId[accId].threads.push(thread);
}
});
return Promise.resolve(threadsByAccountId);
};
onAccountsChanged = ()=> {
this.snoozeCategoriesPromise = getSnoozeCategoriesByAccount(AccountStore.accounts())
};
onSnoozeThreads = (threads, snoozeDate, label) => {
this.recordSnoozeEvent(threads, label)
const accounts = AccountStore.accountsForItems(threads)
const promises = accounts.map((acc)=> {
return NylasAPI.authPlugin(this.pluginId, this.pluginName, acc)
})
return Promise.all(promises)
.then(()=> {
return moveThreadsToSnooze(threads, this.snoozeCategoriesPromise, snoozeDate)
})
.then((updatedThreads)=> {
return this.snoozeCategoriesPromise
.then(snoozeCategories => this.groupUpdatedThreads(updatedThreads, snoozeCategories))
})
.then((updatedThreadsByAccountId)=> {
_.each(updatedThreadsByAccountId, (update)=> {
const {snoozeCategoryId, returnCategoryId} = update;
Actions.setMetadata(update.threads, this.pluginId, {snoozeDate, snoozeCategoryId, returnCategoryId})
})
})
.catch((error)=> {
moveThreadsFromSnooze(threads, this.snoozeCategoriesPromise)
Actions.closePopover();
NylasEnv.reportError(error);
NylasEnv.showErrorDialog(`Sorry, we were unable to save your snooze settings. ${error.message}`);
});
};
deactivate() {
this.unsubscribers.forEach(unsub => unsub())
}
}
export default SnoozeStore;