From d9198317ae224b85c26d5cf7fa0ae89d61ad20e8 Mon Sep 17 00:00:00 2001 From: Evan Welsh Date: Mon, 10 Jul 2023 02:34:17 -0700 Subject: [PATCH] components: Change component loading to be asynchronous Some components use build time optional dependencies such as GNOME Bluetooth, so we need to import the components conditionally. Also rename to get rid of __init__.js file Part-of: --- js/js-resources.gresource.xml | 2 +- .../{components/__init__.js => components.js} | 26 +++++++++++-------- 2 files changed, 16 insertions(+), 12 deletions(-) rename js/ui/{components/__init__.js => components.js} (63%) diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml index e223ee128..ee4b7635e 100644 --- a/js/js-resources.gresource.xml +++ b/js/js-resources.gresource.xml @@ -127,7 +127,7 @@ ui/workspacesView.js ui/xdndHandler.js - ui/components/__init__.js + ui/components.js ui/components/autorunManager.js ui/components/automountManager.js ui/components/networkAgent.js diff --git a/js/ui/components/__init__.js b/js/ui/components.js similarity index 63% rename from js/ui/components/__init__.js rename to js/ui/components.js index 74300136b..06751a964 100644 --- a/js/ui/components/__init__.js +++ b/js/ui/components.js @@ -6,16 +6,19 @@ var ComponentManager = class { this._allComponents = {}; this._enabledComponents = []; - Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); - this._sessionUpdated(); + Main.sessionMode.connect('updated', () => { + this._sessionModeUpdated().catch(logError); + }); + + this._sessionModeUpdated().catch(logError); } - _sessionUpdated() { + async _sessionModeUpdated() { let newEnabledComponents = Main.sessionMode.components; - newEnabledComponents + await Promise.allSettled([...newEnabledComponents .filter(name => !this._enabledComponents.includes(name)) - .forEach(name => this._enableComponent(name)); + .map(name => this._enableComponent(name))]); this._enabledComponents .filter(name => !newEnabledComponents.includes(name)) @@ -24,12 +27,13 @@ var ComponentManager = class { this._enabledComponents = newEnabledComponents; } - _importComponent(name) { - let module = imports.ui.components[name]; + async _importComponent(name) { + // TODO: Import as module + let module = await imports.ui.components[name]; return module.Component; } - _ensureComponent(name) { + async _ensureComponent(name) { let component = this._allComponents[name]; if (component) return component; @@ -37,14 +41,14 @@ var ComponentManager = class { if (Main.sessionMode.isLocked) return null; - let constructor = this._importComponent(name); + let constructor = await this._importComponent(name); component = new constructor(); this._allComponents[name] = component; return component; } - _enableComponent(name) { - let component = this._ensureComponent(name); + async _enableComponent(name) { + let component = await this._ensureComponent(name); if (component) component.enable(); }