diff --git a/frontend/src/components/AdminPanel.tsx b/frontend/src/components/AdminPanel.tsx index 1a4ff24..10aecab 100644 --- a/frontend/src/components/AdminPanel.tsx +++ b/frontend/src/components/AdminPanel.tsx @@ -192,6 +192,7 @@ export function AdminPanel({ open, onClose, bare }: { open: boolean; onClose: () const [editTarget, setEditTarget] = useState(null); const [resetTarget, setResetTarget] = useState(null); const [resetSent, setResetSent] = useState<{ username: string; email: string } | null>(null); + const [regenTarget, setRegenTarget] = useState(null); // Listing: search + sort + filter + pagination (server-side). const [q, setQ] = useState(""); const [debouncedQ, setDebouncedQ] = useState(""); @@ -264,6 +265,7 @@ export function AdminPanel({ open, onClose, bare }: { open: boolean; onClose: () async function regenerate(u: User) { setError(""); + setFreshKey(null); try { const res = await api.adminRegenerate(u.id); setFreshKey({ username: u.username, key: res.key }); @@ -390,7 +392,7 @@ export function AdminPanel({ open, onClose, bare }: { open: boolean; onClose: () {!u.isAdmin && (
- +
@@ -443,6 +445,19 @@ export function AdminPanel({ open, onClose, bare }: { open: boolean; onClose: () }} /> + setRegenTarget(null)} + title={t("admin.regenTitle", { user: regenTarget?.username ?? "" })} + message={t("admin.regenMsg")} + confirmLabel={t("admin.regenConfirm")} + onConfirm={() => { + const u = regenTarget; + setRegenTarget(null); + if (u) void regenerate(u); + }} + /> + setEditTarget(null)} onSaved={refresh} /> ); diff --git a/frontend/src/lib/i18n.ts b/frontend/src/lib/i18n.ts index 2771f60..5488294 100644 --- a/frontend/src/lib/i18n.ts +++ b/frontend/src/lib/i18n.ts @@ -245,6 +245,9 @@ const en = { "admin.createFailed": "Create failed", "admin.regenFailed": "Regenerate failed", "admin.resetLink": "Email a password reset link", + "admin.regenTitle": "Regenerate the key for @{user}?", + "admin.regenMsg": "Their sessions will be revoked immediately and the new key is shown only once — make sure you can reach them.", + "admin.regenConfirm": "Regenerate", "admin.resetTitle": "Email a reset link to @{user}?", "admin.resetMsg": "A one-time key-recovery link will be sent to {email}.", "admin.resetConfirm": "Send link", @@ -964,6 +967,9 @@ const es: Dict = { "admin.createFailed": "No se pudo crear", "admin.regenFailed": "No se pudo regenerar", "admin.resetLink": "Email a password reset link", + "admin.regenTitle": "Regenerate the key for @{user}?", + "admin.regenMsg": "Their sessions will be revoked immediately and the new key is shown only once — make sure you can reach them.", + "admin.regenConfirm": "Regenerate", "admin.resetTitle": "Email a reset link to @{user}?", "admin.resetMsg": "A one-time key-recovery link will be sent to {email}.", "admin.resetConfirm": "Send link", @@ -1675,6 +1681,9 @@ const fr: Dict = { "admin.createFailed": "Création impossible", "admin.regenFailed": "Régénération impossible", "admin.resetLink": "Email a password reset link", + "admin.regenTitle": "Regenerate the key for @{user}?", + "admin.regenMsg": "Their sessions will be revoked immediately and the new key is shown only once — make sure you can reach them.", + "admin.regenConfirm": "Regenerate", "admin.resetTitle": "Email a reset link to @{user}?", "admin.resetMsg": "A one-time key-recovery link will be sent to {email}.", "admin.resetConfirm": "Send link", @@ -2380,6 +2389,9 @@ const ru: Dict = { "admin.createFailed": "Не создалось", "admin.regenFailed": "Не сменилось", "admin.resetLink": "Email a password reset link", + "admin.regenTitle": "Regenerate the key for @{user}?", + "admin.regenMsg": "Their sessions will be revoked immediately and the new key is shown only once — make sure you can reach them.", + "admin.regenConfirm": "Regenerate", "admin.resetTitle": "Email a reset link to @{user}?", "admin.resetMsg": "A one-time key-recovery link will be sent to {email}.", "admin.resetConfirm": "Send link", @@ -3080,6 +3092,9 @@ const it: Dict = { "admin.createFailed": "Creazione fallita", "admin.regenFailed": "Rigenerazione fallita", "admin.resetLink": "Email a password reset link", + "admin.regenTitle": "Regenerate the key for @{user}?", + "admin.regenMsg": "Their sessions will be revoked immediately and the new key is shown only once — make sure you can reach them.", + "admin.regenConfirm": "Regenerate", "admin.resetTitle": "Email a reset link to @{user}?", "admin.resetMsg": "A one-time key-recovery link will be sent to {email}.", "admin.resetConfirm": "Send link", @@ -3781,6 +3796,9 @@ const pt: Dict = { "admin.createFailed": "Falha ao criar", "admin.regenFailed": "Falha ao regenerar", "admin.resetLink": "Email a password reset link", + "admin.regenTitle": "Regenerate the key for @{user}?", + "admin.regenMsg": "Their sessions will be revoked immediately and the new key is shown only once — make sure you can reach them.", + "admin.regenConfirm": "Regenerate", "admin.resetTitle": "Email a reset link to @{user}?", "admin.resetMsg": "A one-time key-recovery link will be sent to {email}.", "admin.resetConfirm": "Send link",