checks for valid email pattern before signing up an account
This commit is contained in:
@@ -38,8 +38,8 @@ export default function LoginLayout({ slogan, children }) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex-1 flex justify-center items-center px-10 py-1">
|
<div className="flex-1 flex justify-center items-center px-10 py-1">
|
||||||
<p className="text-black text-[15px] px-2 font-medium flex items-center">
|
<p className="text-black text-[15px] px-2 font-medium flex items-center gap-1">
|
||||||
<span className="text-3xl mt-2 mr-1">©</span> 2023 - {" "}
|
<span className="">© {new Date().getFullYear()} -</span>
|
||||||
<Link to="/" className="text-[#009ef7] ml-1">
|
<Link to="/" className="text-[#009ef7] ml-1">
|
||||||
WrenchBoard
|
WrenchBoard
|
||||||
</Link>{" "}
|
</Link>{" "}
|
||||||
|
|||||||
@@ -210,8 +210,8 @@ export default function Login() {
|
|||||||
<div className="ml-7 flex justify-start items-center gap-3">
|
<div className="ml-7 flex justify-start items-center gap-3">
|
||||||
<button
|
<button
|
||||||
name="full"
|
name="full"
|
||||||
className={`login-type-btn px-4 py-1 rounded-t-2xl transition duration-200 ${
|
className={`login-type-btn px-4 py-1 rounded-t-2xl ${
|
||||||
loginType=='full' ? "bg-white text-[#000] border-t-[2px]" : "bg-[#4687ba] text-white"
|
loginType=='full' ? "bg-white text-[#000] border-t-[2px]" : "bg-[#4687ba] border-[2px] border-[#4687ba] text-white"
|
||||||
}`}
|
}`}
|
||||||
onClick={handleLoginType}
|
onClick={handleLoginType}
|
||||||
>
|
>
|
||||||
@@ -219,8 +219,8 @@ export default function Login() {
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
name="family"
|
name="family"
|
||||||
className={`login-type-btn px-4 py-1 rounded-t-2xl transition duration-200 ${
|
className={`login-type-btn px-4 py-1 rounded-t-2xl ${
|
||||||
loginType=='family' ? "bg-white text-[#000] border-t-[2px]" : "bg-[#4687ba] text-white"
|
loginType=='family' ? "bg-white text-[#000] border-t-[2px]" : "bg-[#4687ba] border-[2px] border-[#4687ba] text-white"
|
||||||
}`}
|
}`}
|
||||||
onClick={handleLoginType}
|
onClick={handleLoginType}
|
||||||
>
|
>
|
||||||
@@ -234,7 +234,7 @@ export default function Login() {
|
|||||||
{
|
{
|
||||||
loginType == 'full' ? (
|
loginType == 'full' ? (
|
||||||
//user login component
|
//user login component
|
||||||
<div className="p-2 input-area login-area border-2 rounded-2xl">
|
<div className="p-2 input-area login-area border-2 border-[#4687ba] rounded-2xl">
|
||||||
<div className="input-item mb-5">
|
<div className="input-item mb-5">
|
||||||
<InputCom
|
<InputCom
|
||||||
labelClass="tracking-wider"
|
labelClass="tracking-wider"
|
||||||
@@ -322,7 +322,7 @@ export default function Login() {
|
|||||||
) : (
|
) : (
|
||||||
// END of user login compoenent
|
// END of user login compoenent
|
||||||
// family login compoenent
|
// family login compoenent
|
||||||
<div className="p-2 input-area login-area border-2 rounded-2xl">
|
<div className="p-2 input-area login-area border-2 border-[#4687ba] rounded-2xl">
|
||||||
<div className="input-item mb-5">
|
<div className="input-item mb-5">
|
||||||
<InputCom
|
<InputCom
|
||||||
labelClass="tracking-wider"
|
labelClass="tracking-wider"
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import facebookLogo from "../../../assets/images/facebook-4.svg";
|
|||||||
import WrenchBoard from "../../../assets/images/wrenchboard.png";
|
import WrenchBoard from "../../../assets/images/wrenchboard.png";
|
||||||
import usersService from "../../../services/UsersService";
|
import usersService from "../../../services/UsersService";
|
||||||
import InputCom from "../../Helpers/Inputs/InputCom";
|
import InputCom from "../../Helpers/Inputs/InputCom";
|
||||||
|
import AuthLayout from "../AuthLayout";
|
||||||
|
|
||||||
export default function SignUp() {
|
export default function SignUp() {
|
||||||
const [signUpLoading, setSignUpLoading] = useState(false);
|
const [signUpLoading, setSignUpLoading] = useState(false);
|
||||||
@@ -64,6 +65,13 @@ export default function SignUp() {
|
|||||||
last_name !== "" &&
|
last_name !== "" &&
|
||||||
country !== ""
|
country !== ""
|
||||||
) {
|
) {
|
||||||
|
//checks if email is a valid email address
|
||||||
|
let regEx = /^[^0-9][a-zA-Z0-9._%+-]+@[a-zA-Z]+(\.[a-zA-Z]+)+$/;
|
||||||
|
if (regEx.test(email) == false) {
|
||||||
|
setMsgError("Invalid Email");
|
||||||
|
return setTimeout(()=>{setMsgError("");},3000)
|
||||||
|
}
|
||||||
|
|
||||||
setSignUpLoading(true);
|
setSignUpLoading(true);
|
||||||
const reqData = {
|
const reqData = {
|
||||||
country: country,
|
country: country,
|
||||||
@@ -112,212 +120,159 @@ export default function SignUp() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="layout-wrapper login">
|
<AuthLayout slogan="Welcome to WrenchBoard">
|
||||||
<div className="main-wrapper login-wrapper w-full xl:h-screen h-full xl:py-10 py-12 overflow-y-auto">
|
<div className="w-full">
|
||||||
<div className=" h-full">
|
<div className="mb-5">
|
||||||
<div className="flex-1 flex justify-center items-center">
|
<Link to="#">
|
||||||
<div className="w-full">
|
<img
|
||||||
<div className="mb-12">
|
src={WrenchBoard}
|
||||||
<Link to="#">
|
alt="wrenchboard"
|
||||||
<img
|
className="h-10 mx-auto"
|
||||||
src={WrenchBoard}
|
/>
|
||||||
alt="wrenchboard"
|
</Link>
|
||||||
className="h-10 mx-auto"
|
</div>
|
||||||
/>
|
<div className="content-wrapper login shadow-md w-full lg:max-w-[500px] mx-auto flex justify-center items-center xl:bg-white dark:bg-dark-white 2xl:w-[828px] rounded-[0.475rem] sm:p-7 p-5 mb-0">
|
||||||
|
<div>
|
||||||
|
<div className="title-area flex flex-col justify-center items-center relative text-center mb-7">
|
||||||
|
<h1 className="text-[#181c32] font-semibold dark:text-white mb-3 leading-[27.3px] text-[22.75px]">
|
||||||
|
Create Account
|
||||||
|
</h1>
|
||||||
|
<span className="text-gray-400 font-medium text-[16.25px] leading-[24.375px]">
|
||||||
|
Already have an account?{" "}
|
||||||
|
<Link
|
||||||
|
to="/login"
|
||||||
|
className="font-semibold text-[#4687ba] hover:text-[#009ef7] transition"
|
||||||
|
>
|
||||||
|
Sign in here
|
||||||
</Link>
|
</Link>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="w-full flex items-center gap-2">
|
||||||
|
<div className="border-b border-[#eff2f5] max-w-[50%] w-full"></div>
|
||||||
|
<span className="text-[#b5b5c3] font-medium text-[0.7rem] w-[2%]">
|
||||||
|
OR
|
||||||
|
</span>
|
||||||
|
<div className="border-b border-[#eff2f5] max-w-[50%] w-full"></div>
|
||||||
|
</div>
|
||||||
|
<div className="input-area">
|
||||||
|
<SelectOption
|
||||||
|
label="Country"
|
||||||
|
data={countries}
|
||||||
|
name="country"
|
||||||
|
value={formData.country}
|
||||||
|
inputHandler={handleInputChange}
|
||||||
|
/>
|
||||||
|
<div className="input-fl-name mb-5 sm:flex w-full sm:space-x-6 ">
|
||||||
|
<div className="input-item sm:w-1/2 w-full mb-5 sm:mb-0">
|
||||||
|
<InputCom
|
||||||
|
fieldClass="px-6"
|
||||||
|
placeholder="Firstname"
|
||||||
|
label="First Name"
|
||||||
|
name="first_name"
|
||||||
|
type="text"
|
||||||
|
value={formData.first_name}
|
||||||
|
inputHandler={handleInputChange}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="input-item flex-1">
|
||||||
|
<InputCom
|
||||||
|
fieldClass="px-6"
|
||||||
|
placeholder="Lastname"
|
||||||
|
label="Last Name"
|
||||||
|
name="last_name"
|
||||||
|
type="text"
|
||||||
|
value={formData.last_name}
|
||||||
|
inputHandler={handleInputChange}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="content-wrapper login shadow-md w-full lg:max-w-[600px] mx-auto flex justify-center items-center xl:bg-white dark:bg-dark-white 2xl:w-[828px] rounded-[0.475rem] sm:p-7 p-5 mb-7">
|
<div className="input-item mb-5">
|
||||||
<div>
|
<InputCom
|
||||||
<div className="title-area flex flex-col justify-center items-center relative text-center mb-7">
|
fieldClass="px-6"
|
||||||
<h1 className="text-[#181c32] font-semibold dark:text-white mb-3 leading-[27.3px] text-[22.75px]">
|
placeholder="support@mermsemr.com"
|
||||||
Create Account
|
label="Email"
|
||||||
</h1>
|
name="email"
|
||||||
<span className="text-gray-400 font-medium text-[16.25px] leading-[24.375px]">
|
type="email"
|
||||||
Already have an account?{" "}
|
value={formData.email}
|
||||||
<Link
|
inputHandler={handleInputChange}
|
||||||
to="/login"
|
/>
|
||||||
className="font-semibold text-[#4687ba] hover:text-[#009ef7] transition"
|
</div>
|
||||||
|
<div className="input-item mb-5">
|
||||||
|
<InputCom
|
||||||
|
fieldClass="px-6"
|
||||||
|
placeholder="● ● ● ● ● ●"
|
||||||
|
label="Password"
|
||||||
|
name="password"
|
||||||
|
type={showPassword ? "text" : "password"}
|
||||||
|
onClick={togglePasswordVisibility}
|
||||||
|
passIcon={
|
||||||
|
showPassword ? "show-password" : "hide-password"
|
||||||
|
}
|
||||||
|
value={formData.password}
|
||||||
|
inputHandler={handleInputChange}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{msgError && (
|
||||||
|
<div className="relative p-4 text-[#912741] bg-[#fcd9e2] border-[#fbc6d3] mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px]">
|
||||||
|
{msgError}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div className="forgot-password-area flex justify-between items-center mb-6">
|
||||||
|
<div className="remember-checkbox flex items-center space-x-2.5">
|
||||||
|
<button
|
||||||
|
onClick={rememberMe}
|
||||||
|
type="button"
|
||||||
|
className="w-6 h-6 bg-[#4687ba] text-white flex justify-center items-center border border-light-gray rounded-[.45em]"
|
||||||
|
>
|
||||||
|
{checked && (
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
className="h-5 w-5"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
fill="currentColor"
|
||||||
>
|
>
|
||||||
Sign in here
|
<path
|
||||||
</Link>
|
fillRule="evenodd"
|
||||||
</span>
|
d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
|
||||||
</div>
|
clipRule="evenodd"
|
||||||
{/*<button*/}
|
|
||||||
{/* type="button"*/}
|
|
||||||
{/* className={`rounded-[0.475rem] w-full mb-6 text-[15px] h-[42px] font-semibold text-[#009ef7] hover:text-white flex justify-center bg-[#f1faff] hover:bg-[#009ef7] transition-all duration-300 items-center py-[0.8875rem] px-[1.8125rem]`}*/}
|
|
||||||
{/*>*/}
|
|
||||||
{/* <img*/}
|
|
||||||
{/* className="mr-3 h-6"*/}
|
|
||||||
{/* src={facebookLogo}*/}
|
|
||||||
{/* alt="logo-icon(s)"*/}
|
|
||||||
{/* />*/}
|
|
||||||
{/* Sign in with Facebook*/}
|
|
||||||
{/*</button>*/}
|
|
||||||
<div className="w-full flex items-center gap-2">
|
|
||||||
<div className="border-b border-[#eff2f5] max-w-[50%] w-full"></div>
|
|
||||||
<span className="text-[#b5b5c3] font-medium text-[0.7rem] w-[2%]">
|
|
||||||
OR
|
|
||||||
</span>
|
|
||||||
<div className="border-b border-[#eff2f5] max-w-[50%] w-full"></div>
|
|
||||||
</div>
|
|
||||||
<div className="input-area">
|
|
||||||
<SelectOption
|
|
||||||
label="Country"
|
|
||||||
data={countries}
|
|
||||||
name="country"
|
|
||||||
value={formData.country}
|
|
||||||
inputHandler={handleInputChange}
|
|
||||||
/>
|
|
||||||
<div className="input-fl-name mb-5 sm:flex w-full sm:space-x-6 ">
|
|
||||||
<div className="input-item sm:w-1/2 w-full mb-5 sm:mb-0">
|
|
||||||
<InputCom
|
|
||||||
fieldClass="px-6"
|
|
||||||
placeholder="Firstname"
|
|
||||||
label="First Name"
|
|
||||||
name="first_name"
|
|
||||||
type="text"
|
|
||||||
value={formData.first_name}
|
|
||||||
inputHandler={handleInputChange}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</svg>
|
||||||
<div className="input-item flex-1">
|
|
||||||
<InputCom
|
|
||||||
fieldClass="px-6"
|
|
||||||
placeholder="Lastname"
|
|
||||||
label="Last Name"
|
|
||||||
name="last_name"
|
|
||||||
type="text"
|
|
||||||
value={formData.last_name}
|
|
||||||
inputHandler={handleInputChange}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="input-item mb-5">
|
|
||||||
<InputCom
|
|
||||||
fieldClass="px-6"
|
|
||||||
placeholder="support@mermsemr.com"
|
|
||||||
label="Email"
|
|
||||||
name="email"
|
|
||||||
type="email"
|
|
||||||
value={formData.email}
|
|
||||||
inputHandler={handleInputChange}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="input-item mb-5">
|
|
||||||
<InputCom
|
|
||||||
fieldClass="px-6"
|
|
||||||
placeholder="● ● ● ● ● ●"
|
|
||||||
label="Password"
|
|
||||||
name="password"
|
|
||||||
type={showPassword ? "text" : "password"}
|
|
||||||
onClick={togglePasswordVisibility}
|
|
||||||
passIcon={
|
|
||||||
showPassword ? "show-password" : "hide-password"
|
|
||||||
}
|
|
||||||
value={formData.password}
|
|
||||||
inputHandler={handleInputChange}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
{msgError && (
|
|
||||||
<div className="relative p-4 text-[#912741] bg-[#fcd9e2] border-[#fbc6d3] mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px]">
|
|
||||||
{msgError}
|
|
||||||
</div>
|
|
||||||
)}
|
)}
|
||||||
<div className="forgot-password-area flex justify-between items-center mb-6">
|
</button>
|
||||||
<div className="remember-checkbox flex items-center space-x-2.5">
|
<span
|
||||||
<button
|
onClick={rememberMe}
|
||||||
onClick={rememberMe}
|
className="cursor-default text-dark-gray dark:text-white text-[15px]"
|
||||||
type="button"
|
>
|
||||||
className="w-6 h-6 bg-[#4687ba] text-white flex justify-center items-center border border-light-gray rounded-[.45em]"
|
I agree with all
|
||||||
>
|
<Link
|
||||||
{checked && (
|
href="#"
|
||||||
<svg
|
className="text-base text-[#4687ba] hover:text-[#009ef7] mx-1 inline-block"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
>
|
||||||
className="h-5 w-5"
|
terms and condition
|
||||||
viewBox="0 0 20 20"
|
</Link>
|
||||||
fill="currentColor"
|
</span>
|
||||||
>
|
</div>
|
||||||
<path
|
</div>
|
||||||
fillRule="evenodd"
|
<div className="signin-area mb-1">
|
||||||
d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
|
<div className="flex justify-center">
|
||||||
clipRule="evenodd"
|
<button
|
||||||
/>
|
type="button"
|
||||||
</svg>
|
onClick={handleSignUp}
|
||||||
)}
|
className={`rounded-[0.475rem] mb-6 text-white flex justify-center bg-[#4687ba] hover:bg-[#009ef7] transition-all duration-300 items-center h-[42px] py-[0.8875rem] px-[1.81rem] text-[14.95px] btn-login`}
|
||||||
</button>
|
>
|
||||||
<span
|
{signUpLoading ? (
|
||||||
onClick={rememberMe}
|
<div className="signup btn-loader"></div>
|
||||||
className="cursor-default text-dark-gray dark:text-white text-[15px]"
|
) : (
|
||||||
>
|
<span>Sign Up</span>
|
||||||
I agree with all
|
)}
|
||||||
<Link
|
</button>
|
||||||
href="#"
|
|
||||||
className="text-base text-[#4687ba] hover:text-[#009ef7] mx-1 inline-block"
|
|
||||||
>
|
|
||||||
terms and condition
|
|
||||||
</Link>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="signin-area mb-1">
|
|
||||||
<div className="flex justify-center">
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
onClick={handleSignUp}
|
|
||||||
className={`rounded-[0.475rem] mb-6 text-white flex justify-center bg-[#4687ba] hover:bg-[#009ef7] transition-all duration-300 items-center h-[42px] py-[0.8875rem] px-[1.81rem] text-[14.95px] btn-login`}
|
|
||||||
>
|
|
||||||
{signUpLoading ? (
|
|
||||||
<div className="signup btn-loader"></div>
|
|
||||||
) : (
|
|
||||||
<span>Sign Up</span>
|
|
||||||
)}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex-1 flex justify-center items-center p-10">
|
|
||||||
<div className="flex items-center">
|
|
||||||
<a
|
|
||||||
href="https://www.wrenchboard.com/about-us"
|
|
||||||
className="text-[#a1a5b7] text-[15px] px-2 font-medium hover:text-[#009ef7]"
|
|
||||||
target="_blank"
|
|
||||||
rel="noreferrer"
|
|
||||||
>
|
|
||||||
About
|
|
||||||
</a>
|
|
||||||
<a
|
|
||||||
href="https://www.wrenchboard.com/service"
|
|
||||||
className="text-[#a1a5b7] text-[15px] px-2 font-medium hover:text-[#009ef7]"
|
|
||||||
target="_blank"
|
|
||||||
rel="noreferrer"
|
|
||||||
>
|
|
||||||
Services
|
|
||||||
</a>
|
|
||||||
<a
|
|
||||||
href="https://www.wrenchboard.com/contact"
|
|
||||||
className="text-[#a1a5b7] text-[15px] px-2 font-medium hover:text-[#009ef7]"
|
|
||||||
target="_blank"
|
|
||||||
rel="noreferrer"
|
|
||||||
>
|
|
||||||
Contact Us
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="flex-1 flex justify-center items-center p-10">
|
|
||||||
<p className="text-black text-[15px] px-2 font-medium flex items-center">
|
|
||||||
<span className="text-3xl mt-2 mr-1">©</span> 2023 -{" "}
|
|
||||||
<Link to="/" className="text-[#009ef7] ml-1">
|
|
||||||
WrenchBoard
|
|
||||||
</Link>{" "}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</AuthLayout>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -937,8 +937,4 @@ TODO: Responsive ===========================
|
|||||||
/* TO REMOVE SLIDER COMPONENT FROM CENTRALIZED */
|
/* TO REMOVE SLIDER COMPONENT FROM CENTRALIZED */
|
||||||
.slider-left .slick-slider .slick-track{
|
.slider-left .slick-slider .slick-track{
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
|
||||||
|
|
||||||
.login-type-btn{
|
|
||||||
box-shadow: 0 0 0.8rem #00000080;
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user