Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d7025b9c19 | |||
| e574f6d49d | |||
| 32efae78ea | |||
| aefd7675b3 | |||
| c130c056f8 |
@@ -3,6 +3,7 @@ import FourZeroFour from "./components/FourZeroFour";
|
||||
import ScrollToTop from "./components/Helpers/ScrollToTop";
|
||||
import MyCollection from "./components/MyCollection";
|
||||
import Notification from "./components/Notification";
|
||||
import ThankYou from "./components/AuthPages/ThankYou";
|
||||
import AuthRoute from "./middleware/AuthRoute";
|
||||
import AcitveBidsPage from "./views/AcitveBidsPage";
|
||||
import AuthProfilePage from "./views/AuthProfilePage";
|
||||
@@ -50,6 +51,11 @@ export default function Routers() {
|
||||
path="/update-password"
|
||||
element={<UpdatePasswordPages />}
|
||||
/>
|
||||
<Route
|
||||
exact
|
||||
path="/confirm-reset"
|
||||
element={<ThankYou />}
|
||||
/>
|
||||
<Route exact path="/verify-you" element={<VerifyYouPages />} />
|
||||
<Route exact path="/verify-signup" element={<VerifySignupPage />} />
|
||||
<Route exact path="/complete-signup" element={<VerifySignupCompletePage />} />
|
||||
|
||||
@@ -20,11 +20,10 @@ export default function ForgotPassword() {
|
||||
function validationChecker(email) {
|
||||
const emailCheck = /^[^0-9][a-zA-Z0-9._%+-]+@[a-zA-Z]+(\.[a-zA-Z]+)+$/;
|
||||
if (email === "") {
|
||||
setValidation("email is required");
|
||||
setValidation("");
|
||||
} else if (!email.match(emailCheck)) {
|
||||
setValidation('Please input a valid email address');
|
||||
} else {
|
||||
setValidation("");
|
||||
setButtonDisabled(false)
|
||||
}
|
||||
}
|
||||
@@ -36,6 +35,10 @@ export default function ForgotPassword() {
|
||||
}
|
||||
const reset = await user.resetPassword(resetEmail);
|
||||
setLoading(true)
|
||||
|
||||
const {raw_data, uuid} = reset.data
|
||||
localStorage.setItem('reset_uuid', uuid)
|
||||
localStorage.setItem('reset_raw', JSON.stringify(raw_data))
|
||||
if (reset.status == 200){
|
||||
setTimeout(() => {
|
||||
navigate("/verify-you", {replace : true});
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
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";
|
||||
@@ -68,18 +67,14 @@ export default function VerifyYou() {
|
||||
}
|
||||
|
||||
let apiInput = {
|
||||
username: 'anumuduchukwuebuka@gmail.com',
|
||||
pend_uid: 'ec497517-ddb5-4830-a2c4-b7e2a68627de',
|
||||
username: localStorage.getItem('username'),
|
||||
pend_uid: localStorage.getItem('uuid'),
|
||||
random_text: otpCode,
|
||||
mode: 'VERIFY',
|
||||
// loc: 'Desktop',
|
||||
// sessionid: 'ec497517-ddb5-4830-a2c4-b7e2a68627de',
|
||||
// code: otpCode,
|
||||
}
|
||||
|
||||
try {
|
||||
const res = await verifyOTP.signupOTPVerify(apiInput);
|
||||
console.log(res)
|
||||
const res = await verifyOTP.signupUser(apiInput)
|
||||
if(res.status != 200){
|
||||
setLoading(false)
|
||||
setErrorMessage({
|
||||
@@ -88,15 +83,33 @@ export default function VerifyYou() {
|
||||
})
|
||||
return
|
||||
}
|
||||
// if status code is 200 proceed
|
||||
setErrorMessage({
|
||||
success: true,
|
||||
message: 'verification successfully'
|
||||
})
|
||||
setTimeout(()=>{
|
||||
setLoading(false)
|
||||
navigate('/complete-signup', { replace: true })
|
||||
}, 1000)
|
||||
|
||||
if(res.status == 200){
|
||||
if(res.data.status < 0) { // when resquest is successful but status is not 100
|
||||
setLoading(false)
|
||||
setErrorMessage({
|
||||
success: false,
|
||||
message: res.data.error_msg
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// if request is successful and status is 100 proceed
|
||||
setErrorMessage({
|
||||
success: true,
|
||||
message: 'verification successfully'
|
||||
})
|
||||
|
||||
//clears the temporary uuid and email in tge local storage
|
||||
localStorage.removeItem('uuid')
|
||||
localStorage.removeItem('username')
|
||||
|
||||
setTimeout(()=>{
|
||||
setLoading(false)
|
||||
navigate('/complete-signup', { replace: true })
|
||||
}, 1000)
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
setLoading(false)
|
||||
setErrorMessage({
|
||||
|
||||
@@ -100,7 +100,7 @@ export default function SignUp() {
|
||||
|
||||
try {
|
||||
const res = await userSignup.signupUser(userInfo);
|
||||
if(res.status != 200 || res.data.status < 1){
|
||||
if(res.status != 200){
|
||||
setLoading(false)
|
||||
setErrorMessage({
|
||||
success: false,
|
||||
@@ -108,15 +108,31 @@ export default function SignUp() {
|
||||
})
|
||||
return
|
||||
}
|
||||
// if status code is 200 proceed
|
||||
setErrorMessage({
|
||||
success: true,
|
||||
message: 'Account created successfully'
|
||||
})
|
||||
setTimeout(()=>{
|
||||
setLoading(false)
|
||||
navigate("/verify-signup", { replace: true })
|
||||
}, 1000)
|
||||
|
||||
if(res.status == 200){
|
||||
if(res.data.status < 0) { // when resquest is successful but status is not 1
|
||||
setLoading(false)
|
||||
setErrorMessage({
|
||||
success: false,
|
||||
message: 'unable to create account'
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// if request is successful and status is 1 proceed
|
||||
setErrorMessage({
|
||||
success: true,
|
||||
message: 'Account created successfully'
|
||||
})
|
||||
|
||||
localStorage.setItem('uuid', res.data.uuid) // Stores the user UUID to localstorage
|
||||
localStorage.setItem('username', email) // Stores the user UUID to localstorage
|
||||
|
||||
setTimeout(()=>{
|
||||
setLoading(false)
|
||||
navigate("/verify-signup", { replace: true })
|
||||
}, 1000)
|
||||
}
|
||||
} catch (error) {
|
||||
setLoading(false)
|
||||
setErrorMessage({
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
import React from "react";
|
||||
import AuthLayout from "../../AuthPages/AuthLayout";
|
||||
|
||||
export default function ThankYou({ className }) {
|
||||
return (
|
||||
<div
|
||||
<>
|
||||
<AuthLayout slogan='Welcome to myFit'>
|
||||
<div
|
||||
className={`content-wrapper xl:bg-white dark:xl:bg-dark-white sm:px-[70px] px-5 2xl:px-[100px] 2xl:h-[818px] xl:h-[650px] rounded-xl flex flex-col justify-center ${
|
||||
className || ""
|
||||
}`}
|
||||
@@ -44,5 +47,7 @@ export default function ThankYou({ className }) {
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</AuthLayout>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,17 +1,87 @@
|
||||
import React, { useState } from "react";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import titleShape from "../../../assets/images/shape/title-shape-two.svg";
|
||||
import InputCom from "../../Helpers/Inputs/InputCom";
|
||||
import AuthLayout from "../AuthLayout";
|
||||
import ThankYou from "../ThankYou";
|
||||
import usersService from "../../../services/UsersService";
|
||||
|
||||
export default function UpdatePassword() {
|
||||
const [updated, setValue] = useState(false);
|
||||
const [values, setValues] = useState({
|
||||
password: '',
|
||||
confirmPassword: '',
|
||||
})
|
||||
const [message, setMessage] = useState(false);
|
||||
const updatePassword = () => {
|
||||
setValue(!updated);
|
||||
setTimeout(() => {
|
||||
setMessage(!message);
|
||||
}, 100);
|
||||
const [validation, setValidation] = useState("");
|
||||
const [loading, setLoading] = useState(false);
|
||||
const updatePass = new usersService()
|
||||
const navigate = useNavigate()
|
||||
|
||||
const onChange = (e) => {
|
||||
setValues((prev) => ({ ...prev, [e.target.name]: e.target.value }));
|
||||
};
|
||||
|
||||
const updatePassword = async (e) => {
|
||||
const {username} = JSON.parse(localStorage.getItem('reset_raw'))
|
||||
const otpCode = localStorage.getItem('otp')
|
||||
|
||||
setLoading(true)
|
||||
|
||||
if(!values.password || !values.confirmPassword){
|
||||
setLoading(false)
|
||||
setValidation("Please Fill empty inputs")
|
||||
return
|
||||
}
|
||||
|
||||
const regex = /^[A-Za-z]\w{7,14}$/
|
||||
if(regex.test(values.password) == false) {
|
||||
setLoading(false)
|
||||
setValidation("it must be a least 7 alphanumeric characters")
|
||||
return
|
||||
}
|
||||
|
||||
if (values.password != values.confirmPassword){
|
||||
setLoading(false)
|
||||
setValidation("Password does not match")
|
||||
return
|
||||
}
|
||||
|
||||
const newPassword = {
|
||||
username: username,
|
||||
reset_uuid: localStorage.getItem('reset_uuid'),
|
||||
random_text: otpCode,
|
||||
member_uid: localStorage.getItem('member_uid'),
|
||||
new_password: values.password,
|
||||
stage: 300
|
||||
}
|
||||
|
||||
delete values.confirmPassword
|
||||
|
||||
try {
|
||||
const confirm = await updatePass.resetPassword(newPassword)
|
||||
console.log(confirm)
|
||||
|
||||
if(confirm.status != 200){
|
||||
setLoading(false)
|
||||
setValidation("Sorry, could not verify code")
|
||||
return
|
||||
}
|
||||
|
||||
localStorage.removeItem('reset_uuid')
|
||||
localStorage.removeItem('reset_raw')
|
||||
localStorage.removeItem('otp')
|
||||
|
||||
if(confirm.status == 200){
|
||||
setValidation("Password updated")
|
||||
setTimeout(() => {
|
||||
setLoading(false)
|
||||
navigate("/confirm-reset", {replace : true});
|
||||
}, 2000);
|
||||
}
|
||||
} catch (error) {
|
||||
setLoading(false)
|
||||
setValidation("An error occurred")
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
@@ -19,7 +89,6 @@ export default function UpdatePassword() {
|
||||
<AuthLayout
|
||||
slogan="Welcome to myFit"
|
||||
>
|
||||
{updated === false ? (
|
||||
<div className="content-wrapper update-password-section xl:bg-white dark:bg-dark-white w-full 2xl:h-[818px] xl:h-[600px] sm:w-auto sm:px-[70px] px-5 2xl:px-[100px] rounded-xl flex flex-col justify-center">
|
||||
<div>
|
||||
<div className="title-area relative flex flex-col justify-center items-center mb-7">
|
||||
@@ -32,7 +101,7 @@ export default function UpdatePassword() {
|
||||
</div>
|
||||
</div>
|
||||
<div className="input-area">
|
||||
<div className="input-item mb-5">
|
||||
{/* <div className="input-item mb-5">
|
||||
<InputCom
|
||||
placeholder="*********"
|
||||
label="Old Password"
|
||||
@@ -40,7 +109,7 @@ export default function UpdatePassword() {
|
||||
type="password"
|
||||
iconName="password"
|
||||
/>
|
||||
</div>
|
||||
</div> */}
|
||||
<div className="input-item mb-5">
|
||||
<InputCom
|
||||
placeholder="*********"
|
||||
@@ -48,32 +117,35 @@ export default function UpdatePassword() {
|
||||
name="password"
|
||||
type="password"
|
||||
iconName="password"
|
||||
inputHandler={onChange}
|
||||
/>
|
||||
</div>
|
||||
<div className="input-item mb-5">
|
||||
<InputCom
|
||||
placeholder="*********"
|
||||
label="Re-enter Password"
|
||||
name="password"
|
||||
name="confirmPassword"
|
||||
type="password"
|
||||
iconName="password"
|
||||
inputHandler={onChange}
|
||||
/>
|
||||
</div>
|
||||
{validation && <p className={`my-5 text-center font-light italic text-sm subpixel-antialiased tracking-wide ${validation == 'Password updated' ? 'text-green-600' : 'text-red-500'} `}>{validation}</p>}
|
||||
<div className="signin-area mb-3.5">
|
||||
<button
|
||||
onClick={updatePassword}
|
||||
type="button"
|
||||
className="w-full rounded-[50px] mb-5 h-[58px] text-xl text-white font-bold flex justify-center bg-purple items-center"
|
||||
>
|
||||
Continue
|
||||
{loading ? <div className="signup btn-loader"></div> : <span>Continue</span>}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<ThankYou className={`thankyou-section ${message ? "active" : ""}`} />
|
||||
)}
|
||||
</div>
|
||||
{/* // : (
|
||||
// <ThankYou className={`thankyou-section ${message ? "active" : ""}`} />
|
||||
// )} */}
|
||||
</AuthLayout>
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -1,18 +1,26 @@
|
||||
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
|
||||
for (const pin of otp.children) {
|
||||
// eslint-disable-next-line no-loop-func
|
||||
pin.onkeyup = () => {
|
||||
if (pin.nextSibling) {
|
||||
pin.nextSibling.children.otp.focus();
|
||||
pin.onkeyup = (value) => {
|
||||
if(pin.children){
|
||||
if(value.key === '' || value.key === ' ' || value.key === 'ArrowRight' || value.key === 'ArrowLeft' || value.key === 'ArrowUp' || value.key === 'ArrowDown' || value.key === 'Tab') return;
|
||||
if(value.key === 'Backspace'){
|
||||
if(pin.previousSibling){
|
||||
pin.previousSibling.children.otp.focus();
|
||||
} else {return;}
|
||||
} else {
|
||||
pin.nextSibling.children.otp.focus();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<>
|
||||
<div
|
||||
@@ -25,6 +33,9 @@ export default function Otp() {
|
||||
type="text"
|
||||
maxLength={1}
|
||||
id="otp"
|
||||
name='value_one'
|
||||
value={value.value_one}
|
||||
onChange={handleChange}
|
||||
/>
|
||||
</div>
|
||||
<div className="input-wrapper border border-light-purple dark:border-[#5356fb29] sm:w-14 sm:h-14 w-12 h-12 rounded-[50px] overflow-hidden relative ">
|
||||
@@ -33,6 +44,9 @@ export default function Otp() {
|
||||
type="text"
|
||||
maxLength={1}
|
||||
id="otp"
|
||||
name='value_two'
|
||||
value={value.value_two}
|
||||
onChange={handleChange}
|
||||
/>
|
||||
</div>
|
||||
<div className="input-wrapper border border-light-purple dark:border-[#5356fb29] sm:w-14 sm:h-14 w-12 h-12 rounded-[50px] overflow-hidden relative ">
|
||||
@@ -41,6 +55,9 @@ export default function Otp() {
|
||||
type="text"
|
||||
maxLength={1}
|
||||
id="otp"
|
||||
name='value_three'
|
||||
value={value.value_three}
|
||||
onChange={handleChange}
|
||||
/>
|
||||
</div>
|
||||
<div className="input-wrapper border border-light-purple dark:border-[#5356fb29] sm:w-14 sm:h-14 w-12 h-12 rounded-[50px] overflow-hidden relative ">
|
||||
@@ -49,6 +66,9 @@ export default function Otp() {
|
||||
type="text"
|
||||
maxLength={1}
|
||||
id="otp"
|
||||
name='value_four'
|
||||
value={value.value_four}
|
||||
onChange={handleChange}
|
||||
/>
|
||||
</div>
|
||||
<div className="input-wrapper border border-light-purple dark:border-[#5356fb29] sm:w-14 sm:h-14 w-12 h-12 rounded-[50px] overflow-hidden relative ">
|
||||
@@ -57,6 +77,9 @@ export default function Otp() {
|
||||
type="text"
|
||||
maxLength={1}
|
||||
id="otp"
|
||||
name='value_five'
|
||||
value={value.value_five}
|
||||
onChange={handleChange}
|
||||
/>
|
||||
</div>
|
||||
<div className="input-wrapper border border-light-purple dark:border-[#5356fb29] sm:w-14 sm:h-14 w-12 h-12 rounded-[50px] overflow-hidden relative ">
|
||||
@@ -65,6 +88,9 @@ export default function Otp() {
|
||||
type="text"
|
||||
maxLength={1}
|
||||
id="otp"
|
||||
name='value_six'
|
||||
value={value.value_six}
|
||||
onChange={handleChange}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,9 +1,90 @@
|
||||
import React from "react";
|
||||
import React,{useState} from "react";
|
||||
import {useNavigate} from "react-router-dom"
|
||||
import titleShape from "../../../assets/images/shape/text-shape-three.svg";
|
||||
import AuthLayout from "../AuthLayout";
|
||||
import Otp from "./Otp";
|
||||
import usersService from "../../../services/UsersService";
|
||||
|
||||
export default function VerifyYou() {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [validation, setValidation] = useState("");
|
||||
const verifyOTP = new usersService()
|
||||
const navigate = useNavigate()
|
||||
|
||||
const [verificationCode, setVerificationCode] = useState({
|
||||
value_one: '',
|
||||
value_two: ''
|
||||
})
|
||||
|
||||
const handleVerificationInput = ({target:{name, value}}) => {
|
||||
setVerificationCode(prev => {
|
||||
return {...prev, [name]:value}
|
||||
})
|
||||
}
|
||||
|
||||
const handleSubmit = async() => {
|
||||
setValidation("")
|
||||
setLoading(true)
|
||||
|
||||
let otpCode = '';
|
||||
for(let values in verificationCode){
|
||||
otpCode+=verificationCode[values]
|
||||
}
|
||||
|
||||
// Validating otp code
|
||||
if(!otpCode) {
|
||||
setLoading(false)
|
||||
setValidation("Please enter your otp code")
|
||||
return
|
||||
}
|
||||
if(otpCode.length < 6) {
|
||||
setLoading(false)
|
||||
setValidation("OTP code incomplete")
|
||||
return
|
||||
}
|
||||
|
||||
const {username} = JSON.parse(localStorage.getItem('reset_raw'))
|
||||
const verifyEmail = {
|
||||
username: username,
|
||||
stage: 200,
|
||||
reset_uuid: localStorage.getItem('reset_uuid'),
|
||||
random_text: otpCode
|
||||
}
|
||||
|
||||
localStorage.setItem('otp', otpCode)
|
||||
|
||||
try {
|
||||
const verify = await verifyOTP.resetPassword(verifyEmail);
|
||||
console.log(verify)
|
||||
localStorage.setItem('member_uid', verify.data.member_uid);
|
||||
if (verify.status != 200){
|
||||
setValidation("Sorry, could not verify code")
|
||||
setLoading(false)
|
||||
return
|
||||
}
|
||||
|
||||
if (verify.status == 200){
|
||||
|
||||
if(verify?.data.error_msg == "Unable to continue"){
|
||||
setLoading(false)
|
||||
setValidation("Incorrect otp code")
|
||||
return
|
||||
}
|
||||
|
||||
setValidation("verified successfully")
|
||||
|
||||
setTimeout(() => {
|
||||
setLoading(false)
|
||||
navigate("/update-password", {replace : true});
|
||||
}, 2000);
|
||||
return
|
||||
}
|
||||
} catch (error) {
|
||||
setLoading(false)
|
||||
setValidation('An error occurred')
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<AuthLayout
|
||||
@@ -20,20 +101,22 @@ export default function VerifyYou() {
|
||||
</div>
|
||||
</div>
|
||||
<div className="input-area">
|
||||
<Otp />
|
||||
<Otp handleChange={handleVerificationInput} value={verificationCode} />
|
||||
{validation && <p className={`my-5 text-center font-light italic text-sm subpixel-antialiased tracking-wide ${validation == 'verified successfully' ? 'text-green-600' : 'text-red-500'} `}>{validation}</p>}
|
||||
<div className="signin-area mb-3.5">
|
||||
<a
|
||||
href="/update-password"
|
||||
// href="/update-password"
|
||||
className="w-full rounded-[50px] h-[58px] mb-6 text-xl text-white font-bold flex justify-center bg-purple items-center"
|
||||
onClick={handleSubmit}
|
||||
>
|
||||
Continue
|
||||
{loading ? <div className="signup btn-loader"></div> : <span>Continue</span>}
|
||||
</a>
|
||||
</div>
|
||||
<div className="resend-code flex justify-center">
|
||||
<p className="text-lg text-thin-light-gray font-normal">
|
||||
Dont’t have an aceount ?
|
||||
<a href="#" className="ml-2 text-dark-gray dark:text-white font-bold">
|
||||
Please resend
|
||||
<a href="/signup" className="ml-2 text-dark-gray dark:text-white font-bold">
|
||||
Sign Up
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -25,11 +25,6 @@ class usersService {
|
||||
return this.postAuxEnd("/account", reqData);
|
||||
}
|
||||
|
||||
//SIGNUP OTP VERIFICATION AUTH
|
||||
signupOTPVerify(reqData){
|
||||
return this.postAuxEnd("/signup-code", reqData);
|
||||
}
|
||||
|
||||
getUserReminders(){
|
||||
var reqData = {
|
||||
member_id: localStorage.getItem("member_id")
|
||||
|
||||
Reference in New Issue
Block a user