Store anki note details (#1798)

* Update error handling of _areDictionaryEntriesAddable

* Store note details

* Remove promise after use

* Rename function

* Clear stored details

* Rename function

* Rename function
This commit is contained in:
toasted-nutbread 2021-07-05 14:41:11 -04:00 committed by GitHub
parent b8478857aa
commit 0491de12d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -31,8 +31,9 @@ class DisplayAnki {
this._ankiNoteNotificationEventListeners = null;
this._ankiTagNotification = null;
this._updateAdderButtonsPromise = Promise.resolve();
this._updateAdderButtonsToken = null;
this._updateDictionaryEntryDetailsToken = null;
this._eventListeners = new EventListenerCollection();
this._dictionaryEntryDetails = null;
this._noteContext = null;
this._checkForDuplicates = false;
this._suspendNewCards = false;
@ -66,7 +67,8 @@ class DisplayAnki {
}
cleanupEntries() {
this._updateAdderButtonsToken = null;
this._updateDictionaryEntryDetailsToken = null;
this._dictionaryEntryDetails = null;
this._hideAnkiNoteErrors(false);
}
@ -81,7 +83,7 @@ class DisplayAnki {
}
setupEntriesComplete() {
this._updateAdderButtons();
this._updateDictionaryEntryDetails();
}
async getLogData(dictionaryEntry) {
@ -258,47 +260,45 @@ class DisplayAnki {
return {type, term, reading};
}
async _updateAdderButtons() {
async _updateDictionaryEntryDetails() {
const {dictionaryEntries} = this._display;
const token = {};
this._updateAdderButtonsToken = token;
await this._updateAdderButtonsPromise;
if (this._updateAdderButtonsToken !== token) { return; }
this._updateDictionaryEntryDetailsToken = token;
if (this._updateAdderButtonsPromise !== null) {
await this._updateAdderButtonsPromise;
}
if (this._updateDictionaryEntryDetailsToken !== token) { return; }
const {promise, resolve} = deferPromise();
try {
this._updateAdderButtonsPromise = promise;
let states;
try {
states = await this._areDictionaryEntriesAddable(dictionaryEntries);
} catch (e) {
return;
}
if (this._updateAdderButtonsToken !== token) { return; }
this._updateAdderButtons2(states);
const dictionaryEntryDetails = await this._getDictionaryEntryDetails(dictionaryEntries);
if (this._updateDictionaryEntryDetailsToken !== token) { return; }
this._dictionaryEntryDetails = dictionaryEntryDetails;
this._updateAdderButtons();
} finally {
resolve();
if (this._updateAdderButtonsPromise === promise) {
this._updateAdderButtonsPromise = null;
}
}
}
_updateAdderButtons2(states) {
_updateAdderButtons() {
const displayTags = this._displayTags;
for (let i = 0, ii = states.length; i < ii; ++i) {
const dictionaryEntryDetails = this._dictionaryEntryDetails;
for (let i = 0, ii = dictionaryEntryDetails.length; i < ii; ++i) {
let noteId = null;
for (const {mode, canAdd, noteIds, noteInfos} of states[i]) {
for (const {mode, canAdd, noteIds, noteInfos, ankiError} of dictionaryEntryDetails[i]) {
const button = this._adderButtonFind(i, mode);
if (button === null) {
continue;
if (button !== null) {
button.disabled = !canAdd;
button.hidden = (ankiError !== null);
}
if (Array.isArray(noteIds) && noteIds.length > 0) {
noteId = noteIds[0];
}
button.disabled = !canAdd;
button.hidden = false;
if (displayTags !== 'never' && Array.isArray(noteInfos)) {
this._setupTagsIndicator(i, noteInfos);
@ -459,7 +459,7 @@ class DisplayAnki {
return templates;
}
async _areDictionaryEntriesAddable(dictionaryEntries) {
async _getDictionaryEntryDetails(dictionaryEntries) {
const forceCanAddValue = (this._checkForDuplicates ? null : true);
const fetchAdditionalInfo = (this._displayTags !== 'never');
@ -481,13 +481,19 @@ class DisplayAnki {
const notes = noteInfoList.map(({note}) => note);
let infos;
if (forceCanAddValue !== null) {
if (!await yomichan.api.isAnkiConnected()) {
throw new Error('Anki not connected');
let ankiError = null;
try {
if (forceCanAddValue !== null) {
if (!await yomichan.api.isAnkiConnected()) {
throw new Error('Anki not connected');
}
infos = this._getAnkiNoteInfoForceValue(notes, forceCanAddValue);
} else {
infos = await yomichan.api.getAnkiNoteInfo(notes, fetchAdditionalInfo);
}
infos = this._getAnkiNoteInfoForceValue(notes, forceCanAddValue);
} else {
infos = await yomichan.api.getAnkiNoteInfo(notes, fetchAdditionalInfo);
} catch (e) {
infos = this._getAnkiNoteInfoForceValue(notes, false);
ankiError = e;
}
const results = [];
@ -498,7 +504,7 @@ class DisplayAnki {
while (index >= results.length) {
results.push([]);
}
results[index].push({mode, note, errors, canAdd, valid, noteIds, noteInfos});
results[index].push({mode, note, errors, canAdd, valid, noteIds, noteInfos, ankiError});
}
return results;
}