fix(SyncbackCategoryTask): Make category operations optimistic again

Summary:
We don't see any weird double object behavior when delete deltas are
working properly, so might as well be optimistic since it makes for
a better user experience. This diff also notifies the user if a
category operation fails because of a mail provider restriction.

Fixes T7475

Test Plan: tested locally

Reviewers: juan, evan

Reviewed By: evan

Maniphest Tasks: T7475

Differential Revision: https://phab.nylas.com/D3648
This commit is contained in:
Halla Moore 2017-01-12 10:44:54 -08:00
parent 99e3f732d9
commit 348ead5c11

View file

@ -18,9 +18,28 @@ export default class SyncbackCategoryTask extends Task {
return `${verb} ${this.category.displayType()}...`;
}
_revertLocal() {
return DatabaseStore.inTransaction((t) => {
if (this.isUpdate) {
this.category.displayName = this._initialDisplayName;
return t.persistModel(this.category)
}
return t.unpersistModel(this.category)
})
}
performLocal() {
// This operation is non-optimistic! Don't do anything.
return Promise.resolve();
if (!this.category) {
return Promise.reject(new Error("Attempt to call SyncbackCategoryTask.performLocal without this.category."));
}
this.isUpdate = !!this.category.serverId; // True if updating an existing category
return DatabaseStore.inTransaction((t) => {
if (this.isUpdate && this.displayName) {
this._initialDisplayName = this.category.displayName;
this.category.displayName = this.displayName;
}
return t.persistModel(this.category);
});
}
performRemote() {
@ -58,12 +77,21 @@ export default class SyncbackCategoryTask extends Task {
return DatabaseStore.inTransaction(t => t.persistModel(this.category))
})
.thenReturn(Task.Status.Success)
.catch(APIError, (err) => {
.catch(APIError, async (err) => {
if (!NylasAPI.PermanentErrorCodes.includes(err.statusCode)) {
return Promise.resolve(Task.Status.Retry);
return Task.Status.Retry;
}
this._isReverting = true;
return this.performLocal().thenReturn(Task.Status.Failed);
await this._revertLocal()
try {
if (/command argument error/gi.test(err.message)) {
const action = this.isUpdate ? 'update' : 'create';
const type = this.category.displayType();
NylasEnv.showErrorDialog(`Could not ${action} ${type}. Your mail provider has placed restrictions on this ${type}.`);
}
} catch (e) {
// If notifying the user fails, just move on and mark the task as failed.
}
return Task.Status.Failed;
})
}
}