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

227 lines (214 loc) 6.33 kB
import React, { useState } from "react"; import { CognitoUserPool } from "amazon-cognito-identity-js"; import { Formik, Form, Field, ErrorMessage } from "formik"; import Singleton from "../../singleton/singleton"; import { Icon } from "react-icons-kit"; import { eyeOff } from "react-icons-kit/feather/eyeOff"; import { eye } from "react-icons-kit/feather/eye"; export function DoormanChangePassword({ onSuccess, onFail }) { const [errorMessage, setErrorMessage] = useState(""); const [showPassword, setShowPassword] = useState(false); const [showConfirmPass, setShowConfirmPass] = useState(false); const [showNewPass, setShowNewPass] = useState(false); const [loading, setLoading] = useState(false); const toggleEyeIcon = (eyeParameters) => { eyeParameters((prevState) => !prevState); }; const initialValues = { oldPassword: "", newPassword: "", confirmPassword: "", }; var instance = Singleton.getInstance(); const handleSubmit = (values, { setErrors }) => { try { setLoading(true); const { oldPassword, newPassword, confirmPassword } = values; const errors = {}; if (newPassword !== confirmPassword) { setErrorMessage("Passwords do not match"); setLoading(false); return; } if (Object.keys(errors).length > 0) { setErrors(errors); setLoading(false); return; } const userPool = new CognitoUserPool({ UserPoolId: instance?.configuration?.userPoolId, ClientId: instance?.configuration?.clientId, }); const cognitoUser = userPool.getCurrentUser(); cognitoUser.getSession(function (err, session) { if (err) { setErrorMessage(`${err.message}`); return; } cognitoUser.changePassword( oldPassword, newPassword, function (err, result) { if (err) { onFail(err); setErrorMessage(`${err.message}`); setLoading(false); return; } onSuccess({ message: "Password changed successfully!", result }); setErrorMessage(""); setLoading(false); } ); }); } catch (err) { console.error("errr while changing password", err); onFail(err); setLoading(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">Change Password</h2> <Formik initialValues={initialValues} onSubmit={handleSubmit} validateOnBlur={true} validateOnChange={true} > {({ errors, touched, handleBlur }) => ( <Form className="dm-form"> {errorMessage ? ( <div className="dm-alert dm-alert-danger">{errorMessage}</div> ) : ( "" )} <div className={`dm-form-group ${ errors.oldPassword && touched.oldPassword ? "required" : "" }`} > <label className="dm-form-label" htmlFor="password"> Old Password:{" "} </label> <Field className="dm-form-input" type={showPassword ? "text" : "password"} name="oldPassword" placeholder="Enter your old password" onBlur={handleBlur} validate={(val) => validateRequiredField(val, "Old Password")} style={instance?.configuration?.style?.inputStyle} /> <Icon icon={showPassword ? eye : eyeOff} size={12} onClick={() => toggleEyeIcon(setShowPassword)} className="eye-icon" /> {errors.oldPassword && touched.oldPassword ? ( <ErrorMessage name="oldPassword" component="div" className="dm-error-msg" /> ) : null} </div> <div className={`dm-form-group ${ errors.newPassword && touched.newPassword ? "required" : "" }`} > <label className="dm-form-label" htmlFor="password"> New Password:{" "} </label> <Field className="dm-form-input" type={showNewPass ? "text" : "password"} name="newPassword" placeholder="Enter your new password" onBlur={handleBlur} validate={(val) => validateRequiredField(val, "New Password")} style={instance?.configuration?.style?.inputStyle} /> <Icon icon={showNewPass ? eye : eyeOff} size={12} onClick={() => toggleEyeIcon(setShowNewPass)} className="eye-icon" /> {errors.newPassword && touched.newPassword ? ( <ErrorMessage name="newPassword" component="div" className="dm-error-msg" /> ) : null} </div> <div className={`dm-form-group ${ errors.confirmPassword && touched.confirmPassword ? "required" : "" }`} > <label className="dm-form-label" htmlFor="password"> Confirm New Password:{" "} </label> <Field className="dm-form-input" type={showConfirmPass ? "text" : "password"} name="confirmPassword" placeholder="Enter Confirm password" onBlur={handleBlur} validate={(val) => validateRequiredField(val, "Confirm Password") } style={instance?.configuration?.style?.inputStyle} /> <Icon icon={showConfirmPass ? eye : eyeOff} size={12} onClick={() => toggleEyeIcon(setShowConfirmPass)} className="eye-icon" /> {errors.confirmPassword && touched.confirmPassword ? ( <ErrorMessage name="confirmPassword" component="div" className="dm-error-msg" /> ) : null} </div> <button className={`dm-btn spinner-wrap ${ errors.oldPassword || errors.newPassword || errors.confirmPassword ? "dm-btn-margin-top" : "" }`} type="submit" style={instance?.configuration?.style?.buttonStyle} disabled={loading} > {loading ? ( <span className="btn-loader"></span> ) : ( " Change Password" )} </button> </Form> )} </Formik> </div> </> ); }