diff options
Diffstat (limited to 'ext/js')
-rw-r--r-- | ext/js/background/backend.js | 29 | ||||
-rw-r--r-- | ext/js/comm/anki-connect.js | 55 |
2 files changed, 13 insertions, 71 deletions
diff --git a/ext/js/background/backend.js b/ext/js/background/backend.js index 881cd241..b0c0a36d 100644 --- a/ext/js/background/backend.js +++ b/ext/js/background/backend.js @@ -537,24 +537,16 @@ export class Backend { /** * @param {import('anki').Note[]} notes - * @returns {Promise<({ canAdd: true; } | { canAdd: false; error: string; })[]>} + * @returns {Promise<import('backend').CanAddResults>} */ - async detectDuplicateNotes(notes) { + async partitionAddibleNotes(notes) { // `allowDuplicate` is on for all notes by default, so we temporarily set it to false // to check which notes are duplicates. const notesNoDuplicatesAllowed = notes.map((note) => ({...note, options: {...note.options, allowDuplicate: false}})); - return await this._anki.canAddNotesWithErrorDetail(notesNoDuplicatesAllowed); - } - - /** - * Partitions notes between those that can / cannot be added. - * It further sets the `isDuplicate` strings for notes that have a duplicate. - * @param {import('anki').Note[]} notes - * @returns {Promise<import('backend').CanAddResults>} - */ - async partitionAddibleNotes(notes) { - const canAddResults = await this.detectDuplicateNotes(notes); + // If only older AnkiConnect available, use `canAddNotes`. + const withDuplicatesAllowed = await this._anki.canAddNotes(notes); + const noDuplicatesAllowed = await this._anki.canAddNotes(notesNoDuplicatesAllowed); /** @type {{ note: import('anki').Note, isDuplicate: boolean }[]} */ const canAddArray = []; @@ -562,16 +554,11 @@ export class Backend { /** @type {import('anki').Note[]} */ const cannotAddArray = []; - for (let i = 0; i < canAddResults.length; i++) { - const result = canAddResults[i]; - - // If the note is a duplicate, the error is "cannot create note because it is a duplicate". - if (result.canAdd) { + for (let i = 0; i < withDuplicatesAllowed.length; i++) { + if (withDuplicatesAllowed[i] === noDuplicatesAllowed[i]) { canAddArray.push({note: notes[i], isDuplicate: false}); - } else if (result.error.endsWith('duplicate')) { - canAddArray.push({note: notes[i], isDuplicate: true}); } else { - cannotAddArray.push(notes[i]); + canAddArray.push({note: notes[i], isDuplicate: true}); } } diff --git a/ext/js/comm/anki-connect.js b/ext/js/comm/anki-connect.js index 72ad58a5..6a008f40 100644 --- a/ext/js/comm/anki-connect.js +++ b/ext/js/comm/anki-connect.js @@ -128,15 +128,16 @@ export class AnkiConnect { return result; } + /** * @param {import('anki').Note[]} notes - * @returns {Promise<({ canAdd: true } | { canAdd: false, error: string })[]>} + * @returns {Promise<boolean[]>} */ - async canAddNotesWithErrorDetail(notes) { + async canAddNotes(notes) { if (!this._enabled) { return []; } await this._checkVersion(); - const result = await this._invoke('canAddNotesWithErrorDetail', {notes}); - return this._normalizeCanAddNotesWithErrorDetailArray(result, notes.length); + const result = await this._invoke('canAddNotes', {notes}); + return this._normalizeArray(result, notes.length, 'boolean'); } /** @@ -581,52 +582,6 @@ export class AnkiConnect { /** * @param {unknown} result - * @param {number} expectedCount - * @returns {import('anki-connect.js').CanAddResult[]} - * @throws {Error} - */ - _normalizeCanAddNotesWithErrorDetailArray(result, expectedCount) { - if (!Array.isArray(result)) { - throw this._createUnexpectedResultError('array', result, ''); - } - if (expectedCount !== result.length) { - throw this._createError(`Unexpected result array size: expected ${expectedCount}, received ${result.length}`, result); - } - /** @type {import('anki-connect.js').CanAddResult[]} */ - const result2 = []; - for (let i = 0; i < expectedCount; ++i) { - const item = /** @type {unknown} */ (result[i]); - if (item === null || typeof item !== 'object') { - throw this._createError(`Unexpected result type at index ${i}: expected object, received ${this._getTypeName(item)}`, result); - } - - const {canAdd, error} = /** @type {{[key: string]: unknown}} */ (item); - if (typeof canAdd !== 'boolean') { - throw this._createError(`Unexpected result type at index ${i}, field canAdd: expected boolean, received ${this._getTypeName(canAdd)}`, result); - } - - if (canAdd && typeof error !== 'undefined') { - throw this._createError(`Unexpected result type at index ${i}, field error: expected undefined, received ${this._getTypeName(error)}`, result); - } - if (!canAdd && typeof error !== 'string') { - throw this._createError(`Unexpected result type at index ${i}, field error: expected string, received ${this._getTypeName(error)}`, result); - } - - if (canAdd) { - result2.push({canAdd}); - } else if (typeof error === 'string') { - const item2 = { - canAdd, - error - }; - result2.push(item2); - } - } - return result2; - } - - /** - * @param {unknown} result * @returns {(?import('anki').NoteInfo)[]} * @throws {Error} */ |