import React, { useState, useMemo } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from "@/components/ui"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui"; import { Button } from "@/components/ui"; import { Eye, EyeOff, Copy, Check } from "lucide-react"; import * as yaml from "js-yaml"; interface SecretDataModalProps { open: boolean; onOpenChange: (open: boolean) => void; secretName: string; secretYaml: string; } interface SecretData { [key: string]: string; } export function SecretDataModal({ open, onOpenChange, secretName, secretYaml }: SecretDataModalProps) { const [revealedKeys, setRevealedKeys] = useState>(new Set()); const [copiedKey, setCopiedKey] = useState(null); const secretData = useMemo(() => { try { const parsed = yaml.load(secretYaml) as { data?: SecretData }; return parsed.data ?? {}; } catch (err) { console.error("Failed to parse secret YAML:", err); return {}; } }, [secretYaml]); const decodedData = useMemo(() => { const decoded: Record = {}; Object.entries(secretData).forEach(([key, value]) => { try { // Decode base64 using native atob decoded[key] = atob(value); } catch (err) { decoded[key] = `[Failed to decode: ${err instanceof Error ? err.message : String(err)}]`; } }); return decoded; }, [secretData]); const toggleReveal = (key: string) => { setRevealedKeys((prev) => { const next = new Set(prev); if (next.has(key)) { next.delete(key); } else { next.add(key); } return next; }); }; const copyToClipboard = async (key: string, value: string) => { try { await navigator.clipboard.writeText(value); setCopiedKey(key); setTimeout(() => setCopiedKey(null), 2000); } catch (err) { console.error("Failed to copy to clipboard:", err); } }; const dataKeys = Object.keys(secretData); return ( Secret Data: {secretName} Decoded secret data. Click the eye icon to reveal values. {dataKeys.length === 0 ? (

No data keys in this secret.

) : (
Key Value Actions {dataKeys.map((key) => { const isRevealed = revealedKeys.has(key); const value = decodedData[key] ?? ""; const isCopied = copiedKey === key; return ( {key} {isRevealed ? value : "••••••••"}
); })}
)}
); }