diff options
| -rw-r--r-- | ext/bg/js/options-form.js | 13 | ||||
| -rw-r--r-- | ext/bg/js/yomichan.js | 28 | ||||
| -rw-r--r-- | ext/bg/options.html | 9 | 
3 files changed, 44 insertions, 6 deletions
| 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; +            }          </style>      </head>      <body> @@ -60,7 +64,7 @@                      <div class="form-group">                          <div class="col-sm-offset-2 col-sm-10">                              <div class="checkbox"> -                                <label class="control-label"><input type="checkbox" id="enable-anki-connect"> Enable <a href="https://foosoft.net/projects/yomichan">AnkiConnect</a></label> +                                <label class="control-label"><input type="checkbox" id="enable-anki-connect"> Enable <a href="https://foosoft.net/projects/anki-connect">AnkiConnect</a></label>                              </div>                          </div>                      </div> @@ -71,6 +75,9 @@              <div class="options-anki">                  <h2>Anki</h2> +                <div class="alert alert-danger error-dlg error-dlg-connection"><strong>Unable to connect</strong>: is the <a href="https://foosoft.net/projects/anki-connect">AnkiConnect</a> extension for <a href="http://ankisrs.net/">Anki</a> installed and running?</div> +                <div class="alert alert-warning error-dlg error-dlg-version"><strong>Unsupported version</strong>: the installed version of the <a href="https://foosoft.net/projects/anki-connect">AnkiConnect</a> extension for <a href="http://ankisrs.net/">Anki</a> is not compatible with this release.</div> +                  <form class="form-horizontal">                      <ul class="nav nav-tabs">                          <li class="active"><a href="#vocab" data-toggle="tab">Vocabulary</a></li> |