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:
parent
b8478857aa
commit
0491de12d4
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user