diff --git a/src/assets/images/shape/title_shape_3.svg b/src/assets/images/shape/title_shape_3.svg new file mode 100644 index 0000000..f1b69b7 --- /dev/null +++ b/src/assets/images/shape/title_shape_3.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/components/AuthPages/SignUp/VerifySignup/Otp.jsx b/src/components/AuthPages/SignUp/VerifySignup/Otp.jsx index ea07d94..dcf7005 100644 --- a/src/components/AuthPages/SignUp/VerifySignup/Otp.jsx +++ b/src/components/AuthPages/SignUp/VerifySignup/Otp.jsx @@ -1,6 +1,6 @@ import React, { useEffect } from "react"; -export default function Otp() { +export default function Otp({handleChange, value}) { useEffect(() => { const otp = document.querySelector("#otp-inputs"); // eslint-disable-next-line no-restricted-syntax @@ -25,6 +25,9 @@ export default function Otp() { type="text" maxLength={1} id="otp" + name='value_one' + value={value.value_one} + onChange={handleChange} />
@@ -33,6 +36,9 @@ export default function Otp() { type="text" maxLength={1} id="otp" + name='value_two' + value={value.value_two} + onChange={handleChange} />
@@ -41,6 +47,9 @@ export default function Otp() { type="text" maxLength={1} id="otp" + name='value_three' + value={value.value_three} + onChange={handleChange} />
@@ -49,6 +58,9 @@ export default function Otp() { type="text" maxLength={1} id="otp" + name='value_four' + value={value.value_four} + onChange={handleChange} />
@@ -57,6 +69,9 @@ export default function Otp() { type="text" maxLength={1} id="otp" + name='value_five' + value={value.value_five} + onChange={handleChange} />
@@ -65,6 +80,9 @@ export default function Otp() { type="text" maxLength={1} id="otp" + name='value_six' + value={value.value_six} + onChange={handleChange} />
diff --git a/src/components/AuthPages/SignUp/VerifySignup/index.jsx b/src/components/AuthPages/SignUp/VerifySignup/index.jsx index d103b3c..dc7ef06 100644 --- a/src/components/AuthPages/SignUp/VerifySignup/index.jsx +++ b/src/components/AuthPages/SignUp/VerifySignup/index.jsx @@ -1,9 +1,101 @@ -import React from "react"; -import titleShape from "../../../../assets/images/shape/text-shape-three.svg"; +import React, {useState} from "react"; +// import titleShape from "../../../../assets/images/shape/text-shape-three.svg"; +import titleShape from "../../../../assets/images/shape/title_shape_3.svg"; import AuthLayout from "../../AuthLayout"; import Otp from "./Otp"; +import { useNavigate } from 'react-router-dom'; +import usersService from "../../../../services/UsersService"; export default function VerifyYou() { + + const navigate = useNavigate(); + + const verify = new usersService(); + + const [loading, setLoading] = useState(false) // For loading spinner + + const [errorMessage, setErrorMessage] = useState({ // For Displaying success or error message + success: false, + message: '' + }) + + + // state for user inputed values + const [verificationCode, setVerificationCode] = useState({ + value_one: '', + value_two: '', + value_three: '', + value_four: '', + value_five: '', + value_six: '', + }) + + const handleVerificationInput = ({target:{name, value}}) => { // function that listens to input change + setVerificationCode(prev => { + return {...prev, [name]:value} + }) + } + + const handleUserOTPVerify = async () => { // handles input validation and submits to api call + + setErrorMessage({ // resets the error message to empty string + success: false, + message: '' + }) + + setLoading(true) // Sets loading spinner + + let code = ''; + for(let values in verificationCode){ + code+=verificationCode[values] + } + + if(!code){ // checks if code is empty + setLoading(false) + setErrorMessage({ + success: false, + message: 'Please input the code sent to you' + }) + return + } + if(code.length < 6){ // checks if verifiedCode is empty + setLoading(false) + setErrorMessage({ + success: false, + message: 'Code must be 6 characters' + }) + return + } + + try { + const res = await verify.signupOTPVerify(code); + console.log(res) + if(res.status != 200){ + setLoading(false) + setErrorMessage({ + success: false, + message: 'Could not verify code' + }) + return + } + // if status code is 200 proceed + setErrorMessage({ + success: true, + message: 'verification successfully' + }) + setTimeout(()=>{ + setLoading(false) + navigate('/update-password', { replace: true }) + }, 1000) + } catch (error) { + setLoading(false) + setErrorMessage({ + success: false, + message: 'Opps! something went wrong, Try agian later' + }) + } + } + return ( <>
-

+

SignUp Verification

-
+
shape
- + + {errorMessage.message != '' &&

{errorMessage.message}

}

diff --git a/src/components/AuthPages/SignUp/index.jsx b/src/components/AuthPages/SignUp/index.jsx index 55769f6..a79a9cf 100755 --- a/src/components/AuthPages/SignUp/index.jsx +++ b/src/components/AuthPages/SignUp/index.jsx @@ -6,12 +6,101 @@ import titleShape from "../../../assets/images/shape/title-shape-two.svg"; import InputCom from "../../Helpers/Inputs/InputCom"; import { Link, useNavigate } from 'react-router-dom'; +import usersService from "../../../services/UsersService"; + export default function SignUp() { const navigate = useNavigate(); + + const userSignupAuth = new usersService(); + + const [loading, setLoading] = useState(false) // For loading spinner + + const [errorMessage, setErrorMessage] = useState({ // For Displaying success or error message + success: false, + message: '' + }) + const [checked, setValue] = useState(false); const rememberMe = () => { setValue(!checked); }; + + // state for user inputed values + const [userDetails, setUserDetails] = useState({ + // username: '', + email: '', + password: '', + confirm_password: '', + firstname: '', + lastname: '' + }) + + const handleInputChange = ({target:{name, value}}) => { // function that listens to input change + setUserDetails(prev => { + return {...prev, [name]:value} + }) + } + + const handleUserSignup = async () => { // handles input validation and submits to api call + + setErrorMessage({ // resets the error message to empty string + success: false, + message: '' + }) + + setLoading(true) // Sets loading spinner + + let userInfo = {...userDetails} // assigns userDetails to be user information + + let {email, password, confirm_password, firstname, lastname} = userInfo + + if(!email || !password || !confirm_password || !firstname || !lastname){ // checks if any field is empty + setLoading(false) + setErrorMessage({ + success: false, + message: 'Please Fill all inputs' + }) + return + } + + if(password != confirm_password){ //checks if password matches confirm password + setLoading(false) + setErrorMessage({ + success: false, + message: 'Password do not match' + }) + return + } + + delete userInfo.confirm_password // deletes confrim password before making API call + + try { + const res = await userSignupAuth.signupAuth(userInfo); + if(res.status != 200){ + setLoading(false) + setErrorMessage({ + success: false, + message: 'Could not create account try again later' + }) + return + } + // if status code is 200 proceed + setErrorMessage({ + success: true, + message: 'Account created successfully' + }) + setTimeout(()=>{ + setLoading(false) + navigate("/verify-signup", { replace: true }) + }, 1000) + } catch (error) { + setLoading(false) + setErrorMessage({ + success: false, + message: 'Opps! something went wrong, Try agian later' + }) + } + } return ( <>

@@ -49,18 +138,22 @@ export default function SignUp() {
@@ -71,6 +164,8 @@ export default function SignUp() { name="email" type="email" iconName="message" + value={userDetails.email} + inputHandler={handleInputChange} />
@@ -80,15 +175,19 @@ export default function SignUp() { name="password" type="password" iconName="password" + value={userDetails.password} + inputHandler={handleInputChange} />
@@ -129,11 +228,21 @@ export default function SignUp() {
- + {errorMessage.message != '' &&

{errorMessage.message}

} {/*