diff --git a/src/client/src/components/PiWebApp.ts b/src/client/src/components/PiWebApp.ts index 9d25f0c..5e6c925 100644 --- a/src/client/src/components/PiWebApp.ts +++ b/src/client/src/components/PiWebApp.ts @@ -147,6 +147,7 @@ export class PiWebApp extends LitElement { private readonly plugins = createPluginRegistry(); private readonly loadedMachinePluginIds = new Set(); private readonly machinePluginLoadPromises = new Map>(); + private gatewayPluginLoadPromise: Promise | undefined; private themePreference: ThemePreference = readStoredThemePreference() ?? DEFAULT_THEME_PREFERENCE; @state() private activeThemeId: QualifiedContributionId = CLASSIC_THEME_ID; @state() private isRefreshingApp = false; @@ -207,7 +208,7 @@ export class PiWebApp extends LitElement { void this.refreshPiWebStatus(); void this.refreshWorkspaceActivity(); void this.loadClientConfig(); - void this.loadExternalPlugins(); + void this.ensureGatewayPluginsLoaded(); void this.loadProjectsAndRestoreRoute(); } @@ -972,6 +973,11 @@ export class PiWebApp extends LitElement { return applyShortcutPreferences(this.plugins.getActions(this.createPluginRuntimeContext()), this.shortcutConfig); } + private ensureGatewayPluginsLoaded(): Promise { + this.gatewayPluginLoadPromise ??= this.loadExternalPlugins(); + return this.gatewayPluginLoadPromise; + } + private async loadExternalPlugins(): Promise { await this.registerExternalPlugins("PI WEB plugins", () => loadExternalPlugins()); } @@ -983,6 +989,7 @@ export class PiWebApp extends LitElement { } private async loadPluginsForMachine(machine: Machine): Promise { + await this.ensureGatewayPluginsLoaded(); if (machine.kind !== "remote" || this.loadedMachinePluginIds.has(machine.id)) return; const existing = this.machinePluginLoadPromises.get(machine.id); if (existing !== undefined) return existing;