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();
+});