import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import { Lock, ShieldCheck } from "lucide-react"; import { api } from "../lib/api"; import * as e2ee from "../lib/e2ee"; // Secure-messaging key gate: first-run setup (choose a passphrase) or unlock on this device. // Self-contained — on success it updates the shared e2ee unlock state, so any observing view // (the Messages page, a dock window) swaps out of the gate automatically. export default function KeyGate({ meId, compact = false }: { meId: number; compact?: boolean }) { const { t } = useTranslation(); const qc = useQueryClient(); const keyQ = useQuery({ queryKey: ["message-key"], queryFn: api.messageMyKey, staleTime: 60_000 }); const configured = keyQ.data?.configured ?? false; const [pass, setPass] = useState(""); const [confirm, setConfirm] = useState(""); const [err, setErr] = useState(null); const [busy, setBusy] = useState(false); async function submit() { setErr(null); if (pass.length < 6) return setErr(t("messages.passTooShort")); if (!configured && pass !== confirm) return setErr(t("messages.passMismatch")); setBusy(true); try { if (configured) { await e2ee.unlock(meId, pass, keyQ.data!); } else { const payload = await e2ee.setup(meId, pass); await api.setupMessageKey(payload); } qc.invalidateQueries({ queryKey: ["message-key"] }); } catch { setErr(configured ? t("messages.wrongPass") : t("messages.setupFailed")); } finally { setBusy(false); } } if (keyQ.isLoading) return
{t("common.loading")}
; return (
{configured ? t("messages.unlockTitle") : t("messages.setupTitle")}
{!compact &&

{configured ? t("messages.unlockBody") : t("messages.setupBody")}

} setPass(e.target.value)} onKeyDown={(e) => e.key === "Enter" && configured && submit()} placeholder={t("messages.passphrase")} className="w-full bg-card border border-border rounded-xl px-3 py-2 text-sm outline-none focus:border-accent" /> {!configured && ( setConfirm(e.target.value)} placeholder={t("messages.passphraseConfirm")} className="w-full bg-card border border-border rounded-xl px-3 py-2 text-sm outline-none focus:border-accent" /> )} {err &&
{err}
} {!configured && !compact &&

{t("messages.setupWarn")}

}
); }