From 5393cf4ec928291984daec5628d1dc517ada0761 Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Wed, 11 Nov 2020 11:43:04 +0200 Subject: [PATCH] remove windowManager from extension api Signed-off-by: Jari Kolehmainen --- docs/extensions/typedoc-readme.md.tpl | 5 +-- extensions/support-page/main.ts | 4 +- src/extensions/core-api/index.ts | 7 +--- src/extensions/core-api/navigation.ts | 14 +++++++ src/extensions/renderer-api/index.ts | 2 - src/extensions/renderer-api/navigation.ts | 3 -- src/main/index.ts | 2 +- src/main/tray.ts | 2 +- src/main/window-manager.ts | 4 +- src/renderer/navigation.ts | 46 ++++++++++++++++------- 10 files changed, 56 insertions(+), 33 deletions(-) create mode 100644 src/extensions/core-api/navigation.ts delete mode 100644 src/extensions/renderer-api/navigation.ts diff --git a/docs/extensions/typedoc-readme.md.tpl b/docs/extensions/typedoc-readme.md.tpl index f65035951e..a1d13e2902 100644 --- a/docs/extensions/typedoc-readme.md.tpl +++ b/docs/extensions/typedoc-readme.md.tpl @@ -9,13 +9,10 @@ * [Util](modules/_core_api_utils_.md) * [Component](modules/_renderer_api_components_.md) * [K8sApi](modules/_renderer_api_k8s_api_.md) -* [Navigation](modules/_renderer_api_navigation_.md) +* [Navigation](modules/_core_api_navigation_.md) ## Classes * [LensMainExtension](classes/lensmainextension.md) * [LensRendererExtension](classes/lensrendererextension.md) -## Variables - -* [windowManager](README.md#windowmanager) diff --git a/extensions/support-page/main.ts b/extensions/support-page/main.ts index 70ec3bc026..7ef5683c8f 100644 --- a/extensions/support-page/main.ts +++ b/extensions/support-page/main.ts @@ -1,4 +1,4 @@ -import { LensMainExtension, windowManager } from "@k8slens/extensions"; +import { LensMainExtension, Navigation } from "@k8slens/extensions"; import { supportPageURL } from "./src/support.route"; export default class SupportPageMainExtension extends LensMainExtension { @@ -7,7 +7,7 @@ export default class SupportPageMainExtension extends LensMainExtension { parentId: "help", label: "Support", click() { - windowManager.navigate(supportPageURL()); + Navigation.navigate(supportPageURL()); } } ] diff --git a/src/extensions/core-api/index.ts b/src/extensions/core-api/index.ts index 1a2c59759a..77a85de0dc 100644 --- a/src/extensions/core-api/index.ts +++ b/src/extensions/core-api/index.ts @@ -2,22 +2,19 @@ export * from "../lens-main-extension" export * from "../lens-renderer-extension" -import type { WindowManager } from "../../main/window-manager"; - // APIs import * as App from "./app" import * as EventBus from "./event-bus" import * as Store from "./stores" import * as Util from "./utils" import * as ClusterFeature from "./cluster-feature" - -// TODO: allow to expose windowManager.navigate() as Navigation.navigate() in runtime -export let windowManager: WindowManager; +import * as Navigation from "./navigation" export { App, EventBus, ClusterFeature, + Navigation, Store, Util, } diff --git a/src/extensions/core-api/navigation.ts b/src/extensions/core-api/navigation.ts new file mode 100644 index 0000000000..f480ea58ba --- /dev/null +++ b/src/extensions/core-api/navigation.ts @@ -0,0 +1,14 @@ +import { ipcMain } from "electron"; +import { WindowManager } from "../../main/window-manager"; +import { navigate as navRenderer } from "../../renderer/navigation"; +export { hideDetails, showDetails, getDetailsUrl } from "../../renderer/navigation" +export { RouteProps } from "react-router" +export { IURLParams } from "../../common/utils/buildUrl"; + +export async function navigate(location: string) { + if (ipcMain) { + await WindowManager.getInstance().navigate(location) + } else { + navRenderer(location) + } +} diff --git a/src/extensions/renderer-api/index.ts b/src/extensions/renderer-api/index.ts index ef6de69e61..89f5c10e1a 100644 --- a/src/extensions/renderer-api/index.ts +++ b/src/extensions/renderer-api/index.ts @@ -3,10 +3,8 @@ // APIs import * as Component from "./components" import * as K8sApi from "./k8s-api" -import * as Navigation from "./navigation" export { Component, K8sApi, - Navigation, } diff --git a/src/extensions/renderer-api/navigation.ts b/src/extensions/renderer-api/navigation.ts deleted file mode 100644 index d069f753e1..0000000000 --- a/src/extensions/renderer-api/navigation.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { navigate, hideDetails, showDetails, getDetailsUrl } from "../../renderer/navigation" -export { RouteProps } from "react-router" -export { IURLParams } from "../../common/utils/buildUrl"; diff --git a/src/main/index.ts b/src/main/index.ts index 01b98d0f41..21acda801b 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -78,7 +78,7 @@ app.on("ready", async () => { app.exit(); } - LensExtensionsApi.windowManager = windowManager = new WindowManager(proxyPort); + windowManager = WindowManager.getInstance(proxyPort); extensionLoader.init(await extensionManager.load()); // call after windowManager to see splash earlier setTimeout(() => { diff --git a/src/main/tray.ts b/src/main/tray.ts index 428fd5cb3d..5bc6ce7091 100644 --- a/src/main/tray.ts +++ b/src/main/tray.ts @@ -16,7 +16,7 @@ import { isDevelopment } from "../common/vars"; export let tray: Tray; // refresh icon when MacOS dark/light theme has changed -nativeTheme.on("updated", () => tray?.setImage(getTrayIcon())); +nativeTheme?.on("updated", () => tray?.setImage(getTrayIcon())); export function getTrayIcon(isDark = nativeTheme.shouldUseDarkColors): string { return path.resolve( diff --git a/src/main/window-manager.ts b/src/main/window-manager.ts index 46b008a0d4..ef68cf779f 100644 --- a/src/main/window-manager.ts +++ b/src/main/window-manager.ts @@ -7,8 +7,9 @@ import { extensionLoader } from "../extensions/extension-loader"; import { appEventBus } from "../common/event-bus" import { initMenu } from "./menu"; import { initTray } from "./tray"; +import { Singleton } from "../common/utils"; -export class WindowManager { +export class WindowManager extends Singleton { protected mainWindow: BrowserWindow; protected splashWindow: BrowserWindow; protected windowState: windowStateKeeper.State; @@ -17,6 +18,7 @@ export class WindowManager { @observable activeClusterId: ClusterId; constructor(protected proxyPort: number) { + super(); this.bindEvents(); this.initMenu(); this.initTray(); diff --git a/src/renderer/navigation.ts b/src/renderer/navigation.ts index b4e0f383b1..83d2579a2a 100644 --- a/src/renderer/navigation.ts +++ b/src/renderer/navigation.ts @@ -3,13 +3,24 @@ import { ipcRenderer } from "electron"; import { matchPath } from "react-router"; import { reaction } from "mobx"; -import { createObservableHistory } from "mobx-observable-history"; -import { createBrowserHistory, createMemoryHistory, LocationDescriptor } from "history"; +import { createObservableHistory, IObservableHistory } from "mobx-observable-history"; +import { createBrowserHistory, createMemoryHistory, LocationDescriptor, History } from "history"; import logger from "../main/logger"; import { clusterViewRoute, IClusterViewRouteParams } from "./components/cluster-manager/cluster-view.route"; -export const history = typeof window !== "undefined" ? createBrowserHistory() : createMemoryHistory(); -export const navigation = createObservableHistory(history); +let history: History +let navigation: IObservableHistory + +if (ipcRenderer) { + history = typeof window !== "undefined" ? createBrowserHistory() : createMemoryHistory(); + navigation = createObservableHistory(history); +} + +export { + history, + navigation +} + export function navigate(location: LocationDescriptor) { const currentLocation = navigation.getPath(); @@ -60,6 +71,9 @@ export function getDetailsUrl(details: string) { }); } +/** + * Show details. Works only in renderer. + */ export function showDetails(path: string, resetSelected = true) { navigation.searchParams.merge({ details: path, @@ -67,6 +81,9 @@ export function showDetails(path: string, resetSelected = true) { }) } +/** + * Hide details. Works only in renderer. + */ export function hideDetails() { showDetails(null) } @@ -99,14 +116,15 @@ if (process.isMainFrame) { fireImmediately: true }) } +if (ipcRenderer) { + // Handle navigation via IPC (e.g. from top menu) + ipcRenderer.on("menu:navigate", (event, location: LocationDescriptor) => { + logger.info(`[IPC]: ${event.type} ${JSON.stringify(location)}`, event); + navigate(location); + }); -// Handle navigation via IPC (e.g. from top menu) -ipcRenderer.on("menu:navigate", (event, location: LocationDescriptor) => { - logger.info(`[IPC]: ${event.type} ${JSON.stringify(location)}`, event); - navigate(location); -}); - -// Reload dashboard window -ipcRenderer.on("menu:reload", () => { - location.reload(); -}); + // Reload dashboard window + ipcRenderer.on("menu:reload", () => { + location.reload(); + }); +}