diff --git a/ext/bg/js/options-form.js b/ext/bg/js/options-form.js index 6e79303b..239b09d5 100644 --- a/ext/bg/js/options-form.js +++ b/ext/bg/js/options-form.js @@ -86,6 +86,17 @@ function populateAnkiDeckAndModel(opts) { }}); } +function updateAnkiStatus() { + $('.error-dlg').hide(); + yomichan().api_getVersion({callback: (version) => { + if (version === null) { + $('.error-dlg-connection').show(); + } else if (version !== yomichan().getApiVersion()) { + $('.error-dlg-version').show(); + } + }}); +} + function populateAnkiFields(element, opts) { const modelName = element.val(); if (modelName === null) { @@ -119,6 +130,7 @@ function onOptionsGeneralChanged(e) { saveOptions(optsNew, () => { yomichan().setOptions(optsNew); if (!optsOld.enableAnkiConnect && optsNew.enableAnkiConnect) { + updateAnkiStatus(); populateAnkiDeckAndModel(optsNew); $('.options-anki').fadeIn(); } else if (optsOld.enableAnkiConnect && !optsNew.enableAnkiConnect) { @@ -159,6 +171,7 @@ $(document).ready(() => { $('.anki-model').change(onAnkiModelChanged); if (opts.enableAnkiConnect) { + updateAnkiStatus(); populateAnkiDeckAndModel(opts); $('.options-anki').show(); } diff --git a/ext/bg/js/yomichan.js b/ext/bg/js/yomichan.js index 03f9d082..b3e8bf71 100644 --- a/ext/bg/js/yomichan.js +++ b/ext/bg/js/yomichan.js @@ -99,6 +99,10 @@ class Yomichan { this.notifyTabs('options', this.options); } + getApiVersion() { + return 1; + } + notifyTabs(name, value) { chrome.tabs.query({}, (tabs) => { for (const tab of tabs) { @@ -107,6 +111,16 @@ class Yomichan { }); } + ankiInvokeSafe(action, params, pool, callback) { + this.api_getVersion({callback: (version) => { + if (version === this.getApiVersion()) { + this.ankiInvoke(action, params, pool, callback); + } else { + callback(null); + } + }}); + } + ankiInvoke(action, params, pool, callback) { if (this.options.enableAnkiConnect) { if (pool !== null && this.asyncPools.hasOwnProperty(pool)) { @@ -181,7 +195,7 @@ class Yomichan { api_addDefinition({definition, mode, callback}) { const note = this.formatNote(definition, mode); - this.ankiInvoke('addNote', {note}, null, callback); + this.ankiInvokeSafe('addNote', {note}, null, callback); } api_canAddDefinitions({definitions, modes, callback}) { @@ -192,7 +206,7 @@ class Yomichan { } } - this.ankiInvoke('canAddNotes', {notes}, 'notes', (results) => { + this.ankiInvokeSafe('canAddNotes', {notes}, 'notes', (results) => { const states = []; if (results !== null) { @@ -219,15 +233,19 @@ class Yomichan { } api_getDeckNames({callback}) { - this.ankiInvoke('deckNames', {}, null, callback); + this.ankiInvokeSafe('deckNames', {}, null, callback); } api_getModelNames({callback}) { - this.ankiInvoke('modelNames', {}, null, callback); + this.ankiInvokeSafe('modelNames', {}, null, callback); } api_getModelFieldNames({modelName, callback}) { - this.ankiInvoke('modelFieldNames', {modelName}, null, callback); + this.ankiInvokeSafe('modelFieldNames', {modelName}, null, callback); + } + + api_getVersion({callback}) { + this.ankiInvoke('version', {}, null, callback); } api_getOptions({callback}) { diff --git a/ext/bg/options.html b/ext/bg/options.html index 55df936b..c6e14fdf 100644 --- a/ext/bg/options.html +++ b/ext/bg/options.html @@ -16,6 +16,10 @@ border-right: 1px #ddd solid; padding: 10px; } + + .error-dlg { + display: none; + } @@ -60,7 +64,7 @@
- +
@@ -71,6 +75,9 @@

Anki

+
Unable to connect: is the AnkiConnect extension for Anki installed and running?
+
Unsupported version: the installed version of the AnkiConnect extension for Anki is not compatible with this release.
+