import React, { useState, useEffect } from "react"; import { checkActionCode, confirmPasswordReset, getAuth, sendPasswordResetEmail, } from "firebase/auth"; import Button from "../../pageElements/Button"; import { useSearchParams } from "react-router-dom"; const PasswordResetPage = () => { const auth = getAuth(); const [isBusy, setIsBusy] = useState(false); const [isCodeValid, setIsCodeValid] = useState(null); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [done, setDone] = useState(false); const [notice, setNotice] = useState(""); const [searchParams] = useSearchParams(); const mode = searchParams.get("mode"); const oobCode = searchParams.get("oobCode"); useEffect(() => { async function handleCheckCode() { if (!oobCode) { setIsCodeValid(false); return; } try { await checkActionCode(auth, oobCode); setIsCodeValid(true); } catch (error) { setIsCodeValid(false); } } handleCheckCode(); }, [auth, oobCode]); const handleResetPassword = async (e) => { e.preventDefault(); if (isBusy) { return; } setIsBusy(true); setNotice(""); try { await sendPasswordResetEmail(auth, email); setDone(true); } catch (error) { if (error.code === "auth/invalid-email") { setNotice("Invalid email."); } else { setNotice(`Error occured (${error.code}).`); } } finally { setIsBusy(false); } }; const handleConfirmPasswordReset = async (e) => { e.preventDefault(); if (isBusy) { return; } if (password !== confirmPassword) { setNotice("Passwords do not match"); return; } setIsBusy(true); try { await confirmPasswordReset(auth, oobCode, password); setDone(true); } catch (error) { if (error.code === "auth/weak-password") { setNotice("Weak password."); } else { setNotice(`Error occured (${error.code}).`); } } finally { setIsBusy(false); } }; const resetMode = mode === "resetPassword" ? "resetPassword" : "enterEmail"; return (
{resetMode === "enterEmail" ? ( <>

Enter Account Email

{!done ? (
setEmail(e.target.value)} disabled={isBusy} >
{"" !== notice && (
{notice}
)}
) : null} {done && (

A password reset link was sent.

)} ) : null} {resetMode === "resetPassword" ? ( <>

Enter New Password

{!done && isCodeValid !== null && isCodeValid ? (
setPassword(e.target.value)} disabled={isBusy} >
setConfirmPassword(e.target.value)} disabled={isBusy} >
{"" !== notice && (
{notice}
)}
) : null} {!done && isCodeValid !== null && !isCodeValid && (

Bad or already used password reset code.

)} {done && (

Password changed.

)} ) : null}
); }; export default PasswordResetPage;