From 1d2f0b789175c7365cd59af8ec2570b4bd31b218 Mon Sep 17 00:00:00 2001 From: Paul Payne Date: Tue, 14 Oct 2025 21:05:53 +0000 Subject: [PATCH] Instance-namespace various endpoints and services. --- src/components/Advanced.tsx | 4 +- .../operations/OperationProgress.tsx | 4 +- src/hooks/useOperations.ts | 16 +++---- src/router/pages/UtilitiesPage.tsx | 44 +++++++++++++----- src/services/api/hooks/useOperations.ts | 18 ++++---- src/services/api/hooks/useUtilities.ts | 45 +++++++++---------- src/services/api/operations.ts | 13 +++--- src/services/api/utilities.ts | 32 ++++++------- 8 files changed, 95 insertions(+), 81 deletions(-) diff --git a/src/components/Advanced.tsx b/src/components/Advanced.tsx index b1a876c..cb13cac 100644 --- a/src/components/Advanced.tsx +++ b/src/components/Advanced.tsx @@ -10,14 +10,14 @@ import { import { ConfigEditor } from "./ConfigEditor"; import { Button, Input, Label } from "./ui"; import { Check, Edit2, HelpCircle, X, ExternalLink, Copy } from "lucide-react"; -import { useInstanceDashboardToken } from "../services/api/hooks/useUtilities"; +import { useDashboardToken } from "../services/api/hooks/useUtilities"; import { useInstance } from "../services/api"; export function Advanced() { const { instanceId } = useParams<{ instanceId: string }>(); const [copied, setCopied] = useState(false); const { data: instance } = useInstance(instanceId || ''); - const { data: dashboardToken, isLoading: tokenLoading } = useInstanceDashboardToken(instanceId || ''); + const { data: dashboardToken, isLoading: tokenLoading } = useDashboardToken(instanceId || ''); const [upstreamValue, setUpstreamValue] = useState("https://mywildcloud.org"); const [editingUpstream, setEditingUpstream] = useState(false); diff --git a/src/components/operations/OperationProgress.tsx b/src/components/operations/OperationProgress.tsx index 13651d2..79e3346 100644 --- a/src/components/operations/OperationProgress.tsx +++ b/src/components/operations/OperationProgress.tsx @@ -5,6 +5,7 @@ import { Loader2, CheckCircle, AlertCircle, XCircle, Clock } from 'lucide-react' import { useOperation } from '../../hooks/useOperations'; interface OperationProgressProps { + instanceName: string; operationId: string; onComplete?: () => void; onError?: (error: string) => void; @@ -12,12 +13,13 @@ interface OperationProgressProps { } export function OperationProgress({ + instanceName, operationId, onComplete, onError, showDetails = true }: OperationProgressProps) { - const { operation, error, isLoading, cancel, isCancelling } = useOperation(operationId); + const { operation, error, isLoading, cancel, isCancelling } = useOperation(instanceName, operationId); // Handle operation completion if (operation?.status === 'completed' && onComplete) { diff --git a/src/hooks/useOperations.ts b/src/hooks/useOperations.ts index 33ff3d9..303c8dc 100644 --- a/src/hooks/useOperations.ts +++ b/src/hooks/useOperations.ts @@ -12,19 +12,19 @@ export function useOperations(instanceName: string | null | undefined) { }); } -export function useOperation(operationId: string | null | undefined) { +export function useOperation(instanceName: string | null | undefined, operationId: string | null | undefined) { const [operation, setOperation] = useState(null); const [error, setError] = useState(null); const queryClient = useQueryClient(); useEffect(() => { - if (!operationId) return; + if (!instanceName || !operationId) return; // Fetch initial state - operationsApi.get(operationId).then(setOperation).catch(setError); + operationsApi.get(instanceName, operationId).then(setOperation).catch(setError); // Set up SSE stream - const eventSource = operationsApi.createStream(operationId); + const eventSource = operationsApi.createStream(instanceName, operationId); eventSource.onmessage = (event) => { try { @@ -54,14 +54,14 @@ export function useOperation(operationId: string | null | undefined) { return () => { eventSource.close(); }; - }, [operationId, queryClient]); + }, [instanceName, operationId, queryClient]); const cancelMutation = useMutation({ mutationFn: () => { - if (!operation?.instance_name) { - throw new Error('Cannot cancel operation: instance name not available'); + if (!instanceName || !operationId) { + throw new Error('Cannot cancel operation: instance name or operation ID not available'); } - return operationsApi.cancel(operationId!, operation.instance_name); + return operationsApi.cancel(instanceName, operationId); }, onSuccess: () => { // Operation state will be updated via SSE diff --git a/src/router/pages/UtilitiesPage.tsx b/src/router/pages/UtilitiesPage.tsx index b890a5d..4b20aa3 100644 --- a/src/router/pages/UtilitiesPage.tsx +++ b/src/router/pages/UtilitiesPage.tsx @@ -1,4 +1,5 @@ import { useState } from 'react'; +import { useParams } from 'react-router'; import { UtilityCard, CopyableValue } from '../../components/UtilityCard'; import { Button } from '../../components/ui/button'; import { @@ -18,18 +19,25 @@ import { } from '../../services/api/hooks/useUtilities'; export function UtilitiesPage() { + const { instanceId } = useParams<{ instanceId: string }>(); const [secretToCopy, setSecretToCopy] = useState(''); - const [targetInstance, setTargetInstance] = useState(''); + const [sourceNamespace, setSourceNamespace] = useState(''); + const [destinationNamespace, setDestinationNamespace] = useState(''); - const dashboardToken = useDashboardToken(); - const versions = useClusterVersions(); - const nodeIPs = useNodeIPs(); - const controlPlaneIP = useControlPlaneIP(); + const dashboardToken = useDashboardToken(instanceId || ''); + const versions = useClusterVersions(instanceId || ''); + const nodeIPs = useNodeIPs(instanceId || ''); + const controlPlaneIP = useControlPlaneIP(instanceId || ''); const copySecret = useCopySecret(); const handleCopySecret = () => { - if (secretToCopy && targetInstance) { - copySecret.mutate({ secret: secretToCopy, targetInstance }); + if (secretToCopy && sourceNamespace && destinationNamespace && instanceId) { + copySecret.mutate({ + instanceName: instanceId, + secret: secretToCopy, + sourceNamespace, + destinationNamespace + }); } }; @@ -130,7 +138,7 @@ export function UtilitiesPage() { {/* Secret Copy Utility */} } >
@@ -146,19 +154,31 @@ export function UtilitiesPage() {
+ setSourceNamespace(e.target.value)} + className="w-full px-3 py-2 border rounded-lg bg-background" + /> +
+
+ setTargetInstance(e.target.value)} + value={destinationNamespace} + onChange={(e) => setDestinationNamespace(e.target.value)} className="w-full px-3 py-2 border rounded-lg bg-background" />