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 { PasswordInput } from "@/components/ui/password-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 [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); const { t } = useTranslation(); 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 && ( Error {error} )}
); }