import { useState } from "react" import { Link } from "react-router-dom" import { ExternalLink, Plus, Trash2 } from "lucide-react" import { cn } from "@/lib/utils" import { useSecrets } from "@/services/api/hooks" interface SecretsEditorProps { /** Env var → secret name it references: { ENV_VAR_NAME: "SECRET_NAME" }. * This edits the *wiring* only — a deployment stores `${secret:NAME}`, never the * value. Values live in the backend and are managed on the Secrets page. */ secrets: Record onSecretsChange: (secrets: Record) => void } export function SecretsEditor({ secrets, onSecretsChange }: SecretsEditorProps) { const { data: names } = useSecrets() const known = new Set(names ?? []) const [adding, setAdding] = useState(false) const [newEnv, setNewEnv] = useState("") const [newSecret, setNewSecret] = useState("") const setRef = (envKey: string, secretName: string) => onSecretsChange({ ...secrets, [envKey]: secretName }) const removeRef = (envKey: string) => { const next = { ...secrets } delete next[envKey] onSecretsChange(next) } const add = () => { if (!newEnv.trim() || !newSecret.trim()) return onSecretsChange({ ...secrets, [newEnv.trim()]: newSecret.trim() }) setNewEnv("") setNewSecret("") setAdding(false) } const anyUnset = Object.values(secrets).some((n) => !known.has(n)) return (
{Object.entries(secrets).map(([envKey, secretName]) => { const isSet = known.has(secretName) return (
{envKey} setRef(envKey, e.target.value)} list="all-secret-names" placeholder="SECRET_NAME" className="flex-1 min-w-0 rounded border border-[var(--border)] bg-black/30 px-2 py-1 text-xs font-mono focus:border-[var(--primary)] focus:outline-none" /> {isSet ? "set" : "unset"}
) })} {(names ?? []).map((n) => ( {adding ? (
setNewEnv(e.target.value)} className="w-28 rounded border border-[var(--border)] bg-black/30 px-2 py-1 text-xs font-mono focus:border-[var(--primary)] focus:outline-none" /> setNewSecret(e.target.value)} onKeyDown={(e) => e.key === "Enter" && add()} className="flex-1 min-w-0 rounded border border-[var(--border)] bg-black/30 px-2 py-1 text-xs font-mono focus:border-[var(--primary)] focus:outline-none" />
) : ( )} {anyUnset && (

Unset refs won't resolve — set their value on the{" "} Secrets {" "} page.

)}
) }