import {Card, CardContent, CardDescription, CardHeader, CardTitle} from "@/components/ui/card.tsx"; import {Key} from "lucide-react"; import React, {useState} from "react"; import {completePasswordReset, initiatePasswordReset, verifyPasswordResetCode} from "@/ui/main-axios.ts"; import {Label} from "@/components/ui/label.tsx"; import {Input} from "@/components/ui/input.tsx"; import {Button} from "@/components/ui/button.tsx"; import {Alert, AlertDescription, AlertTitle} from "@/components/ui/alert.tsx"; import {toast} from "sonner"; import {useTranslation} from "react-i18next"; interface PasswordResetProps { userInfo: { username: string; is_admin: boolean; is_oidc: boolean; totp_enabled: boolean; } } export function PasswordReset({userInfo}: PasswordResetProps) { const {t} = useTranslation(); const [error, setError] = useState(null); const [resetStep, setResetStep] = useState<"initiate" | "verify" | "newPassword">("initiate"); const [resetCode, setResetCode] = useState(""); const [newPassword, setNewPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [tempToken, setTempToken] = useState(""); const [resetLoading, setResetLoading] = useState(false); async function handleInitiatePasswordReset() { setError(null); setResetLoading(true); try { const result = await initiatePasswordReset(userInfo.username); setResetStep("verify"); setError(null); } catch (err: any) { setError(err?.response?.data?.error || err?.message || t('common.failedToInitiatePasswordReset')); } finally { setResetLoading(false); } } function resetPasswordState() { setResetStep("initiate"); setResetCode(""); setNewPassword(""); setConfirmPassword(""); setTempToken(""); setError(null); } async function handleVerifyResetCode() { setError(null); setResetLoading(true); try { const response = await verifyPasswordResetCode(userInfo.username, resetCode); setTempToken(response.tempToken); setResetStep("newPassword"); setError(null); } catch (err: any) { setError(err?.response?.data?.error || t('common.failedToVerifyResetCode')); } finally { setResetLoading(false); } } async function handleCompletePasswordReset() { setError(null); setResetLoading(true); if (newPassword !== confirmPassword) { setError(t('common.passwordsDoNotMatch')); setResetLoading(false); return; } if (newPassword.length < 6) { setError(t('common.passwordMinLength')); setResetLoading(false); return; } try { await completePasswordReset(userInfo.username, tempToken, newPassword); toast.success(t('common.passwordResetSuccess')); resetPasswordState(); } catch (err: any) { setError(err?.response?.data?.error || t('common.failedToCompletePasswordReset')); } finally { setResetLoading(false); } } const Spinner = ( ); return ( {t('common.password')} {t('common.changeAccountPassword')} <> {resetStep === "initiate" && ( <>
)} {resetStep === "verify" && ( <>

{t('common.enterSixDigitCode')} {userInfo.username}

setResetCode(e.target.value.replace(/\D/g, ''))} disabled={resetLoading} placeholder={t('placeholders.enterCode')} />
)} {resetStep === "newPassword" && ( <>

{t('common.enterNewPassword')} {userInfo.username}

setNewPassword(e.target.value)} disabled={resetLoading} autoComplete="new-password" />
setConfirmPassword(e.target.value)} disabled={resetLoading} autoComplete="new-password" />
)} {error && ( {t('common.error')} {error} )}
) }