diff --git a/src/pages/Kubernetes/KubernetesPage.tsx b/src/pages/Kubernetes/KubernetesPage.tsx
index 7cfcac60..b3ddeef5 100644
--- a/src/pages/Kubernetes/KubernetesPage.tsx
+++ b/src/pages/Kubernetes/KubernetesPage.tsx
@@ -1,25 +1,24 @@
import React, { useState, useEffect } from "react";
import { useKubernetesStore } from "@/stores/kubernetesStore";
-import { ClusterList } from "@/components/Kubernetes/ClusterList";
+
import { PortForwardList } from "@/components/Kubernetes/PortForwardList";
-import { AddClusterModal } from "@/components/Kubernetes/AddClusterModal";
import { PortForwardForm } from "@/components/Kubernetes/PortForwardForm";
import { ResourceBrowser } from "@/components/Kubernetes/ResourceBrowser";
-import type { ClusterInfo, PortForwardResponse } from "@/lib/tauriCommands";
+import type { PortForwardResponse, KubeconfigInfo, PortForwardRequest } from "@/lib/tauriCommands";
import {
- listClustersCmd,
- removeClusterCmd,
listPortForwardsCmd,
stopPortForwardCmd,
deletePortForwardCmd,
+ listKubeconfigsCmd,
+ activateKubeconfigCmd,
+ startPortForwardCmd,
} from "@/lib/tauriCommands";
export function KubernetesPage() {
- const { clusters, addCluster, removeCluster, selectedClusterId } = useKubernetesStore();
+ const { selectedClusterId, setSelectedCluster } = useKubernetesStore();
+ const [kubeconfigs, setKubeconfigs] = useState([]);
const [portForwards, setPortForwards] = useState([]);
const [isLoading, setIsLoading] = useState(true);
- const [isAddClusterOpen, setIsAddClusterOpen] = useState(false);
- const [isStartPortForwardOpen, setIsStartPortForwardOpen] = useState(false);
useEffect(() => {
loadData();
@@ -28,12 +27,12 @@ export function KubernetesPage() {
const loadData = async () => {
setIsLoading(true);
try {
- const [clustersData, portForwardsData] = await Promise.all([
- listClustersCmd(),
+ const [kubeconfigsData, portForwardsData] = await Promise.all([
+ listKubeconfigsCmd(),
listPortForwardsCmd(),
]);
- clustersData.forEach(addCluster);
+ setKubeconfigs(kubeconfigsData);
setPortForwards(portForwardsData);
} catch (err) {
console.error("Failed to load data:", err);
@@ -42,13 +41,20 @@ export function KubernetesPage() {
}
};
- const handleRemoveCluster = async (clusterId: string) => {
+ const handleActivateKubeconfig = async (id: string) => {
try {
- await removeClusterCmd(clusterId);
- removeCluster(clusterId);
+ await activateKubeconfigCmd(id);
+ const [kubeconfigsData] = await Promise.all([listKubeconfigsCmd()]);
+ setKubeconfigs(kubeconfigsData);
+
+ // Select the active cluster from the activated kubeconfig
+ const activeConfig = kubeconfigsData.find((c) => c.is_active);
+ if (activeConfig) {
+ setSelectedCluster(activeConfig.id);
+ }
} catch (err) {
- console.error("Failed to remove cluster:", err);
- alert("Failed to remove cluster");
+ console.error("Failed to activate kubeconfig:", err);
+ alert("Failed to activate kubeconfig");
}
};
@@ -72,12 +78,14 @@ export function KubernetesPage() {
}
};
- const handleAddCluster = (cluster: ClusterInfo) => {
- addCluster(cluster);
- };
-
- const handleStartPortForward = (portForward: PortForwardResponse) => {
- setPortForwards((prev) => [...prev, portForward]);
+ const handleStartPortForward = async (portForward: PortForwardRequest) => {
+ try {
+ const result = await startPortForwardCmd(portForward);
+ setPortForwards((prev) => [...prev, result]);
+ } catch (err) {
+ console.error("Failed to start port forward:", err);
+ alert("Failed to start port forward");
+ }
};
if (isLoading) {
@@ -100,40 +108,94 @@ export function KubernetesPage() {
- {/* Cluster Management Section */}
+ {/* Cluster Management Section - Uses kubeconfig files from Settings */}
-
Clusters
-
+
Clusters (from kubeconfig files)
+
+
+
-
setIsAddClusterOpen(true)}
- onRemove={handleRemoveCluster}
- />
+ {kubeconfigs.length === 0 ? (
+
+
+
No kubeconfig files uploaded
+
+ Upload kubeconfig files in Settings → Kubeconfig to manage Kubernetes clusters
+
+
+
+ ) : (
+
+ {kubeconfigs.map((config) => (
+
+
+
+
+
{config.name}
+ {config.is_active && (
+
+ Active
+
+ )}
+
+
+
+ Context: {config.context}
+
+ {config.cluster_url && (
+
+ Cluster: {config.cluster_url}
+
+ )}
+
+
+
+ {!config.is_active && (
+
+ )}
+
+
+
+ ))}
+
+ )}
{/* Port Forwarding Section */}
Port Forwarding
-
setIsStartPortForwardOpen(true)}
+ onStart={() => {}}
onStop={handleStopPortForward}
onDelete={handleDeletePortForward}
/>
@@ -146,20 +208,8 @@ export function KubernetesPage() {
)}
-
- {/* Add Cluster Modal */}
- setIsAddClusterOpen(false)}
- onAdd={handleAddCluster}
- />
-
- {/* Port Forward Form */}
- setIsStartPortForwardOpen(false)}
- onStart={handleStartPortForward}
- />
);
}
+
+
diff --git a/src/stores/kubernetesStore.ts b/src/stores/kubernetesStore.ts
index 2cca272a..69551a92 100644
--- a/src/stores/kubernetesStore.ts
+++ b/src/stores/kubernetesStore.ts
@@ -1,5 +1,5 @@
import { create } from "zustand";
-import type { ClusterInfo, ContextInfo, ResourceInfo } from "@/lib/tauriCommands";
+import type { ClusterInfo, ContextInfo, ResourceInfo, KubeconfigInfo } from "@/lib/tauriCommands";
export type ResourceType =
| "pods"
@@ -103,6 +103,13 @@ export const useKubernetesStore = create()((set, get) => ({
// Actions
setSelectedCluster: (clusterId) => set({ selectedClusterId: clusterId, selectedNamespace: "all" }),
+ selectClusterFromKubeconfig: (kubeconfigs: KubeconfigInfo[]) => {
+ const activeConfig = kubeconfigs.find((c) => c.is_active);
+ if (activeConfig) {
+ set({ selectedClusterId: activeConfig.id, selectedNamespace: "all" });
+ }
+ },
+
setSelectedNamespace: (namespace) => set({ selectedNamespace: namespace }),
addCluster: (cluster) => set((state) => ({