"use client"; import { useEffect, useRef, useState } from "react"; import { Check, Eye, EyeOff, Loader2, Save } from "lucide-react"; import { useSetSystemSecret } from "@/hooks/use-auth"; import type { SystemSecretStatus } from "@/lib/types"; /** One server-wide secret's admin-editable row - label, masked textbox with * a hide/unhide toggle, and a blue Update button, using the same * crossfade-icon transition language as UserApiKeyRow. Unlike that * component, this is one shared value for the whole app (Turnstile site * key/secret today), not scoped to the calling user. */ export function SystemSecretRow({ secret }: { secret: SystemSecretStatus }) { const [value, setValue] = useState(secret.value ?? ""); const [revealed, setRevealed] = useState(false); const [justSaved, setJustSaved] = useState(false); const savedTimeout = useRef | null>(null); const setSecret = useSetSystemSecret(); useEffect( () => () => { if (savedTimeout.current) clearTimeout(savedTimeout.current); }, [], ); const dirty = value !== (secret.value ?? ""); const handleUpdate = () => { setSecret.mutate( { key: secret.key, payload: { value } }, { onSuccess: (updated) => { setValue(updated.value ?? ""); setJustSaved(true); if (savedTimeout.current) clearTimeout(savedTimeout.current); savedTimeout.current = setTimeout(() => setJustSaved(false), 1800); }, }, ); }; return (
setValue(e.target.value)} placeholder={secret.configured ? undefined : "Not set"} className="focus-ring block w-full rounded-md border border-slate-300 px-3 py-2 font-mono text-sm text-slate-900 shadow-sm transition-colors duration-150 placeholder:font-sans placeholder:text-slate-400" />
{setSecret.isError && (

Couldn't save that key. Try again.

)}
); }