diff --git a/package.json b/package.json index 88e83d0095..9a16cbe6f9 100644 --- a/package.json +++ b/package.json @@ -207,7 +207,6 @@ "openid-client": "^3.15.2", "path-to-regexp": "^6.1.0", "proper-lockfile": "^4.1.1", - "react-router": "^5.2.0", "request": "^2.88.2", "request-promise-native": "^1.0.8", "semver": "^7.3.2", @@ -313,6 +312,7 @@ "react": "^16.14.0", "react-beautiful-dnd": "^13.0.0", "react-dom": "^16.13.1", + "react-router": "^5.2.0", "react-router-dom": "^5.2.0", "react-select": "^3.1.0", "react-window": "^1.8.5", diff --git a/src/common/utils/buildUrl.ts b/src/common/utils/buildUrl.ts new file mode 100644 index 0000000000..cdaf36720c --- /dev/null +++ b/src/common/utils/buildUrl.ts @@ -0,0 +1,14 @@ +import { compile } from "path-to-regexp" + +export interface IURLParams

{ + params?: P; + query?: Q; +} + +export function buildURL

(path: string | any) { + const pathBuilder = compile(String(path)); + return function ({ params, query }: IURLParams = {}) { + const queryParams = query ? new URLSearchParams(Object.entries(query)).toString() : "" + return pathBuilder(params) + (queryParams ? `?${queryParams}` : "") + } +} diff --git a/src/common/workspace-store.ts b/src/common/workspace-store.ts index 752a53f41b..a7afb7e6cc 100644 --- a/src/common/workspace-store.ts +++ b/src/common/workspace-store.ts @@ -1,8 +1,6 @@ import { action, computed, observable, toJS } from "mobx"; import { BaseStore } from "./base-store"; import { clusterStore } from "./cluster-store" -import { landingURL } from "../renderer/components/+landing-page/landing-page.route"; -import { navigate } from "../renderer/navigation"; export type WorkspaceId = string; @@ -56,18 +54,13 @@ export class WorkspaceStore extends BaseStore { } @action - setActive(id = WorkspaceStore.defaultId, { redirectToLanding = true, resetActiveCluster = true } = {}) { + setActive(id = WorkspaceStore.defaultId, reset = true) { if (id === this.currentWorkspaceId) return; if (!this.getById(id)) { throw new Error(`workspace ${id} doesn't exist`); } this.currentWorkspaceId = id; - if (resetActiveCluster) { - clusterStore.setActive(null) - } - if (redirectToLanding) { - navigate(landingURL()) - } + clusterStore.activeClusterId = null; // fixme: handle previously selected cluster from current workspace } @action diff --git a/src/renderer/components/+add-cluster/add-cluster.route.ts b/src/renderer/components/+add-cluster/add-cluster.route.ts index 21f7522f0f..ba3ffcd104 100644 --- a/src/renderer/components/+add-cluster/add-cluster.route.ts +++ b/src/renderer/components/+add-cluster/add-cluster.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const addClusterRoute: RouteProps = { path: "/add-cluster" diff --git a/src/renderer/components/+apps-helm-charts/helm-charts.route.ts b/src/renderer/components/+apps-helm-charts/helm-charts.route.ts index 181f0c47f1..047ff656b6 100644 --- a/src/renderer/components/+apps-helm-charts/helm-charts.route.ts +++ b/src/renderer/components/+apps-helm-charts/helm-charts.route.ts @@ -1,6 +1,6 @@ -import { RouteProps } from "react-router" +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; import { appsRoute } from "../+apps/apps.route"; -import { buildURL } from "../../navigation"; export const helmChartsRoute: RouteProps = { path: appsRoute.path + "/charts/:repo?/:chartName?" diff --git a/src/renderer/components/+apps-releases/release.route.ts b/src/renderer/components/+apps-releases/release.route.ts index 673a875b08..f874fefe67 100644 --- a/src/renderer/components/+apps-releases/release.route.ts +++ b/src/renderer/components/+apps-releases/release.route.ts @@ -1,6 +1,6 @@ -import { RouteProps } from "react-router" +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; import { appsRoute } from "../+apps/apps.route"; -import { buildURL } from "../../navigation"; export const releaseRoute: RouteProps = { path: appsRoute.path + "/releases/:namespace?/:name?" diff --git a/src/renderer/components/+apps/apps.route.ts b/src/renderer/components/+apps/apps.route.ts index 065fbe05d6..5ed0671ace 100644 --- a/src/renderer/components/+apps/apps.route.ts +++ b/src/renderer/components/+apps/apps.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const appsRoute: RouteProps = { path: "/apps", diff --git a/src/renderer/components/+cluster-settings/cluster-settings.route.ts b/src/renderer/components/+cluster-settings/cluster-settings.route.ts index a2c7a45fd8..3d1b1b2737 100644 --- a/src/renderer/components/+cluster-settings/cluster-settings.route.ts +++ b/src/renderer/components/+cluster-settings/cluster-settings.route.ts @@ -1,6 +1,6 @@ import type { IClusterViewRouteParams } from "../cluster-manager/cluster-view.route"; -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export interface IClusterSettingsRouteParams extends IClusterViewRouteParams { } diff --git a/src/renderer/components/+cluster/cluster.route.ts b/src/renderer/components/+cluster/cluster.route.ts index f541d83945..fbe1c47b86 100644 --- a/src/renderer/components/+cluster/cluster.route.ts +++ b/src/renderer/components/+cluster/cluster.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const clusterRoute: RouteProps = { path: "/cluster" diff --git a/src/renderer/components/+config-autoscalers/hpa.route.ts b/src/renderer/components/+config-autoscalers/hpa.route.ts index 500b260062..0828db146b 100644 --- a/src/renderer/components/+config-autoscalers/hpa.route.ts +++ b/src/renderer/components/+config-autoscalers/hpa.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const hpaRoute: RouteProps = { path: "/hpa" diff --git a/src/renderer/components/+config-maps/config-maps.route.ts b/src/renderer/components/+config-maps/config-maps.route.ts index 9f68afcfeb..3f42cf7e76 100644 --- a/src/renderer/components/+config-maps/config-maps.route.ts +++ b/src/renderer/components/+config-maps/config-maps.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const configMapsRoute: RouteProps = { path: "/configmaps" diff --git a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.route.ts b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.route.ts index f7a3206f0f..b35f30bb8b 100644 --- a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.route.ts +++ b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const pdbRoute: RouteProps = { path: "/poddisruptionbudgets" diff --git a/src/renderer/components/+config-resource-quotas/resource-quotas.route.ts b/src/renderer/components/+config-resource-quotas/resource-quotas.route.ts index 1040f2dc09..ee6966da97 100644 --- a/src/renderer/components/+config-resource-quotas/resource-quotas.route.ts +++ b/src/renderer/components/+config-resource-quotas/resource-quotas.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const resourceQuotaRoute: RouteProps = { path: "/resourcequotas" diff --git a/src/renderer/components/+config-secrets/secrets.route.ts b/src/renderer/components/+config-secrets/secrets.route.ts index 1dcce30e2f..bd5f9a442d 100644 --- a/src/renderer/components/+config-secrets/secrets.route.ts +++ b/src/renderer/components/+config-secrets/secrets.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const secretsRoute: RouteProps = { path: "/secrets" diff --git a/src/renderer/components/+config/config.route.ts b/src/renderer/components/+config/config.route.ts index 9b114c510b..f480e84952 100644 --- a/src/renderer/components/+config/config.route.ts +++ b/src/renderer/components/+config/config.route.ts @@ -1,7 +1,7 @@ import { RouteProps } from "react-router"; -import { configMapsURL } from "../+config-maps"; import { Config } from "./config"; -import { IURLParams } from "../../navigation"; +import { IURLParams } from "../../../common/utils/buildUrl"; +import { configMapsURL } from "../+config-maps/config-maps.route"; export const configRoute: RouteProps = { get path() { diff --git a/src/renderer/components/+config/config.tsx b/src/renderer/components/+config/config.tsx index 17c0c5c575..7e42c7fcc8 100644 --- a/src/renderer/components/+config/config.tsx +++ b/src/renderer/components/+config/config.tsx @@ -10,8 +10,8 @@ import { resourceQuotaRoute, ResourceQuotas, resourceQuotaURL } from "../+config import { PodDisruptionBudgets, pdbRoute, pdbURL } from "../+config-pod-disruption-budgets"; import { configURL } from "./config.route"; import { HorizontalPodAutoscalers, hpaRoute, hpaURL } from "../+config-autoscalers"; -import { buildURL } from "../../navigation"; import { isAllowedResource } from "../../../common/rbac" +import { buildURL } from "../../../common/utils/buildUrl"; export const certificatesURL = buildURL("/certificates"); export const issuersURL = buildURL("/issuers"); diff --git a/src/renderer/components/+custom-resources/crd.route.ts b/src/renderer/components/+custom-resources/crd.route.ts index a169149eff..f9affeb903 100644 --- a/src/renderer/components/+custom-resources/crd.route.ts +++ b/src/renderer/components/+custom-resources/crd.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const crdRoute: RouteProps = { path: "/crd" diff --git a/src/renderer/components/+events/events.route.ts b/src/renderer/components/+events/events.route.ts index 862e54f731..b7d96824f6 100644 --- a/src/renderer/components/+events/events.route.ts +++ b/src/renderer/components/+events/events.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const eventRoute: RouteProps = { path: "/events" diff --git a/src/renderer/components/+landing-page/landing-page.route.ts b/src/renderer/components/+landing-page/landing-page.route.ts index 3b3e17a6c2..344cc48033 100644 --- a/src/renderer/components/+landing-page/landing-page.route.ts +++ b/src/renderer/components/+landing-page/landing-page.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const landingRoute: RouteProps = { path: "/landing" diff --git a/src/renderer/components/+namespaces/namespaces.route.ts b/src/renderer/components/+namespaces/namespaces.route.ts index 3573968101..9d901b6ada 100644 --- a/src/renderer/components/+namespaces/namespaces.route.ts +++ b/src/renderer/components/+namespaces/namespaces.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router" -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const namespacesRoute: RouteProps = { path: "/namespaces" diff --git a/src/renderer/components/+network-endpoints/endpoints.route.ts b/src/renderer/components/+network-endpoints/endpoints.route.ts index 932ff5eed5..98ecb67bdb 100644 --- a/src/renderer/components/+network-endpoints/endpoints.route.ts +++ b/src/renderer/components/+network-endpoints/endpoints.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router" -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const endpointRoute: RouteProps = { path: "/endpoints" diff --git a/src/renderer/components/+network-ingresses/ingresses.route.ts b/src/renderer/components/+network-ingresses/ingresses.route.ts index 9a21ad56c5..1c1f2941f4 100644 --- a/src/renderer/components/+network-ingresses/ingresses.route.ts +++ b/src/renderer/components/+network-ingresses/ingresses.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router" -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const ingressRoute: RouteProps = { path: "/ingresses" diff --git a/src/renderer/components/+network-policies/network-policies.route.ts b/src/renderer/components/+network-policies/network-policies.route.ts index 60203ed79c..ab609200ce 100644 --- a/src/renderer/components/+network-policies/network-policies.route.ts +++ b/src/renderer/components/+network-policies/network-policies.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router" -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const networkPoliciesRoute: RouteProps = { path: "/network-policies" diff --git a/src/renderer/components/+network-services/services.route.ts b/src/renderer/components/+network-services/services.route.ts index 8bc6adf3f5..8cc42090a7 100644 --- a/src/renderer/components/+network-services/services.route.ts +++ b/src/renderer/components/+network-services/services.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router" -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const servicesRoute: RouteProps = { path: "/services" diff --git a/src/renderer/components/+network/network.route.ts b/src/renderer/components/+network/network.route.ts index adbf909a27..3029b85fa2 100644 --- a/src/renderer/components/+network/network.route.ts +++ b/src/renderer/components/+network/network.route.ts @@ -1,7 +1,7 @@ import { RouteProps } from "react-router" import { Network } from "./network"; import { servicesURL } from "../+network-services"; -import { IURLParams } from "../../navigation"; +import { IURLParams } from "../../../common/utils/buildUrl"; export const networkRoute: RouteProps = { get path() { diff --git a/src/renderer/components/+nodes/nodes.route.ts b/src/renderer/components/+nodes/nodes.route.ts index 3faf749acd..cf03a8733d 100644 --- a/src/renderer/components/+nodes/nodes.route.ts +++ b/src/renderer/components/+nodes/nodes.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router" -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const nodesRoute: RouteProps = { path: "/nodes" diff --git a/src/renderer/components/+pod-security-policies/pod-security-policies.route.ts b/src/renderer/components/+pod-security-policies/pod-security-policies.route.ts index f1a82f4c10..e69f711bea 100644 --- a/src/renderer/components/+pod-security-policies/pod-security-policies.route.ts +++ b/src/renderer/components/+pod-security-policies/pod-security-policies.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router" -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const podSecurityPoliciesRoute: RouteProps = { path: "/pod-security-policies" diff --git a/src/renderer/components/+preferences/preferences.route.ts b/src/renderer/components/+preferences/preferences.route.ts index 6e71a88963..8fc7e70b0e 100644 --- a/src/renderer/components/+preferences/preferences.route.ts +++ b/src/renderer/components/+preferences/preferences.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const preferencesRoute: RouteProps = { path: "/preferences" diff --git a/src/renderer/components/+storage-classes/storage-classes.route.ts b/src/renderer/components/+storage-classes/storage-classes.route.ts index d47d8be7eb..2f809ef9f3 100644 --- a/src/renderer/components/+storage-classes/storage-classes.route.ts +++ b/src/renderer/components/+storage-classes/storage-classes.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router" -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const storageClassesRoute: RouteProps = { path: "/storage-classes" diff --git a/src/renderer/components/+storage-volume-claims/volume-claims.route.ts b/src/renderer/components/+storage-volume-claims/volume-claims.route.ts index 7b2496366e..b579623369 100644 --- a/src/renderer/components/+storage-volume-claims/volume-claims.route.ts +++ b/src/renderer/components/+storage-volume-claims/volume-claims.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router" -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const volumeClaimsRoute: RouteProps = { path: "/persistent-volume-claims" diff --git a/src/renderer/components/+storage-volumes/volumes.route.ts b/src/renderer/components/+storage-volumes/volumes.route.ts index 693c4e5ea3..42d4824c99 100644 --- a/src/renderer/components/+storage-volumes/volumes.route.ts +++ b/src/renderer/components/+storage-volumes/volumes.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router" -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const volumesRoute: RouteProps = { path: "/persistent-volumes" diff --git a/src/renderer/components/+storage/storage.route.ts b/src/renderer/components/+storage/storage.route.ts index c5cc36bb24..6a7ab065f9 100644 --- a/src/renderer/components/+storage/storage.route.ts +++ b/src/renderer/components/+storage/storage.route.ts @@ -1,7 +1,7 @@ import { RouteProps } from "react-router" import { volumeClaimsURL } from "../+storage-volume-claims"; import { Storage } from "./storage"; -import { IURLParams } from "../../navigation"; +import { IURLParams } from "../../../common/utils/buildUrl"; export const storageRoute: RouteProps = { get path() { diff --git a/src/renderer/components/+user-management/user-management.route.ts b/src/renderer/components/+user-management/user-management.route.ts index 77493e46d8..04de465e3f 100644 --- a/src/renderer/components/+user-management/user-management.route.ts +++ b/src/renderer/components/+user-management/user-management.route.ts @@ -1,6 +1,6 @@ -import { RouteProps } from "react-router"; +import type { RouteProps } from "react-router"; +import { buildURL, IURLParams } from "../../../common/utils/buildUrl"; import { UserManagement } from "./user-management" -import { buildURL, IURLParams } from "../../navigation"; export const usersManagementRoute: RouteProps = { get path() { @@ -30,9 +30,7 @@ export interface IRolesRouteParams { } // URL-builders +export const usersManagementURL = (params?: IURLParams) => serviceAccountsURL(params); export const serviceAccountsURL = buildURL(serviceAccountsRoute.path) export const roleBindingsURL = buildURL(roleBindingsRoute.path) export const rolesURL = buildURL(rolesRoute.path) -export const usersManagementURL = (params?: IURLParams) => { - return serviceAccountsURL(params); -}; diff --git a/src/renderer/components/+whats-new/whats-new.route.ts b/src/renderer/components/+whats-new/whats-new.route.ts index ee251ff81e..f989d676b7 100644 --- a/src/renderer/components/+whats-new/whats-new.route.ts +++ b/src/renderer/components/+whats-new/whats-new.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const whatsNewRoute: RouteProps = { path: "/what-s-new" diff --git a/src/renderer/components/+workloads/workloads.route.ts b/src/renderer/components/+workloads/workloads.route.ts index 5586102faf..47044b0d18 100644 --- a/src/renderer/components/+workloads/workloads.route.ts +++ b/src/renderer/components/+workloads/workloads.route.ts @@ -1,7 +1,7 @@ -import { RouteProps } from "react-router" -import { Workloads } from "./workloads"; -import { buildURL, IURLParams } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL, IURLParams } from "../../../common/utils/buildUrl"; import { KubeResource } from "../../../common/rbac"; +import { Workloads } from "./workloads"; export const workloadsRoute: RouteProps = { get path() { diff --git a/src/renderer/components/+workspaces/workspaces.route.ts b/src/renderer/components/+workspaces/workspaces.route.ts index bfdbe012a6..37c1239e6c 100644 --- a/src/renderer/components/+workspaces/workspaces.route.ts +++ b/src/renderer/components/+workspaces/workspaces.route.ts @@ -1,5 +1,5 @@ -import { RouteProps } from "react-router"; -import { buildURL } from "../../navigation"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export const workspacesRoute: RouteProps = { path: "/workspaces" diff --git a/src/renderer/components/cluster-manager/cluster-manager.tsx b/src/renderer/components/cluster-manager/cluster-manager.tsx index c658a31aa4..d1346ebc92 100644 --- a/src/renderer/components/cluster-manager/cluster-manager.tsx +++ b/src/renderer/components/cluster-manager/cluster-manager.tsx @@ -11,14 +11,16 @@ import { Workspaces, workspacesRoute } from "../+workspaces"; import { AddCluster, addClusterRoute } from "../+add-cluster"; import { ClusterView } from "./cluster-view"; import { ClusterSettings, clusterSettingsRoute } from "../+cluster-settings"; -import { clusterViewRoute, clusterViewURL, getMatchedCluster, getMatchedClusterId } from "./cluster-view.route"; +import { clusterViewRoute, clusterViewURL } from "./cluster-view.route"; import { clusterStore } from "../../../common/cluster-store"; import { hasLoadedView, initView, lensViews, refreshViews } from "./lens-views"; -import { isMac } from "../../../common/vars"; +import { getMatchedClusterId } from "../../navigation"; @observer export class ClusterManager extends React.Component { componentDidMount() { + const getMatchedCluster = () => clusterStore.getById(getMatchedClusterId()); + disposeOnUnmount(this, [ reaction(getMatchedClusterId, initView, { fireImmediately: true @@ -55,7 +57,7 @@ export class ClusterManager extends React.Component { return (

-
+
@@ -63,11 +65,11 @@ export class ClusterManager extends React.Component { - +
- - + +
) } diff --git a/src/renderer/components/cluster-manager/cluster-view.route.ts b/src/renderer/components/cluster-manager/cluster-view.route.ts index 82e99497d5..bb66f56005 100644 --- a/src/renderer/components/cluster-manager/cluster-view.route.ts +++ b/src/renderer/components/cluster-manager/cluster-view.route.ts @@ -1,8 +1,5 @@ -import { reaction } from "mobx"; -import { ipcRenderer } from "electron"; -import { matchPath, RouteProps } from "react-router"; -import { buildURL, navigation } from "../../navigation"; -import { clusterStore } from "../../../common/cluster-store"; +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; export interface IClusterViewRouteParams { clusterId: string; @@ -14,33 +11,3 @@ export const clusterViewRoute: RouteProps = { } export const clusterViewURL = buildURL(clusterViewRoute.path) - -export function getMatchedClusterId(): string { - const matched = matchPath(navigation.location.pathname, { - exact: true, - path: clusterViewRoute.path - }) - if (matched) { - return matched.params.clusterId; - } -} - -export function getMatchedCluster() { - return clusterStore.getById(getMatchedClusterId()) -} - -if (ipcRenderer) { - if (process.isMainFrame) { - // Keep track of active cluster-id for handling IPC/menus/etc. - reaction(() => getMatchedClusterId(), clusterId => { - ipcRenderer.send("cluster-view:current-id", clusterId); - }, { - fireImmediately: true - }) - } - - // Reload dashboard - ipcRenderer.on("menu:reload", () => { - location.reload(); - }); -} diff --git a/src/renderer/components/cluster-manager/lens-views.ts b/src/renderer/components/cluster-manager/lens-views.ts index d23bdd6072..48c3578a0e 100644 --- a/src/renderer/components/cluster-manager/lens-views.ts +++ b/src/renderer/components/cluster-manager/lens-views.ts @@ -1,6 +1,6 @@ import { observable, when } from "mobx"; import { ClusterId, clusterStore, getClusterFrameUrl } from "../../../common/cluster-store"; -import { getMatchedCluster } from "./cluster-view.route" +import { getMatchedClusterId } from "../../navigation"; import logger from "../../../main/logger"; export interface LensView { @@ -51,7 +51,7 @@ export async function autoCleanOnRemove(clusterId: ClusterId, iframe: HTMLIFrame } export function refreshViews() { - const cluster = getMatchedCluster(); + const cluster = clusterStore.getById(getMatchedClusterId()); lensViews.forEach(({ clusterId, view, isLoaded }) => { const isCurrent = clusterId === cluster?.id; const isReady = cluster?.available && cluster?.ready; diff --git a/src/renderer/navigation.ts b/src/renderer/navigation.ts index f7d5b6e435..b4e0f383b1 100644 --- a/src/renderer/navigation.ts +++ b/src/renderer/navigation.ts @@ -1,22 +1,16 @@ // Navigation helpers import { ipcRenderer } from "electron"; -import { compile } from "path-to-regexp" -import { createBrowserHistory, createMemoryHistory, LocationDescriptor } from "history"; +import { matchPath } from "react-router"; +import { reaction } from "mobx"; import { createObservableHistory } from "mobx-observable-history"; +import { createBrowserHistory, createMemoryHistory, LocationDescriptor } 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); -// handle navigation from other process (e.g. system menus in main, common->cluster view interactions) -if (ipcRenderer) { - ipcRenderer.on("menu:navigate", (event, location: LocationDescriptor) => { - logger.info(`[IPC]: ${event.type} ${JSON.stringify(location)}`, event); - navigate(location); - }) -} - export function navigate(location: LocationDescriptor) { const currentLocation = navigation.getPath(); navigation.push(location); @@ -25,20 +19,6 @@ export function navigate(location: LocationDescriptor) { } } -export interface IURLParams

{ - params?: P; - query?: IQueryParams & Q; -} - -// todo: extract building urls to commons (also used in menu.ts) -// fixme: missing types validation for params & query -export function buildURL

(path: string | string[]) { - const pathBuilder = compile(path.toString()); - return function ({ params, query }: IURLParams = {}) { - return pathBuilder(params) + (query ? getQueryString(query, false) : "") - } -} - // common params for all pages export interface IQueryParams { namespaces?: string[]; // selected context namespaces @@ -100,3 +80,33 @@ export function setSearch(text: string) { export function getSearch() { return navigation.searchParams.get("search") || ""; } + +export function getMatchedClusterId(): string { + const matched = matchPath(navigation.location.pathname, { + exact: true, + path: clusterViewRoute.path + }); + return matched?.params.clusterId; +} + +//-- EVENTS + +if (process.isMainFrame) { + // Keep track of active cluster-id for handling IPC/menus/etc. + reaction(() => getMatchedClusterId(), clusterId => { + ipcRenderer.send("cluster-view:current-id", clusterId); + }, { + fireImmediately: true + }) +} + +// 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(); +});