import { useState } from "react"; import { errorMessage } from "../api/client.js"; import { useOwners, useUpsertSecret } from "../api/hooks.js"; /** * Add / replace an encrypted secret. * Reusable: mount when open; parent supplies mode + initial fields. * * @param {"add" | "replace"} mode * @param {{ owner: string, name?: string }} initial * @param {() => void} onClose * @param {(saved: unknown) => void} [onSaved] * @param {boolean} [lockOwner] */ export function SecretEditorModal({ mode, initial, onClose, onSaved, lockOwner = false, }) { const { data: owners = [] } = useOwners(); const upsert = useUpsertSecret(); const [form, setForm] = useState(() => ({ owner: initial.owner || owners[0] || "default", name: initial.name || "", value: "", })); function onSubmit(e) { e.preventDefault(); upsert.mutate( { owner: form.owner, name: form.name, value: form.value }, { onSuccess: (data) => { onSaved?.(data?.secret ?? data); onClose(); }, }, ); } const title = mode === "add" ? "New secret" : `Replace ${form.owner}/${form.name}`; return (

{title}

{mode === "add" ? ( <> ) : null}

Values are encrypted at rest and never shown again after save. Values shorter than 8 characters are not redacted from logs.

{upsert.isError ? (

{errorMessage(upsert.error)}

) : null}
); }