diff options
Diffstat (limited to 'ext/fg/js')
| -rw-r--r-- | ext/fg/js/frame.js | 119 | 
1 files changed, 69 insertions, 50 deletions
| diff --git a/ext/fg/js/frame.js b/ext/fg/js/frame.js index 648136d0..4a086abb 100644 --- a/ext/fg/js/frame.js +++ b/ext/fg/js/frame.js @@ -19,7 +19,8 @@  class FrameContext {      constructor() {          this.definitions = []; -        this.audio = {}; +        this.audioCache = {}; +        this.sequence = 0;          $(window).on('message', e => {              const {action, params} = e.originalEvent.data, method = this['api_' + action]; @@ -30,6 +31,7 @@ class FrameContext {      }      api_showTermDefs({definitions, options}) { +        const sequence = ++this.sequence;          const context = {              definitions,              addable: options.ankiMethod !== 'disabled', @@ -38,13 +40,15 @@ class FrameContext {          this.definitions = definitions;          this.showSpinner(false); +        window.scrollTo(0, 0);          renderText(context, 'term-list.html').then(content => {              $('.content').html(content); +            $('.action-add-note').click(this.onAddNote.bind(this));              $('.kanji-link').click(e => {                  e.preventDefault(); -                findKanji($(e.target).text()).then(defs => this.api_showKanjiDefs({options, definitions: defs})); +                findKanji($(e.target).text()).then(kdefs => this.api_showKanjiDefs({options, definitions: kdefs}));              });              $('.action-play-audio').click(e => { @@ -53,50 +57,12 @@ class FrameContext {                  this.playAudio(this.definitions[index]);              }); -            $('.action-add-note').click(e => { -                e.preventDefault(); -                this.showSpinner(true); - -                const link = $(e.currentTarget); -                const index = link.data('index'); -                const mode = link.data('mode'); - -                addDefinition(this.definitions[index], mode).then(success => { -                    if (success) { -                        const button = this.getAddButton(index, mode); -                        button.addClass('disabled'); -                    } else { -                        window.alert('Note could not be added'); -                    } -                }).catch(error => { -                    window.alert('Error: ' + error); -                }).then(() => { -                    this.showSpinner(false); -                }); -            }); - -            canAddDefinitions(definitions, ['term_kanji', 'term_kana']).then(states => { -                if (states === null) { -                    return; -                } - -                states.forEach((state, index) => { -                    for (const mode in state) { -                        const button = this.getAddButton(index, mode); -                        if (state[mode]) { -                            button.removeClass('disabled'); -                        } else { -                            button.addClass('disabled'); -                        } - -                        button.removeClass('pending'); -                    } -                }); -            }); +            this.updateAddNoteButtons(['term_kanji', 'term_kana'], sequence);          });      }      api_showKanjiDefs({definitions, options}) { +        const sequence = ++this.sequence;          const context = {              definitions,              addable: options.ankiMethod !== 'disabled' @@ -104,19 +70,74 @@ class FrameContext {          this.definitions = definitions;          this.showSpinner(false); +        window.scrollTo(0, 0);          renderText(context, 'kanji-list.html').then(content => {              $('.content').html(content); +            $('.action-add-note').click(this.onAddNote.bind(this)); + +            this.updateAddNoteButtons(['kanji'], sequence);          });      } -    getAddButton(index, mode) { +    findAddNoteButton(index, mode) {          return $(`.action-add-note[data-index="${index}"][data-mode="${mode}"]`);      } +    onAddNote(e) { +        e.preventDefault(); +        this.showSpinner(true); + +        const link = $(e.currentTarget); +        const index = link.data('index'); +        const mode = link.data('mode'); + +        addDefinition(this.definitions[index], mode).then(success => { +            if (success) { +                const button = this.findAddNoteButton(index, mode); +                button.addClass('disabled'); +            } else { +                window.alert('Note could not be added'); +            } +        }).catch(error => { +            window.alert('Error: ' + error); +        }).then(() => { +            this.showSpinner(false); +        }); +    } + +    updateAddNoteButtons(modes, sequence) { +        canAddDefinitions(this.definitions, modes).then(states => { +            if (states === null) { +                return; +            } + +            if (sequence !== this.sequence) { +                return; +            } + +            states.forEach((state, index) => { +                for (const mode in state) { +                    const button = this.findAddNoteButton(index, mode); +                    if (state[mode]) { +                        button.removeClass('disabled'); +                    } else { +                        button.addClass('disabled'); +                    } + +                    button.removeClass('pending'); +                } +            }); +        }); +    } +      showSpinner(show) { -        const spinner = document.querySelector('.spinner'); -        spinner.style.visibility = show ? 'visible' : 'hidden'; +        const spinner = $('.spinner'); +        if (show) { +            spinner.show(); +        } else { +            spinner.hide(); +        }      }      playAudio(definition) { @@ -125,15 +146,13 @@ class FrameContext {              url += `&kana=${encodeURIComponent(definition.reading)}`;          } -        for (const key in this.audio) { -            this.audio[key].pause(); +        for (const key in this.audioCache) { +            this.audioCache[key].pause();          } -        const audio = this.audio[url] || new Audio(url); +        const audio = this.audioCache[url] || new Audio(url);          audio.currentTime = 0;          audio.play(); - -        this.audio[url] = audio;      }  } |