Mailspring/app/internal_packages/thread-snooze/lib/snooze-store.jsx

133 lines
4.1 KiB
React
Raw Normal View History

import _ from 'underscore';
import NylasStore from 'nylas-store';
import {
FeatureUsageStore,
SyncbackMetadataTask,
Actions,
AccountStore,
DatabaseStore,
Message,
CategoryStore,
} from 'nylas-exports';
2016-05-06 07:22:44 +08:00
import SnoozeUtils from './snooze-utils'
import {PLUGIN_ID, PLUGIN_NAME} from './snooze-constants';
import SnoozeActions from './snooze-actions';
class SnoozeStore extends NylasStore {
constructor(pluginId = PLUGIN_ID, pluginName = PLUGIN_NAME) {
super();
this.pluginId = pluginId;
this.pluginName = pluginName;
this.accountIds = AccountStore.accounts().map(a => a.id)
2016-05-06 07:22:44 +08:00
this.snoozeCategoriesPromise = SnoozeUtils.getSnoozeCategoriesByAccount(AccountStore.accounts())
}
activate() {
this.unsubscribers = [
AccountStore.listen(this.onAccountsChanged),
SnoozeActions.snoozeThreads.listen(this.onSnoozeThreads),
];
}
deactivate() {
this.unsubscribers.forEach(unsub => unsub())
}
recordSnoozeEvent(threads, snoozeDate, label) {
try {
2016-06-08 03:53:05 +08:00
const timeInSec = Math.round(((new Date(snoozeDate)).valueOf() - Date.now()) / 1000);
Actions.recordUserEvent("Threads Snoozed", {
timeInSec: timeInSec,
timeInLog10Sec: Math.log10(timeInSec),
label: label,
numItems: threads.length,
});
} catch (e) {
// Do nothing
}
}
groupUpdatedThreads = (threads, snoozeCategoriesByAccount) => {
const threadsByAccountId = {}
2016-05-06 13:30:34 +08:00
threads.forEach((thread) => {
const accId = thread.accountId
if (!threadsByAccountId[accId]) {
threadsByAccountId[accId] = {
threads: [thread],
snoozeCategoryId: () => snoozeCategoriesByAccount[accId].id,
returnCategoryId: () => CategoryStore.getInboxCategory(accId).id,
}
} else {
threadsByAccountId[accId].threads.push(thread);
}
});
return Promise.resolve(threadsByAccountId);
};
2016-05-06 13:30:34 +08:00
onAccountsChanged = () => {
const nextIds = AccountStore.accounts().map(a => a.id)
const isSameAccountIds = (
this.accountIds.length === nextIds.length &&
this.accountIds.length === _.intersection(this.accountIds, nextIds).length
)
if (!isSameAccountIds) {
this.accountIds = nextIds
this.snoozeCategoriesPromise = SnoozeUtils.getSnoozeCategoriesByAccount(AccountStore.accounts())
}
};
onSnoozeThreads = (threads, snoozeDate, label) => {
const lexicon = {
displayName: "Snooze",
usedUpHeader: "All Snoozes used",
iconUrl: "nylas://thread-snooze/assets/ic-snooze-modal@2x.png",
}
FeatureUsageStore.asyncUseFeature('snooze', {lexicon})
2016-05-06 13:30:34 +08:00
.then(() => {
this.recordSnoozeEvent(threads, snoozeDate, label)
2016-05-06 07:22:44 +08:00
return SnoozeUtils.moveThreadsToSnooze(threads, this.snoozeCategoriesPromise, snoozeDate)
})
2016-05-06 13:30:34 +08:00
.then((updatedThreads) => {
return this.snoozeCategoriesPromise
.then(snoozeCategories => this.groupUpdatedThreads(updatedThreads, snoozeCategories))
})
2016-05-06 13:30:34 +08:00
.then((updatedThreadsByAccountId) => {
Object.values(updatedThreadsByAccountId).forEach((update) => {
const {snoozeCategoryId, returnCategoryId} = update;
// Get messages for those threads and metadata for those.
DatabaseStore.findAll(Message, {threadId: update.threads.map(t => t.id)}).then((messages) => {
for (const message of messages) {
const header = message.headerMessageId;
const stableId = message.id;
Actions.queueTask(new SyncbackMetadataTask({
model: message,
pluginId: this.pluginId,
value: {expiration: snoozeDate, header, stableId, snoozeCategoryId, returnCategoryId},
}));
}
});
});
})
2016-05-06 13:30:34 +08:00
.catch((error) => {
if (error instanceof FeatureUsageStore.NoProAccess) {
return
}
2016-05-06 07:22:44 +08:00
SnoozeUtils.moveThreadsFromSnooze(threads, this.snoozeCategoriesPromise)
2016-02-25 07:11:03 +08:00
Actions.closePopover();
NylasEnv.reportError(error);
NylasEnv.showErrorDialog(`Sorry, we were unable to save your snooze settings. ${error.message}`);
return
});
};
}
export default SnoozeStore;