diff options
Diffstat (limited to 'ext')
-rw-r--r-- | ext/js/pages/settings/popup-preview-controller.js | 22 | ||||
-rw-r--r-- | ext/js/pages/settings/popup-preview-frame.js | 50 | ||||
-rw-r--r-- | ext/popup-preview.html | 4 |
3 files changed, 66 insertions, 10 deletions
diff --git a/ext/js/pages/settings/popup-preview-controller.js b/ext/js/pages/settings/popup-preview-controller.js index 5194410c..bd335460 100644 --- a/ext/js/pages/settings/popup-preview-controller.js +++ b/ext/js/pages/settings/popup-preview-controller.js @@ -47,6 +47,14 @@ export class PopupPreviewController { this._customOuterCss.addEventListener('settingChanged', this._onCustomOuterCssChange.bind(this), false); this._frame.addEventListener('load', this._onFrameLoad.bind(this), false); this._settingsController.on('optionsContextChanged', this._onOptionsContextChange.bind(this)); + this._settingsController.on('optionsChanged', this._onOptionsChanged.bind(this)); + const languageSelect = querySelectorNotNull(document, '#language-select'); + languageSelect.addEventListener( + /** @type {string} */ ('settingChanged'), + /** @type {EventListener} */ (this._onLanguageSelectChanged.bind(this)), + false + ); + this._frame.src = '/popup-preview.html'; } @@ -79,6 +87,20 @@ export class PopupPreviewController { } /** + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details + */ + _onOptionsChanged({options}) { + this._invoke('PopupPreviewFrame.optionsChanged', {options}); + } + + /** + * @param {import('dom-data-binder').SettingChangedEvent} settingChangedEvent + */ + _onLanguageSelectChanged(settingChangedEvent) { + this._invoke('PopupPreviewFrame.setLanguageExampleText', {language: settingChangedEvent.detail.value}); + } + + /** * @param {string} action * @param {import('core').SerializableObject} params */ diff --git a/ext/js/pages/settings/popup-preview-frame.js b/ext/js/pages/settings/popup-preview-frame.js index 2898eaa2..d3e21641 100644 --- a/ext/js/pages/settings/popup-preview-frame.js +++ b/ext/js/pages/settings/popup-preview-frame.js @@ -52,24 +52,26 @@ export class PopupPreviewFrame { this._exampleTextInput = querySelectorNotNull(document, '#example-text-input'); /** @type {string} */ this._targetOrigin = chrome.runtime.getURL('/').replace(/\/$/, ''); + /** @type {import('language').LanguageSummary[]} */ + this._languageSummaries = []; + /** @type {boolean} */ + this._wanakanaBound = false; /* eslint-disable @stylistic/no-multi-spaces */ /** @type {Map<string, (params: import('core').SerializableObjectAny) => void>} */ this._windowMessageHandlers = new Map(/** @type {[key: string, handler: (params: import('core').SerializableObjectAny) => void][]} */ ([ - ['PopupPreviewFrame.setText', this._onSetText.bind(this)], - ['PopupPreviewFrame.setCustomCss', this._setCustomCss.bind(this)], - ['PopupPreviewFrame.setCustomOuterCss', this._setCustomOuterCss.bind(this)], - ['PopupPreviewFrame.updateOptionsContext', this._updateOptionsContext.bind(this)] + ['PopupPreviewFrame.setText', this._onSetText.bind(this)], + ['PopupPreviewFrame.setCustomCss', this._setCustomCss.bind(this)], + ['PopupPreviewFrame.setCustomOuterCss', this._setCustomOuterCss.bind(this)], + ['PopupPreviewFrame.updateOptionsContext', this._updateOptionsContext.bind(this)], + ['PopupPreviewFrame.optionsChanged', this._onOptionsChanged.bind(this)], + ['PopupPreviewFrame.setLanguageExampleText', this._setLanguageExampleText.bind(this)] ])); /* eslint-enable @stylistic/no-multi-spaces */ } /** */ async prepare() { - if (this._exampleTextInput !== null && typeof wanakana !== 'undefined') { - wanakana.bind(this._exampleTextInput); - } - window.addEventListener('message', this._onMessage.bind(this), false); // Setup events @@ -85,6 +87,10 @@ export class PopupPreviewFrame { this._apiOptionsGetOld = this._application.api.optionsGet.bind(this._application.api); this._application.api.optionsGet = this._apiOptionsGet.bind(this); + this._languageSummaries = await this._application.api.getLanguageSummaries(); + const options = await this._application.api.optionsGet({current: true}); + this._onOptionsChanged({options, optionsContext: {current: true}}); + // Overwrite frontend this._frontend = new Frontend({ application: this._application, @@ -268,6 +274,34 @@ export class PopupPreviewFrame { await this._updateSearch(); } + /** + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details + */ + async _onOptionsChanged({options: {general: {language}}}) { + this._setLanguageExampleText({language}); + } + + /** + * @param {{language: string}} details + */ + _setLanguageExampleText({language}) { + const activeLanguage = /** @type {import('language').LanguageSummary} */ (this._languageSummaries.find(({iso}) => iso === language)); + + if (this._exampleTextInput !== null) { + if (language === 'ja') { + wanakana.bind(this._exampleTextInput); + this._wanakanaBound = true; + } else if (this._wanakanaBound) { + wanakana.unbind(this._exampleTextInput); + this._wanakanaBound = false; + } + } + + this._exampleTextInput.lang = language; + this._exampleTextInput.value = activeLanguage.exampleText; + this._exampleTextInput.dispatchEvent(new Event('input')); + } + /** */ async _updateSearch() { if (this._exampleText === null) { return; } diff --git a/ext/popup-preview.html b/ext/popup-preview.html index 15810242..0d410455 100644 --- a/ext/popup-preview.html +++ b/ext/popup-preview.html @@ -20,8 +20,8 @@ <div class="top-options"> <div class="top-options-left"> <div class="example-text-container"> - <input type="text" class="example-text example-text-input" id="example-text-input" value="読め" lang="ja" hidden> - <span class="example-text" id="example-text">読め</span> + <input type="text" class="example-text example-text-input" id="example-text-input" hidden> + <span class="example-text" id="example-text"></span> </div> </div> <div class="top-options-right"> |