UNPKG

@code_district/doorman

Version:

Doorman: A comprehensive React package for seamless authentication and authorization management. Easily integrate secure user authentication and access control in your applications. Streamline user verification, role-based permissions, and secure data han

179 lines (169 loc) 4.48 kB
import React, { useState } from "react"; import { CognitoUser, AuthenticationDetails, CognitoUserPool, } from "amazon-cognito-identity-js"; import { Formik, Form, Field, ErrorMessage } from "formik"; import Singleton from "../../singleton/singleton"; export function DoormanVerifyEmail({ email, onVerifySuccess, onResendSuccess, onVerifyFail, onResendFail, }) { const initialValues = { verificationCode: "", }; const [errorMessage, setErrorMessage] = useState(""); const [loading, setLoading] = useState(false); const [resendLoading, setResendLoading] = useState(false); var instance = Singleton.getInstance(); const verifyCode = (val, { setErrors }) => { try { setLoading(true); setResendLoading(false); // if (!val.verificationCode) { // setErrors({ // verificationCode: "Enter your verification code", // }); // setLoading(false); // return; // } const userPool = new CognitoUserPool({ UserPoolId: instance?.configuration?.userPoolId, ClientId: instance?.configuration?.clientId, }); const cognitoUser = new CognitoUser({ Username: email, Pool: userPool, }); cognitoUser.confirmRegistration( val.verificationCode, true, function (err, result) { if (err) { onVerifyFail(err); setErrorMessage(`${err.message}`); setLoading(false); return; } onVerifySuccess({ message: "Email verified successfully!", result }); setErrorMessage(""); setLoading(false); } ); } catch (err) { console.error("err while code verifying", err); onVerifyFail(err); setLoading(false); } }; const resendCode = () => { try { setResendLoading(true); setLoading(false); const userPool = new CognitoUserPool({ UserPoolId: instance?.configuration?.userPoolId, ClientId: instance?.configuration?.clientId, }); const cognitoUser = new CognitoUser({ Username: email, Pool: userPool, }); cognitoUser.resendConfirmationCode(function (err, result) { if (err) { onResendFail(err); setErrorMessage(`${err.message}`); setResendLoading(false); return; } onResendSuccess({ message: "Code resent successfully!", result }); setErrorMessage(""); setResendLoading(false); }); } catch (err) { console.error("Err while code resend", err); onResendFail(err); setResendLoading(false); } }; const validateRequiredField = (value, fieldName) => { return !value ? `${fieldName} is required` : ""; }; return ( <div className="dm-auth-widget" style={instance?.configuration?.style?.boxStyle} > <h2 className="dm-widget-title">Email Verification</h2> <Formik initialValues={initialValues} onSubmit={verifyCode} validateOnBlur={true} validateOnChange={true} > {({ errors, touched, handleBlur }) => ( <Form className="dm-form"> {errorMessage ? ( <div className="dm-alert dm-alert-danger">{errorMessage}</div> ) : null} <div className={`dm-form-group ${ errors.verificationCode && touched.verificationCode ? "required" : "" }`} > <label className="dm-form-label">Verification Code: </label> <Field className="dm-form-input" type="text" name="verificationCode" placeholder="Enter Verification Code" onBlur={handleBlur} validate={(val) => validateRequiredField(val, "Verification Code") } style={instance?.configuration?.style?.inputStyle} /> {errors.verificationCode && touched.verificationCode ? ( <ErrorMessage name="verificationCode" component="div" className="dm-error-msg" /> ) : null} </div> <button className={`dm-btn spinner-wrap ${ errors.verificationCode ? "dm-btn-margin-top" : "" }`} type="submit" style={instance?.configuration?.style?.buttonStyle} disabled={loading} > {loading ? <span className="btn-loader"></span> : "Verify"} </button> </Form> )} </Formik> <div className="dm-resend"> {resendLoading ? ( <div className="spinner-wrap" style={{ border: 0 }}> <span className="loader"></span> </div> ) : ( <a className="spinner-wrap" onClick={resendCode} disabled={resendLoading} > Resend Code </a> )} </div> </div> ); }