From a66b2fd73d360d56bea235e381ca1a142f8acdf4 Mon Sep 17 00:00:00 2001 From: Dakshesh Jain <65905942+dakshesh14@users.noreply.github.com> Date: Fri, 17 Feb 2023 16:58:00 +0530 Subject: [PATCH] feat: resend login magic code (#291) * feat: resend login code on signing page after 30 seconds * feat: handling error on code send * refractor: isResendDisabled varible for resend button * dev: timer count-down hook * refractor: using new timer hook in sign in page --- .../components/account/email-code-form.tsx | 67 ++++++++++++++++--- apps/app/hooks/use-timer.tsx | 19 ++++++ 2 files changed, 76 insertions(+), 10 deletions(-) create mode 100644 apps/app/hooks/use-timer.tsx diff --git a/apps/app/components/account/email-code-form.tsx b/apps/app/components/account/email-code-form.tsx index 003d515f4..fbf907b7b 100644 --- a/apps/app/components/account/email-code-form.tsx +++ b/apps/app/components/account/email-code-form.tsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; // ui import { CheckCircleIcon } from "@heroicons/react/20/solid"; @@ -6,6 +6,7 @@ import { Button, Input } from "components/ui"; // services import authenticationService from "services/authentication.service"; import useToast from "hooks/use-toast"; +import useTimer from "hooks/use-timer"; // icons // types @@ -17,12 +18,19 @@ type EmailCodeFormValues = { export const EmailCodeForm = ({ onSuccess }: any) => { const [codeSent, setCodeSent] = useState(false); + const [codeResent, setCodeResent] = useState(false); + const [isCodeResending, setIsCodeResending] = useState(false); + const [errorResendingCode, setErrorResendingCode] = useState(false); + const { setToastAlert } = useToast(); + const { timer: resendCodeTimer, setTimer: setResendCodeTimer } = useTimer(); + const { register, handleSubmit, setError, setValue, + getValues, formState: { errors, isSubmitting, isValid, isDirty }, } = useForm({ defaultValues: { @@ -34,7 +42,11 @@ export const EmailCodeForm = ({ onSuccess }: any) => { reValidateMode: "onChange", }); + const isResendDisabled = + resendCodeTimer > 0 || isCodeResending || isSubmitting || errorResendingCode; + const onSubmit = async ({ email }: EmailCodeFormValues) => { + setErrorResendingCode(false); await authenticationService .emailCode({ email }) .then((res) => { @@ -42,7 +54,12 @@ export const EmailCodeForm = ({ onSuccess }: any) => { setCodeSent(true); }) .catch((err) => { - console.log(err); + setErrorResendingCode(true); + setToastAlert({ + title: "Oops!", + type: "error", + message: err?.error, + }); }); }; @@ -66,10 +83,16 @@ export const EmailCodeForm = ({ onSuccess }: any) => { }); }; + const emailOld = getValues("email"); + + useEffect(() => { + setErrorResendingCode(false); + }, [emailOld]); + return ( <>
- {codeSent && ( + {(codeSent || codeResent) && (
@@ -77,7 +100,9 @@ export const EmailCodeForm = ({ onSuccess }: any) => {

- Please check your mail for code. + {codeResent + ? "Please check your mail for new code." + : "Please check your mail for code."}

@@ -114,15 +139,33 @@ export const EmailCodeForm = ({ onSuccess }: any) => { error={errors.token} placeholder="Enter code" /> - {/* */} + {resendCodeTimer > 0 ? ( +

+ Didn{"'"}t receive code? Get new code in {resendCodeTimer} seconds. +

+ ) : isCodeResending ? ( + "Sending code..." + ) : errorResendingCode ? ( + "Please try again later" + ) : ( + "Resend code" + )} +
)}
@@ -139,7 +182,11 @@ export const EmailCodeForm = ({ onSuccess }: any) => {