From bcb232301a3173d6be4fa63796a257cbaabb2e79 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sun, 12 Nov 2023 04:08:59 -0500 Subject: [PATCH] form validation --- .../PasswordResetVerificationPage.tsx | 143 ++++++++++++++++-- 1 file changed, 131 insertions(+), 12 deletions(-) diff --git a/packages/fakeyou.com/src/v2/view/pages/password_reset/PasswordResetVerificationPage.tsx b/packages/fakeyou.com/src/v2/view/pages/password_reset/PasswordResetVerificationPage.tsx index 12a7b756f2..df5cbe22ec 100644 --- a/packages/fakeyou.com/src/v2/view/pages/password_reset/PasswordResetVerificationPage.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/password_reset/PasswordResetVerificationPage.tsx @@ -15,44 +15,141 @@ interface Props { function PasswordResetVerificationPage(props: Props) { let history = useHistory(); - const [isLoading, setIsLoading] = useState(false); + + usePrefixedDocumentTitle("Password Reset Verification"); + + const [resetToken, setResetToken] = useState(getCodeFromUrl() || ""); + const [resetTokenLooksValid, setResetTokenLooksValid] = useState(!!!getResetCodeErrors(getCodeFromUrl())); + const [resetTokenInvalidReason, setResetTokenInvalidReason] = useState(getResetCodeErrors(getCodeFromUrl())); + + const [newPassword, setNewPassword] = useState(""); + const [newPasswordIsValid, setNewPasswordIsValid] = useState(false); + const [newPasswordInvalidReason, setNewPasswordInvalidReason] = useState("new password is too short"); + + const [newPasswordConfirmation, setNewPasswordConfirmation] = useState(""); + const [newPasswordConfirmationIsValid, setNewPasswordConfirmationIsValid] = useState(false); + const [newPasswordConfirmationInvalidReason, setNewPasswordConfirmationInvalidReason] = useState("new password is too short"); if (props.sessionWrapper.isLoggedIn()) { history.push("/"); } - usePrefixedDocumentTitle("Code Verification"); + const handleChangeResetToken = (ev: React.FormEvent) => { + const token = (ev.target as HTMLInputElement).value; + const errors = getResetCodeErrors(token); + setResetToken(token); + setResetTokenLooksValid(!!!errors); + setResetTokenInvalidReason(errors); + } + + const handleChangePassword = (ev: React.FormEvent) => { + const value = (ev.target as HTMLInputElement).value; + + let isValid = true; + let invalidReason = undefined; + + if (value.length < 5) { + isValid = false; + invalidReason = "new password is too short"; + } + + setNewPassword(value); + setNewPasswordIsValid(isValid); + setNewPasswordInvalidReason(invalidReason) + + if (value !== newPasswordConfirmation) { + setNewPasswordConfirmationIsValid(false); + setNewPasswordConfirmationInvalidReason("new password does not match") + } else if (newPasswordConfirmation.length > 4) { + setNewPasswordConfirmationIsValid(true); + setNewPasswordConfirmationInvalidReason(undefined) + } + } + + const handleChangePasswordConfirmation = (ev: React.FormEvent) => { + const value = (ev.target as HTMLInputElement).value; + + let isValid = true; + let invalidReason = undefined; + + if (value !== newPassword) { + isValid = false; + invalidReason = "new password does not match"; + } + else if (value.length < 5) { + isValid = false; + invalidReason = "new password is too short"; + } + + setNewPasswordConfirmation(value); + setNewPasswordConfirmationIsValid(isValid); + setNewPasswordConfirmationInvalidReason(invalidReason) + } + const handleVerifyCode = async () => { - // Simulate a delay using a timer (dummy timer) - setIsLoading(true); - - setTimeout(() => { - setIsLoading(false); - }, 2000); }; + const canSubmit = resetTokenLooksValid && newPasswordIsValid && newPasswordConfirmationIsValid; + + let resetTokenHelpClasses = resetTokenLooksValid ? "" : "form-control is-danger"; + let newPasswordHelpClasses = newPasswordIsValid ? "" : "form-control is-danger"; + let newPasswordConfirmationHelpClasses = newPasswordConfirmationIsValid ? "" : "form-control is-danger"; + return (
+ +

+ {resetTokenInvalidReason} +

+ + + +

+ {newPasswordInvalidReason} +

+ + + +

+ {newPasswordConfirmationInvalidReason} +

+
@@ -61,4 +158,26 @@ function PasswordResetVerificationPage(props: Props) { ); } +function getCodeFromUrl() : string | null { + const urlParams = new URLSearchParams(window.location.search); + return urlParams.get('token'); +} + +function checkResetCodeLooksValid(code: string | null) : boolean { + if (!code) { + return false; + } + return code.length > 10; +} + +function getResetCodeErrors(code: string | null) : string | undefined { + if (!code) { + return "no code set"; + } + if (code.length < 10) { + return "code is too short"; + }; +} + + export { PasswordResetVerificationPage };