diff options
author | Ewan Fox <ewan@ewanfox.com> | 2023-08-20 05:02:48 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-20 13:02:48 +0900 |
commit | b5752a451e93cc58b281552fc64125f807e32e15 (patch) | |
tree | c90d9d0fabb652e3e41f749bdb909682d42330d3 /ext/js | |
parent | dea8898c9dbfefde038c1648580efd25f974126f (diff) |
Add Intuitive Permission Toggle to Welcome Page (#214)
Diffstat (limited to 'ext/js')
-rw-r--r-- | ext/js/pages/settings/recommended-permissions-controller.js | 74 | ||||
-rw-r--r-- | ext/js/pages/welcome-main.js | 4 |
2 files changed, 78 insertions, 0 deletions
diff --git a/ext/js/pages/settings/recommended-permissions-controller.js b/ext/js/pages/settings/recommended-permissions-controller.js new file mode 100644 index 00000000..3d25d5eb --- /dev/null +++ b/ext/js/pages/settings/recommended-permissions-controller.js @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2023 Yomitan Authors + * Copyright (C) 2021-2022 Yomichan Authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +class RecommendedPermissionsController { + constructor(settingsController) { + this._settingsController = settingsController; + this._originToggleNodes = null; + this._eventListeners = new EventListenerCollection(); + this._errorContainer = null; + } + + async prepare() { + this._originToggleNodes = document.querySelectorAll('.recommended-permissions-toggle'); + this._errorContainer = document.querySelector('#recommended-permissions-error'); + for (const node of this._originToggleNodes) { + node.addEventListener('change', this._onOriginToggleChange.bind(this), false); + } + + this._settingsController.on('permissionsChanged', this._onPermissionsChanged.bind(this)); + await this._updatePermissions(); + } + + // Private + + _onPermissionsChanged({permissions}) { + this._eventListeners.removeAllEventListeners(); + const originsSet = new Set(permissions.origins); + for (const node of this._originToggleNodes) { + node.checked = originsSet.has(node.dataset.origin); + } + } + + _onOriginToggleChange(e) { + const node = e.currentTarget; + const value = node.checked; + node.checked = !value; + + const {origin} = node.dataset; + this._setOriginPermissionEnabled(origin, value); + } + + async _updatePermissions() { + const permissions = await this._settingsController.permissionsUtil.getAllPermissions(); + this._onPermissionsChanged({permissions}); + } + + async _setOriginPermissionEnabled(origin, enabled) { + let added = false; + try { + added = await this._settingsController.permissionsUtil.setPermissionsGranted({origins: [origin]}, enabled); + } catch (e) { + this._errorContainer.hidden = false; + this._errorContainer.textContent = e.message; + } + if (!added) { return false; } + await this._updatePermissions(); + return true; + } +} diff --git a/ext/js/pages/welcome-main.js b/ext/js/pages/welcome-main.js index eb8bd675..521ce2c2 100644 --- a/ext/js/pages/welcome-main.js +++ b/ext/js/pages/welcome-main.js @@ -23,6 +23,7 @@ * ExtensionContentController * GenericSettingController * ModalController + * RecommendedPermissionsController * ScanInputsSimpleController * SettingsController * SettingsDisplayController @@ -77,6 +78,9 @@ async function setupGenericSettingsController(genericSettingController) { const simpleScanningInputController = new ScanInputsSimpleController(settingsController); simpleScanningInputController.prepare(); + const recommendedPermissionsController = new RecommendedPermissionsController(settingsController); + recommendedPermissionsController.prepare(); + await Promise.all(preparePromises); document.documentElement.dataset.loaded = 'true'; |