diff options
Diffstat (limited to 'ext/bg/js/backend.js')
-rw-r--r-- | ext/bg/js/backend.js | 143 |
1 files changed, 89 insertions, 54 deletions
diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index 2f60b4b7..6b345e6d 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -17,67 +17,102 @@ */ -window.yomichan = new class { +window.yomichan_backend = new class { constructor() { this.translator = new Translator(); this.anki = new AnkiNull(); this.options = null; + } - this.translator.prepare().then(optionsLoad).then(options => { - apiOptionsSet(options); - - chrome.commands.onCommand.addListener(apiCommandExec); - chrome.runtime.onMessage.addListener(({action, params}, sender, callback) => { - const forward = (promise, callback) => { - return promise.then(result => { - callback({result}); - }).catch(error => { - callback({error}); - }); - }; - - const handlers = { - optionsGet: ({callback}) => { - forward(optionsLoad(), callback); - }, - - kanjiFind: ({text, callback}) => { - forward(apiKanjiFind(text), callback); - }, - - termsFind: ({text, callback}) => { - forward(apiTermsFind(text), callback); - }, - - templateRender: ({template, data, callback}) => { - forward(apiTemplateRender(template, data), callback); - }, - - definitionAdd: ({definition, mode, callback}) => { - forward(apiDefinitionAdd(definition, mode), callback); - }, - - definitionsAddable: ({definitions, modes, callback}) => { - forward(apiDefinitionsAddable(definitions, modes), callback); - }, - - noteView: ({noteId}) => { - forward(apiNoteView(noteId), callback); - } - }; - - const handler = handlers[action]; - if (handler) { - params.callback = callback; - handler(params); - } - - return true; - }); + async prepare() { + await this.translator.prepare(); + await apiOptionsSet(await optionsLoad()); + + chrome.commands.onCommand.addListener(this.onCommand.bind(this)); + chrome.runtime.onMessage.addListener(this.onMessage.bind(this)); + + if (this.options.general.showGuide) { + chrome.tabs.create({url: chrome.extension.getURL('/bg/guide.html')}); + } + } + + optionsSet(options) { + this.options = options; - if (options.general.showGuide) { - chrome.tabs.create({url: chrome.extension.getURL('/bg/guide.html')}); + if (!options.general.enable) { + chrome.browserAction.setBadgeBackgroundColor({color: '#d9534f'}); + chrome.browserAction.setBadgeText({text: 'off'}); + } else if (!dictConfigured(options)) { + chrome.browserAction.setBadgeBackgroundColor({color: '#f0ad4e'}); + chrome.browserAction.setBadgeText({text: '!'}); + } else { + chrome.browserAction.setBadgeText({text: ''}); + } + + if (options.anki.enable) { + backend().anki = new AnkiConnect(options.anki.server); + } else { + backend().anki = new AnkiNull(); + } + + chrome.tabs.query({}, tabs => { + for (const tab of tabs) { + chrome.tabs.sendMessage(tab.id, {action: 'optionsSet', params: options}, () => null); } }); } + + onCommand(command) { + apiCommandExec(command); + } + + onMessage({action, params}, sender, callback) { + const forward = (promise, callback) => { + return promise.then(result => { + callback({result}); + }).catch(error => { + callback({error}); + }); + }; + + const handlers = { + optionsGet: ({callback}) => { + forward(optionsLoad(), callback); + }, + + kanjiFind: ({text, callback}) => { + forward(apiKanjiFind(text), callback); + }, + + termsFind: ({text, callback}) => { + forward(apiTermsFind(text), callback); + }, + + templateRender: ({template, data, callback}) => { + forward(apiTemplateRender(template, data), callback); + }, + + definitionAdd: ({definition, mode, callback}) => { + forward(apiDefinitionAdd(definition, mode), callback); + }, + + definitionsAddable: ({definitions, modes, callback}) => { + forward(apiDefinitionsAddable(definitions, modes), callback); + }, + + noteView: ({noteId}) => { + forward(apiNoteView(noteId), callback); + } + }; + + const handler = handlers[action]; + if (handler) { + params.callback = callback; + handler(params); + } + + return true; + } }; + +window.yomichan_backend.prepare(); |