diff --git a/packages/web_ui/src/bootstrap.jsx b/packages/web_ui/src/bootstrap.jsx index 611e931f..4b245cd7 100644 --- a/packages/web_ui/src/bootstrap.jsx +++ b/packages/web_ui/src/bootstrap.jsx @@ -25,7 +25,7 @@ async function loadScript(url) { return result; } -async function loadPluginInfos() { +async function loadPlugins() { let response = await fetch(`${webRoot}api/plugins`); let pluginList; if (response.ok) { @@ -36,22 +36,28 @@ async function loadPluginInfos() { pluginList = []; } - let pluginInfos = []; + let plugins = []; await __webpack_init_sharing__("default"); - for (let plugin of pluginList) { + for (let meta of pluginList) { try { - await loadScript(`${webRoot}plugin/${plugin.name}/remoteEntry.js`); - let container = window[`plugin_${plugin.name}`]; + await loadScript(`${webRoot}plugin/${meta.name}/remoteEntry.js`); + let container = window[`plugin_${meta.name}`]; await container.init(__webpack_share_scopes__.default); - let info = (await container.get("./info"))(); - info.container = container; - pluginInfos.push(info); + let pluginInfo = (await container.get("./info"))(); + plugins.push({ + meta, + info: pluginInfo, + container, + }); } catch (err) { - logger.error(`Failed to load plugin info for ${plugin.name}`); + logger.error(`Failed to load plugin info for ${meta.name}`); + plugins.push({ + meta, + }); } } - return pluginInfos; + return plugins; } async function load() { @@ -59,8 +65,8 @@ async function load() { level: "verbose", format: new WebConsoleFormat(), })); - let pluginInfos = await loadPluginInfos(); - libConfig.registerPluginConfigGroups(pluginInfos); + let plugins = await loadPlugins(); + libConfig.registerPluginConfigGroups(plugins.filter(p => p.info).map(p => p.info)); libConfig.finalizeConfigs(); let wsUrl = new URL(window.webRoot, document.location); @@ -69,7 +75,7 @@ async function load() { let controlConnector = new ControlConnector(wsUrl, 10); let control = new Control(controlConnector, []); - ReactDOM.render(, document.getElementById("root")); + ReactDOM.render(, document.getElementById("root")); } load().catch((err) => logger.fatal(err.stack)); diff --git a/packages/web_ui/src/components/App.jsx b/packages/web_ui/src/components/App.jsx index 54dc63f0..2c90130d 100644 --- a/packages/web_ui/src/components/App.jsx +++ b/packages/web_ui/src/components/App.jsx @@ -7,6 +7,7 @@ import { logger } from "@clusterio/lib/logging"; import basename from "../basename"; import SiteLayout from "./SiteLayout"; import ControlContext from "./ControlContext"; +import PluginsContext from "./PluginsContext"; import LoginForm from "./LoginForm"; import { Card, Spin } from "antd"; @@ -77,9 +78,11 @@ export default function App(props) { return ( - - {page} - + + + {page} + + ); } diff --git a/packages/web_ui/src/components/PluginsContext.jsx b/packages/web_ui/src/components/PluginsContext.jsx new file mode 100644 index 00000000..979faf93 --- /dev/null +++ b/packages/web_ui/src/components/PluginsContext.jsx @@ -0,0 +1,3 @@ +import React from "react"; + +export default React.createContext();