Compare commits

..

1 Commits

Author SHA1 Message Date
victorAnumudu d94ff616a9 added validation to add recipient page 2023-04-27 04:26:11 +01:00
10 changed files with 385 additions and 514 deletions
+1 -3
View File
@@ -22,7 +22,7 @@ import UpdatePasswordPages from "./views/UpdatePasswordPages";
import UploadProductPage from "./views/UploadProductPage"; import UploadProductPage from "./views/UploadProductPage";
import UserProfilePage from "./views/UserProfilePage"; import UserProfilePage from "./views/UserProfilePage";
import VerifyYouPages from "./views/VerifyYouPages"; import VerifyYouPages from "./views/VerifyYouPages";
import VerifyLinkPages from "./views/VerifyLinkPages";
import RemindersPage from './views/RemindersPage'; import RemindersPage from './views/RemindersPage';
import TrackingPage from "./views/TrackingPage"; import TrackingPage from "./views/TrackingPage";
import CalendarPage from "./views/CalendarPage"; import CalendarPage from "./views/CalendarPage";
@@ -49,8 +49,6 @@ export default function Routers() {
element={<UpdatePasswordPages />} element={<UpdatePasswordPages />}
/> />
<Route exact path="/verify-you" element={<VerifyYouPages />} /> <Route exact path="/verify-you" element={<VerifyYouPages />} />
<Route exact path="/verify-link" element={<VerifyLinkPages />} />
<Route path={`/vemail?`} element={<VerifyLinkPages />} />
{/* private route */} {/* private route */}
<Route element={<AuthRoute />}> <Route element={<AuthRoute />}>
+1 -1
View File
@@ -97,7 +97,7 @@ export default function Login() {
<img src={WrenchBoard} alt="wrenchboard" className="h-10 mx-auto" /> <img src={WrenchBoard} alt="wrenchboard" className="h-10 mx-auto" />
</Link> </Link>
</div> </div>
<div className="content-wrapper login shadow-md w-full lg:max-w-[500px] mx-auto flex justify-center items-center dark:bg-dark-white 2xl:w-[828px] rounded-[0.475rem] sm:p-7 p-5"> <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">
<div className="w-full"> <div className="w-full">
<div className="title-area flex flex-col justify-center items-center relative text-center mb-7"> <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" style={{ <h1 className="text-[#181c32] font-semibold dark:text-white mb-3" style={{
+15 -9
View File
@@ -37,7 +37,7 @@ export default function SignUp() {
const navigate = useNavigate(); const navigate = useNavigate();
const userApi = new usersService(); const userApi = new usersService();
// Get Country Api // Get Country Api
const getCountryList = async () => { const getCountryList = async () => {
const res = await userApi.getSignupCountryData() const res = await userApi.getSignupCountryData()
@@ -63,7 +63,6 @@ export default function SignUp() {
try { try {
if (email !== '' && password !== '' && first_name !== '' && last_name !== '') { if (email !== '' && password !== '' && first_name !== '' && last_name !== '') {
setSignUpLoading(true)
const reqData = { const reqData = {
country: country, country: country,
firstname: first_name, firstname: first_name,
@@ -76,6 +75,7 @@ export default function SignUp() {
} }
const res = await userApi.CreateUser(reqData) const res = await userApi.CreateUser(reqData)
setSignUpLoading(true)
if (res.status === 200) { if (res.status === 200) {
const { data } = res const { data } = res
@@ -83,19 +83,24 @@ export default function SignUp() {
setMsgError('This account has been already created') setMsgError('This account has been already created')
setSignUpLoading(false) setSignUpLoading(false)
} }
if (data && data.status == 1) { if (data.status > 0 && data.internal_return == 100 && data.session != '') {
localStorage.setItem("email", `${data.email}`);
localStorage.setItem("country", `${data.country}`);
localStorage.setItem("firstname", `${data.firstname}`);
localStorage.setItem("lastname", `${data.lastname}`);
setTimeout(() => { setTimeout(() => {
navigate("/verify-you", { replace: true }); navigate("/", { replace: true });
setSignUpLoading(false) setSignUpLoading(false)
}, 2000) }, 2000)
} else { } else {
setMsgError(data.status)
setSignUpLoading(false) setSignUpLoading(false)
} }
} else {
setMsgError('This account does not exist')
setSignUpLoading(false)
} }
} else {
setMsgError('This account does not exist')
setSignUpLoading(false)
} }
} catch (error) { } catch (error) {
throw new Error(error) throw new Error(error)
@@ -239,7 +244,8 @@ export default function SignUp() {
<button <button
type="button" type="button"
onClick={handleSignUp} onClick={handleSignUp}
className={`rounded-[0.475rem] mb-6 text-xl text-white flex justify-center bg-[#4687ba] hover:bg-[#009ef7] transition-all duration-300 items-center h-[42px] py-[0.8875rem] px-[1.81rem]`} className={`rounded-[0.475rem] mb-6 text-xl text-white flex justify-center bg-[#4687ba] hover:bg-[#009ef7] transition-all duration-300 items-center h-[42px] py-[0.8875rem] px-[1.81rem] ${signUpLoading ? "active" : ""
}`}
> >
{signUpLoading ? ( {signUpLoading ? (
<div className="signup btn-loader"></div> <div className="signup btn-loader"></div>
@@ -1,143 +0,0 @@
import { useEffect, useState, useCallback } from "react";
import { useLocation, Link, useNavigate } from "react-router-dom";
import AuthLayout from "../AuthLayout";
import InputCom from "../../Helpers/Inputs/InputCom";
import usersService from "../../../services/UsersService";
import WrenchBoard from "../../../assets/images/wrenchboard.png"
export default function VerifyLink() {
const [pageLoader, setPageLoader] = useState(true)
const [linkSuccess, setLinkSuccess] = useState(false)
const [linkError, setLinkError] = useState(false)
const navigate = useNavigate()
const location = useLocation();
const queryParams = new URLSearchParams(location?.search)
const token = queryParams.get('vlink')
const verifyEmail = useCallback(
async (code) => {
const userApi = new usersService()
try {
const verifyRes = await userApi.verifyEmail(code)
console.log(verifyRes)
if (verifyRes.status === 200) {
let { data } = verifyRes
if (data && data.internal_return === 0 && data.status_text == 'Link Verfied') {
setPageLoader(false)
setLinkSuccess(true)
} else {
setPageLoader(false)
setLinkError(true)
}
}
} catch (error) {
console.log(error)
setPageLoader(false)
setLinkError(true)
throw new Error(error)
}
}, [linkSuccess, linkError]
)
useEffect(() => {
verifyEmail(token)
}, [])
console.log(token)
return (
<>
<AuthLayout
slogan="Welcome to WrenchBoard"
>
{pageLoader ? (
<img src={WrenchBoard} alt="wrenchboard" className="h-10 mx-auto" />
) : (
<div className="w-full">
<div className='mb-12'>
<Link to='#'>
<img src={WrenchBoard} alt="wrenchboard" className="h-10 mx-auto" />
</Link>
</div>
<div className="content-wrapper login shadow-md w-full lg:max-w-[500px] mx-auto flex justify-center items-center dark:bg-dark-white 2xl:w-[828px] rounded-[0.475rem] sm:p-7 p-5">
<div className="w-full">
<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" style={{
fontSize: 'calc(1rem + .6vw)'
}}>
{linkError && 'Invalid verification link'}
{linkSuccess && 'Sign In to WrenchBoard'}
</h1>
</div>
{/* If the verification was a success */}
{linkSuccess && <SuccessfulComponent />}
{/* If the verification was unsuccessful */}
{linkError && <ErrorComponent onClick={() => navigate('/login')} />}
</div>
</div>
</div>
)}
</AuthLayout>
</>
)
}
const SuccessfulComponent = ({ onClick }) => (
<div className="input-area">
{/* INPUT */}
<div className="mb-5">
<InputCom
// value={password}
// inputHandler={handlePassword}
placeholder="support@mermsemr.com"
label="Email"
name="email"
type="email"
iconName="message"
/>
</div>
<div className="mb-5">
<InputCom
// value={password}
// inputHandler={handlePassword}
placeholder="● ● ● ● ● ●"
label="Password"
name="password"
type="password"
iconName="password"
/>
</div>
<div className="signin-area mb-3.5">
<button
onClick={onClick}
type="button"
className={`btn-login rounded-[0.475rem] mb-6 text-xl text-white flex justify-center bg-[#4687ba] hover:bg-[#009ef7] transition-all duration-300 items-center $`}
>
<span>Continue</span>
</button>
</div>
</div>
)
const ErrorComponent = ({ onClick }) => (
<div className="input-area">
<div className="my-5">
<p className="text-[14px] leading-[19px] text-center text-[#181c32]">
This error occurs because you have already verified this link or the link has expired. Try login or reset password. If none worked, try to create the account from the start.
</p>
</div>
<div className="signin-area flex justify-center mb-3.5">
<button
onClick={onClick}
type="button"
className={`rounded-[0.475rem] mb-6 text-[1.15rem] 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.81rem]`}
>
<span>Return Home</span>
</button>
</div>
</div>
)
+25 -15
View File
@@ -1,5 +1,7 @@
import React from "react";
import titleShape from "../../../assets/images/shape/text-shape-three.svg";
import AuthLayout from "../AuthLayout"; import AuthLayout from "../AuthLayout";
import InputCom from "../../Helpers/Inputs/InputCom"; import Otp from "./Otp";
export default function VerifyYou() { export default function VerifyYou() {
return ( return (
@@ -7,24 +9,32 @@ export default function VerifyYou() {
<AuthLayout <AuthLayout
slogan="Welcome to WrenchBoard" slogan="Welcome to WrenchBoard"
> >
<div className="content-wrapper login dark:bg-dark-white w-full lg:max-w-[500px] 2xl:w-[828px] rounded-xl flex flex-col justify-center sm:p-7 p-5"> <div className="content-wrapper xl:bg-white dark:bg-dark-white w-full sm:w-auto px-5 xl:px-[70px] 2xl:px-[100px] h-[818px] rounded-xl flex flex-col justify-center">
<div className="w-full"> <div>
<div className="title-area flex flex-col justify-center items-center relative text-center mb-7"> <div className="title-area flex flex-col justify-center items-center relative text-center mb-8">
<h1 className="text-[#181c32] font-semibold dark:text-white mb-3" style={{ <h1 className="sm:text-5xl text-4xl font-bold leading-[74px] text-dark-gray dark:text-white">
fontSize: 'calc(1rem + .6vw)' Verification Code
}}>
Verification Sent
</h1> </h1>
<div className="shape sm:w-[377px] w-[270px] -mt-5 ml-5">
<img src={titleShape} alt="shape" />
</div>
</div> </div>
<div className="input-area"> <div className="input-area">
<div className="mb-5"> <Otp />
<p className="text-[14px] leading-[19px] text-center text-[#181c32]"> <div className="signin-area mb-3.5">
To complete the verification process, you should check your email inbox and look for the verification email. It may take a few minutes for the email to arrive, so be patient. Once you receive the email, open it and click on the verification link provided. <a
</p> 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"
>
Continue
</a>
</div> </div>
<div className="mb-5"> <div className="resend-code flex justify-center">
<p className="text-[14px] leading-[19px] text-center text-[#181c32]"> <p className="text-lg text-thin-light-gray font-normal">
If you haven't received the verification email after a reasonable amount of time, make sure to check your spam or junk mail folder. It's also possible that the email was sent to the wrong email address, so double-check that you entered your email address correctly. Dontt have an aceount ?
<a href="#" className="ml-2 text-dark-gray dark:text-white font-bold">
Please resend
</a>
</p> </p>
</div> </div>
</div> </div>
@@ -1,4 +1,4 @@
import React, { useRef } from "react"; import React from "react";
import Icons from "../../Icons"; import Icons from "../../Icons";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
@@ -16,67 +16,18 @@ export default function InputCom({
disable, disable,
blurHandler, blurHandler,
}) { }) {
const inputRef = useRef(null)
// Entry Validation
// for Min Length:
const minLengthValidation = () => {
if (inputRef && inputRef?.current && inputRef?.current?.name == 'email') {
return 7
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'first_name') {
return 3
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'last_name') {
return 3
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'address') {
return 5
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'password') {
return 8
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'state') {
return 3
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'province') {
return 3
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'city') {
return 3
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'amount') {
return 1
}
}
// for MaxLength
const maxLengthValidation = () => {
if (inputRef && inputRef?.current && inputRef?.current?.name == 'email') {
return 35
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'first_name') {
return 25
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'last_name') {
return 25
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'address') {
return 49
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'password') {
return 15
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'state') {
return 25
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'province') {
return 25
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'city') {
return 25
} else if (inputRef && inputRef?.current && inputRef?.current?.name == 'amount') {
return 9
}
}
console.log(inputRef.current?.name, inputRef.current?.minLength)
return ( return (
<div className="input-com"> <div className="input-com">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
{label && ( {label && (
<label <label
className="input-label text-[#181c32] dark:text-white text-base font-semibold block mb-2.5" className="input-label text-[#181c32] dark:text-white text-base font-semibold block mb-2.5"
htmlFor={name} htmlFor={name}
> >
{label} {label}
</label> </label>
)} )}
{forgotPassword && <Link to="/forgot-password" className="text-base text-[#4687ba] hover:text-[#009ef7]">Forgot Password?</Link>} {forgotPassword && <Link to="/forgot-password" className="text-base text-[#4687ba] hover:text-[#009ef7]">Forgot Password?</Link>}
</div> </div>
<div className="input-wrapper border border-[#f5f8fa]] dark:border-[#5e6278] w-full rounded-[0.475rem] h-[42px] overflow-hidden relative font-medium leading-6 bg-clip-padding text-[#5e6278] dark:text-gray-100 bg-[#f5f8fa] dark:bg-[#5e6278] text-base "> <div className="input-wrapper border border-[#f5f8fa]] dark:border-[#5e6278] w-full rounded-[0.475rem] h-[42px] overflow-hidden relative font-medium leading-6 bg-clip-padding text-[#5e6278] dark:text-gray-100 bg-[#f5f8fa] dark:bg-[#5e6278] text-base ">
<input <input
@@ -88,9 +39,6 @@ export default function InputCom({
id={name} id={name}
name={name} name={name}
readOnly={disable} readOnly={disable}
minLength={minLengthValidation()}
maxLength={maxLengthValidation()}
ref={inputRef}
onBlur={blurHandler} onBlur={blurHandler}
/> />
{iconName && ( {iconName && (
+246 -176
View File
@@ -2,12 +2,68 @@ import React, {useEffect, useState} from 'react'
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
import Icons from '../Helpers/Icons' import Icons from '../Helpers/Icons'
import usersService from '../../services/UsersService' import usersService from '../../services/UsersService'
import InputCom from '../Helpers/Inputs/InputCom'
import {Formik, Form} from 'formik'
import * as Yup from 'yup'
const validationSchema = Yup.object().shape({
firstname: Yup.string()
.min(3, 'Minimum 3 characters')
.max(25, 'Maximum 25 characters')
.required('Firstname is required'),
lastname: Yup.string()
.min(3, 'Minimum 3 characters')
.max(25, 'Maximum 25 characters')
.required('Lastname is required'),
country: Yup.string()
.min(1, 'Minimum 3 characters')
.max(25, 'Maximum 25 characters')
.required('Country is required'),
bank: Yup.string()
.min(3, 'Minimum 3 characters')
.max(25, 'Maximum 25 characters')
.required('Bank name is required'),
accountNumber: Yup.string()
.min(3, 'Minimum 3 characters')
.max(25, 'Maximum 25 characters')
.required('Account Number is required'),
repeatAccountNumber: Yup.string()
.min(3, 'Minimum 3 characters')
.max(25, 'Maximum 25 characters')
.required('Repeat Password is required'),
accountType: Yup.string()
.min(3, 'Minimum 3 characters')
.max(25, 'Maximum 25 characters')
.required('Account Type is required'),
city: Yup.string()
.min(3, 'Minimum 3 characters')
.max(25, 'Maximum 25 characters')
.required('City is required'),
state: Yup.string()
.min(3, 'Minimum 3 characters')
.max(25, 'Maximum 25 characters')
.required('State is required'),
})
const initialValues = {
firstname: '',
lastname: '',
country: '',
bank: '',
accountNumber: '',
repeatAccountNumber: '',
accountType: '',
state: '',
city: ''
}
function AddRecipient() { function AddRecipient() {
const apiURL = new usersService() const apiURL = new usersService()
let [countries, setCountries] = useState({ // STATE TO HOLD LIST OF COUNTRIES let [allCountries, setAllCountries] = useState({ // STATE TO HOLD LIST OF COUNTRIES
loading: true, loading: true,
data: [] data: []
}) })
@@ -17,60 +73,29 @@ function AddRecipient() {
data: [] data: []
}) })
let [accountType, setAccountType] = useState({ // STATE TO HOLD LIST ACCOUNT TYPE let [accType, setAccType] = useState({ // STATE TO HOLD LIST ACCOUNT TYPE
loading: true, loading: true,
data: [] data: []
}) })
//STATE FOR CONTROLLED INPUTS
let [inputs, setInputs] = useState({
firstname: '',
lastname: '',
country: '',
'bank-name': '',
'account-number': '',
'repeat-account-number': '',
'account-type': '',
state: '',
city: ''
})
// FUNCTION TO HANDLE INPUT CHANGE
const handleChange = ({target:{name, value}}) => {
setInputs(prev => ({...prev, [name]:value}))
}
//FUNCTION TO HANDLE SUBMIT //FUNCTION TO HANDLE SUBMIT
const handleSubmit = (e) => { const handleSubmit = (values, helpers) => {
e.preventDefault(); // setRequestState({message: '', loading: true, status: false})
console.log('working')
//valid inputs before submitting. Just for texting remove later //valid inputs before submitting. Just for texting remove later
// RETURN INPUTS TO EMPTY STRING
setInputs({
firstname: '',
lastname: '',
country: '',
'bank-name': '',
'account-number': '',
'repeat-account-number': '',
'account-type': '',
state: '',
city: ''
})
} }
// FUNCTION TO GET COUNTRIES // FUNCTION TO GET COUNTRIES
const getCountry = ()=> { const getCountry = ()=> {
apiURL.getSignupCountryData().then((res)=>{ apiURL.getSignupCountryData().then((res)=>{
if(res.data.internal_return < 0){ if(res.data.internal_return < 0){
setCountries(prev => ({loading: false, data: []})) setAllCountries(prev => ({loading: false, data: []}))
return return
} }
setCountries(prev => ({loading: false, data:res.data.signup_country})) setAllCountries(prev => ({loading: false, data:res.data.signup_country}))
}).catch((error)=>{ }).catch((error)=>{
setCountries(prev => ({loading: false, data: []})) setAllCountries(prev => ({loading: false, data: []}))
}) })
} }
// END OF FUNCTION TO GET COUNTRIES // END OF FUNCTION TO GET COUNTRIES
@@ -93,12 +118,12 @@ function AddRecipient() {
const getAccountTypes = ()=> { const getAccountTypes = ()=> {
apiURL.getAccountTypes().then((res)=>{ apiURL.getAccountTypes().then((res)=>{
if(res.data.internal_return < 0){ if(res.data.internal_return < 0){
setAccountType(prev => ({loading: false, data: []})) setAccType(prev => ({loading: false, data: []}))
return return
} }
setAccountType(prev => ({loading: false, data:res.data.result_list})) setAccType(prev => ({loading: false, data:res.data.result_list}))
}).catch((error)=>{ }).catch((error)=>{
setAccountType(prev => ({loading: false, data: []})) setAccType(prev => ({loading: false, data: []}))
}) })
} }
// END OF FUNCTION TO GET ACCOUNT TYPES // END OF FUNCTION TO GET ACCOUNT TYPES
@@ -113,148 +138,193 @@ function AddRecipient() {
<div className="content-wrapper w-full lg:flex xl:space-x-8 lg:space-x-4 bottomMargin"> <div className="content-wrapper w-full lg:flex xl:space-x-8 lg:space-x-4 bottomMargin">
<div className="w-full mb-10 lg:mb-0"> <div className="w-full mb-10 lg:mb-0">
<div className="w-full md:p-8 p-4 bg-white dark:bg-dark-white rounded-2xl shadow"> <div className="w-full md:p-8 p-4 bg-white dark:bg-dark-white rounded-2xl shadow">
<h2 className='my-4 text-slate-900 dark:text-white text-xl lg:text-2xl font-semibold'>ADD BANK ACCOUNT</h2> <h2 className='my-4 text-slate-900 dark:text-white text-xl lg:text-2xl font-semibold'>ADD BANK ACCOUNT</h2>
<form className='add-recipient-info px-1 md:px-[50px] lg:px-[100px]' onSubmit={handleSubmit}> <Formik initialValues={initialValues} validationSchema={validationSchema} onSubmit={handleSubmit}>
{(props)=>(
{/* inputs starts here */} <Form className='add-recipient-info px-1 md:px-[50px] lg:px-[100px]'>
<div className='add-recipient my-3 md:flex items-center justify-between'>
<label className='w-full md:w-1/4 text-slate-600 text-lg'>First Name <span className='text-red-500'>*</span></label> {/* inputs starts here */}
<input className='w-full md:w-3/4 p-3 text-slate-500 text-lg bg-slate-100 rounded-md outline-0 placeholder:text-slate-500 placeholder:text-lg' {/* firstname */}
value={inputs.firstname} <div className="xl:flex xl:space-x-7 mb-6">
name='firstname' <div className="field w-full mb-6 xl:mb-0">
type="text" <InputCom
placeholder='Account Firstname' label="Firstname"
required type="text"
onChange={handleChange} name="firstname"
/> placeholder="Account Firstname"
</div> value={props.values.firstname}
inputHandler={props.handleChange}
blurHandler={props.handleBlur}
/>
{(props.errors.firstname && props.touched.firstname) && <p className="text-sm text-red-500">{props.errors.firstname}</p>}
</div>
<div className='add-recipient my-3 md:flex items-center justify-between'> {/* lastname */}
<label className='w-full md:w-1/4 text-slate-600 text-lg'>Last Name <span className='text-red-500'>*</span></label> <div className="field w-full">
<input className='w-full md:w-3/4 p-3 text-slate-500 text-lg bg-slate-100 rounded-md outline-0 placeholder:text-slate-500 placeholder:text-lg' <InputCom
value={inputs.lastname} label="Lastname"
name='lastname' type="text"
type="text" name="lastname"
placeholder='Account Lastname' placeholder="Account Lastname"
required value={props.values.lastname}
onChange={handleChange} inputHandler={props.handleChange}
/> blurHandler={props.handleBlur}
</div> />
{(props.errors.lastname && props.touched.lastname) && <p className="text-sm text-red-500">{props.errors.lastname}</p>}
</div>
</div>
<div className='add-recipient my-3 md:flex items-center justify-between'>
<label className='w-full md:w-1/4 text-slate-600 text-lg'>Country <span className='text-red-500'>*</span></label> <div className="xl:flex xl:space-x-7 mb-6">
<select className='mt-2 w-full text-slate-500 md:w-3/4 p-3 text-lg bg-white rounded-md border border-slate-300 outline-0' name='country' onChange={handleChange}> {/* country */}
{countries.loading ? <div className='add-recipient w-full mb-6 xl:mb-0'>
<option className='text-slate-500 text-lg' value="">Loading...</option> <label className='input-label text-[#181c32] dark:text-white text-base font-semibold block mb-2.5'>Country <span className='text-red-500'>*</span></label>
: <select className='w-full text-base p-2 text-dark-gray dark:text-white rounded-md border border-slate-300 outline-0' name='country'
countries.data.length ? value={props.values.country}
<> onChange={props.handleChange}
<option className='text-slate-500 text-lg' value="">Select...</option> onBlur={props.handleBlur}
{countries.data.map((item, index)=>( >
<option key={index} className='text-slate-500 text-lg' value={item[0]}>{item[1]}</option> {allCountries.loading ?
))} <option className='text-slate-500 text-lg' value="">Loading...</option>
</> :
: allCountries.data.length ?
<option className='text-slate-500 text-lg' value="">No Options Found! Try Again</option> <>
} <option className='text-slate-500 text-lg' value="">Select...</option>
</select> {allCountries.data.map((item, index)=>(
</div> <option key={index} className='text-slate-500 text-lg' value={item[0]}>{item[1]}</option>
))}
</>
:
<option className='text-slate-500 text-lg' value="">No Options Found! Try Again</option>
}
</select>
{(props.errors.country && props.touched.country) && <p className="text-sm text-red-500">{props.errors.country}</p>}
</div>
{/* bank name */}
<div className='add-recipient w-full'>
<label className='input-label text-[#181c32] dark:text-white text-base font-semibold block mb-2.5'>Bank Name <span className='text-red-500'>*</span></label>
<select className='w-full text-base p-2 text-dark-gray dark:text-white rounded-md border border-slate-300 outline-0' name='bank'
ovalue={props.values.bank}
onChange={props.handleChange}
onBlur={props.handleBlur}
>
{bankName.loading ?
<option className='text-slate-500 text-lg' value="">Loading...</option>
:
bankName.data.length ?
<>
<option className='text-slate-500 text-lg' value="">Select...</option>
{bankName.data.map((item, index)=>(
<option key={index} className='text-slate-500 text-lg' value={item.name}>{item.name}</option>
))}
</>
:
<option className='text-slate-500 text-lg' value="">No Options Found! Try Again</option>
}
</select>
{(props.errors.bank && props.touched.bank) && <p className="text-sm text-red-500">{props.errors.bank}</p>}
</div>
</div>
<div className='add-recipient my-3 md:flex items-center justify-between'> {/* ACCOUNT NUMBER */}
<label className='w-full md:w-1/4 text-slate-600 text-lg'>Bank Name <span className='text-red-500'>*</span></label> <div className="xl:flex xl:space-x-7 mb-6">
<select className='mt-2 w-full text-slate-500 md:w-3/4 p-3 text-lg bg-white rounded-md border border-slate-300 outline-0' name='bank-name' onChange={handleChange}> <div className="field w-full mb-6 xl:mb-0">
{bankName.loading ? <InputCom
<option className='text-slate-500 text-lg' value="">Loading...</option> label="Account Number"
: type="text"
bankName.data.length ? name="accountNumber"
<> placeholder="Account No"
<option className='text-slate-500 text-lg' value="">Select...</option> value={props.values.accountNumber}
{bankName.data.map((item, index)=>( inputHandler={props.handleChange}
<option key={index} className='text-slate-500 text-lg' value={item.name}>{item.name}</option> blurHandler={props.handleBlur}
))} />
</> {(props.errors.accountNumber && props.touched.accountNumber) && <p className="text-sm text-red-500">{props.errors.accountNumber}</p>}
: </div>
<option className='text-slate-500 text-lg' value="">No Options Found! Try Again</option>
}
</select>
</div>
<div className='add-recipient my-3 md:flex items-center justify-between'> {/* REPEAT ACCT. NUMBER */}
<label className='w-full md:w-1/4 text-slate-600 text-lg'>Account Number <span className='text-red-500'>*</span></label> <div className="field w-full">
<input className='w-full md:w-3/4 p-3 text-slate-500 text-lg bg-slate-100 rounded-md outline-0 placeholder:text-slate-500 placeholder:text-lg' <InputCom
value={inputs['account-number']} label="Repeat Account Number"
name='account-number' type="text"
type="text" name="repeatAccountNumber"
placeholder='Account No' placeholder="Repeat Account Number"
required value={props.values.repeatAccountNumber}
onChange={handleChange} inputHandler={props.handleChange}
/> blurHandler={props.handleBlur}
</div> />
{(props.errors.repeatAccountNumber && props.touched.repeatAccountNumber) && <p className="text-sm text-red-500">{props.errors.repeatAccountNumber}</p>}
</div>
</div>
<div className='add-recipient my-3 md:flex items-center justify-between'> <div className="xl:flex xl:space-x-7 mb-6">
<label className='w-full md:w-1/4 text-slate-600 text-lg'>Repeat Account Number <span className='text-red-500'>*</span></label> {/* Account Type */}
<input className='w-full md:w-3/4 p-3 text-slate-500 text-lg bg-slate-100 rounded-md outline-0 placeholder:text-slate-500 placeholder:text-lg' <div className='add-recipient w-full'>
value={inputs['repeat-account-number']} <label className='input-label text-[#181c32] dark:text-white text-base font-semibold block mb-2.5'>Account Type <span className='text-red-500'>*</span></label>
name='repeat-account-number' <select className='w-full text-base p-2 text-dark-gray dark:text-white rounded-md border border-slate-300 outline-0' name='accountType'
type="text" value={props.values.accountType}
placeholder='Repeat Account No' onChange={props.handleChange}
required onBlur={props.handleBlur}
onChange={handleChange} >
/> {accType.loading ?
</div> <option className='text-slate-500 text-lg' value="">Loading...</option>
:
accType.data.length ?
<>
<option className='text-slate-500 text-lg' value="">Select...</option>
{accType.data.map((item, index)=>(
<option key={index} className='text-slate-500 text-lg' value={item.name}>{item.name}</option>
))}
</>
:
<option className='text-slate-500 text-lg' value="">No Options Found! Try Again</option>
}
</select>
{(props.errors.accountType && props.touched.accountType) && <p className="text-sm text-red-500">{props.errors.accountType}</p>}
</div>
</div>
<div className='add-recipient my-3 md:flex items-center justify-between'> {/* state */}
<label className='w-full md:w-1/4 text-slate-600 text-lg'>Account type <span className='text-red-500'>*</span></label> <div className="xl:flex xl:space-x-7 mb-6">
<select className='mt-2 w-full text-slate-500 md:w-3/4 p-3 text-lg bg-white rounded-md border border-slate-300 outline-0' name='account-type' onChange={handleChange}> <div className="field w-full mb-6 xl:mb-0">
{accountType.loading ? <InputCom
<option className='text-slate-500 text-lg' value="">Loading...</option> label="State"
: type="text"
accountType.data.length ? name="state"
<> placeholder="State/Province"
<option className='text-slate-500 text-lg' value="">Select...</option> value={props.values.state}
{accountType.data.map((item, index)=>( inputHandler={props.handleChange}
<option key={index} className='text-slate-500 text-lg' value={item.name}>{item.name}</option> blurHandler={props.handleBlur}
))} />
</> {(props.errors.state && props.touched.state) && <p className="text-sm text-red-500">{props.errors.state}</p>}
: </div>
<option className='text-slate-500 text-lg' value="">No Options Found! Try Again</option>
}
</select>
</div>
<div className='add-recipient my-3 md:flex items-center justify-between'> {/* city */}
<label className='w-full md:w-1/4 text-slate-600 text-lg'>State/Province <span className='text-red-500'>*</span></label> <div className="field w-full">
<input className='w-full md:w-3/4 p-3 text-slate-500 text-lg bg-slate-100 rounded-md outline-0 placeholder:text-slate-500 placeholder:text-lg' <InputCom
value={inputs.state} label="City"
name='state' type="text"
type="text" name="city"
placeholder='State' placeholder="City"
required value={props.values.city}
onChange={handleChange} inputHandler={props.handleChange}
/> blurHandler={props.handleBlur}
</div> />
{(props.errors.city && props.touched.city) && <p className="text-sm text-red-500">{props.errors.city}</p>}
</div>
</div>
<div className='add-recipient my-3 md:flex items-center justify-between'> {/* end of inputs starts here */}
<label className='w-full md:w-1/4 text-slate-600 text-lg'>City <span className='text-red-500'>*</span></label>
<input className='w-full md:w-3/4 p-3 text-slate-500 text-lg bg-slate-100 rounded-md outline-0 placeholder:text-slate-500 placeholder:text-lg'
value={inputs.city}
name='city'
type="text"
placeholder='City'
required
onChange={handleChange}
/>
</div>
{/* end of inputs starts here */} <div className='add-recipient-btn flex justify-end items-center py-4'>
<button type='submit' className='text-lg text-white bg-sky-blue px-4 py-2 hover:opacity-90 rounded-md flex items-center space-x-1'>
<div className='add-recipient-btn flex justify-end items-center py-4'> <span className='pr-2'>ADD RECIPIENT</span>
<button className='text-lg text-white bg-sky-blue px-4 py-2 hover:opacity-90 rounded-md flex items-center space-x-1'> <Icons name="arrows" />
<span className='pr-2'>ADD RECIPIENT</span> </button>
<Icons name="arrows" /> </div>
</button> </Form>
</div> )}
</form> </Formik>
</div> </div>
</div> </div>
+87 -97
View File
@@ -6,12 +6,12 @@ class usersService {
console.log("WRB Service Entry"); console.log("WRB Service Entry");
} }
CreateUser(reqData) { CreateUser(reqData){
localStorage.setItem("session_token", ``); localStorage.setItem("session_token", ``);
return this.postAuxEnd("/createuser", reqData); return this.postAuxEnd("/createuser", reqData);
} }
getHomeDate() { getHomeDate(){
var postData = { var postData = {
uuid: localStorage.getItem("uuid"), uuid: localStorage.getItem("uuid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
@@ -31,8 +31,8 @@ class usersService {
}; };
return this.postAuxEnd("/getjobsdata", postData); return this.postAuxEnd("/getjobsdata", postData);
} }
// //
getUserBankList(reqData) { getUserBankList(reqData){
var postData = { var postData = {
uuid: localStorage.getItem("uuid"), uuid: localStorage.getItem("uuid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
@@ -40,7 +40,7 @@ class usersService {
}; };
return this.postAuxEnd("/mybanklist", postData); return this.postAuxEnd("/mybanklist", postData);
} }
getUserWallets(reqData) { getUserWallets(reqData){
var postData = { var postData = {
uuid: localStorage.getItem("uuid"), uuid: localStorage.getItem("uuid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
@@ -48,51 +48,50 @@ class usersService {
}; };
return this.postAuxEnd("/getwallets", postData); return this.postAuxEnd("/getwallets", postData);
} }
getApiGate() { getApiGate(){
// localStorage.setItem("session_token", ``); // localStorage.setItem("session_token", ``);
return this.postAuxEnd("/apigate", null); return this.postAuxEnd("/apigate", null);
} }
getLoadProfile() { getLoadProfile(){
var postData = { var postData = {
uuid: localStorage.getItem("uid"), uuid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
page: 0, page:0,
limit: 100 limit :100
}; };
return this.postAuxEnd("/loadprofile", null); return this.postAuxEnd("/loadprofile", null);
} }
getOffersList() { getOffersList(){
var postData = { var postData = {
uuid: localStorage.getItem("uid"), uuid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
page: 0, page:0,
limit: 100 limit :100
}; };
return this.postAuxEnd("/offerslist", null); return this.postAuxEnd("/offerslist", null);
} }
getPendingJob() { getPendingJob(){
var postData = { var postData = {
uuid: localStorage.getItem("uid"), uuid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
page: 0, page:0,
limit: 100 limit :100};
};
return this.postAuxEnd("/pendingjob", postData); return this.postAuxEnd("/pendingjob", postData);
} }
getActiveJobList() { getActiveJobList(){
var postData = { var postData = {
uuid: localStorage.getItem("uid"), uuid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
page: 0, page:0,
limit: 100 limit :100
}; };
return this.postAuxEnd("/getjobsdata", postData); return this.postAuxEnd("/getjobsdata", postData);
} }
@@ -113,60 +112,60 @@ class usersService {
uuid: localStorage.getItem("uid"), uuid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
page: 0, page:0,
limit: 100 limit :100
}; };
return this.postAuxEnd("/myjobs", postData); return this.postAuxEnd("/myjobs", postData);
} }
getGetPendingJobs() { getGetPendingJobs(){
var postData = { var postData = {
uuid: localStorage.getItem("uid"), uuid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
page: 0, page:0,
limit: 100 limit :100
}; };
return this.postAuxEnd("/getpendingjobs", postData); return this.postAuxEnd("/getpendingjobs", postData);
} }
getUsersCards() { getUsersCards(){
var postData = { var postData = {
uuid: localStorage.getItem("uid"), uuid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
page: 0, page:0,
limit: 100 limit :100
}; };
return this.postAuxEnd("/userscards", postData); return this.postAuxEnd("/userscards", postData);
} }
getCouponPending() { getCouponPending(){
var postData = { var postData = {
uuid: localStorage.getItem("uid"), uuid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
page: 0, page:0,
limit: 100 limit :100
}; };
return this.postAuxEnd("/couponpending", postData); return this.postAuxEnd("/couponpending", postData);
} }
// API FUNCTION TO GET COUPON HISTORY // API FUNCTION TO GET COUPON HISTORY
getRecipient() { getRecipient(){
var postData = { var postData = {
uid: localStorage.getItem("uid"), uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
page: 1, page:1,
limit: 20, limit :20,
action: 11175 action: 11175
}; };
return this.postAuxEnd("/recipients", postData); return this.postAuxEnd("/recipients", postData);
} }
// API FUNCTION TO GET SEND MONEY FEE // API FUNCTION TO GET SEND MONEY FEE
getSendMoneyFee(amount) { getSendMoneyFee(amount){
var postData = { var postData = {
uid: localStorage.getItem("uid"), uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
@@ -178,95 +177,95 @@ class usersService {
} }
// API FUNCTION TO GET COUPON HISTORY // API FUNCTION TO GET COUPON HISTORY
getCouponHx() { getCouponHx(){
var postData = { var postData = {
uid: localStorage.getItem("uid"), uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
page: 1, page:1,
limit: 20, limit :20,
action: 85025 action: 85025
}; };
return this.postAuxEnd("/couponhx", postData); return this.postAuxEnd("/couponhx", postData);
} }
getPurchaseHx() { getPurchaseHx(){
var postData = { var postData = {
uid: localStorage.getItem("uid"), uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
page: 1, page:1,
limit: 20, limit :20,
action: 15049 action: 15049
}; };
return this.postAuxEnd("/purchasehx", postData); return this.postAuxEnd("/purchasehx", postData);
} }
// API FUNCTION TO GET PAYMENT HISTORY // API FUNCTION TO GET PAYMENT HISTORY
getPaymentHx() { getPaymentHx(){
var postData = { var postData = {
uid: localStorage.getItem("uid"), uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
page: 1, page:1,
limit: 20, limit :20,
action: 15046 action: 15046
}; };
return this.postAuxEnd("/paymenthx", postData); return this.postAuxEnd("/paymenthx", postData);
} }
//END POINT CALL FOR REFERRAL HISTORY //END POINT CALL FOR REFERRAL HISTORY
getReferralHx() { getReferralHx(){
var postData = { var postData = {
uid: localStorage.getItem("uid"), uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
offset: 1, offset: 1,
limit: 100, limit :100,
action: 11064 action: 11064
}; };
return this.postAuxEnd("/refferhx", postData); return this.postAuxEnd("/refferhx", postData);
} }
//END POINT CALL FOR UPDATE PROFILE //END POINT CALL FOR UPDATE PROFILE
updateProfile(post) { updateProfile(post){
var postData = { var postData = {
uid: localStorage.getItem("uid"), uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
action: 5031, action: 5031,
...post ...post
}; };
return this.postAuxEnd("/updateprofile", postData); return this.postAuxEnd("/updateprofile", postData);
} }
//END POINT CALL FOR GETTING USER PROFILE //END POINT CALL FOR GETTING USER PROFILE
loadProfile(post) { loadProfile(post){
var postData = { var postData = {
uid: localStorage.getItem("uid"), uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
}; };
return this.postAuxEnd("/loadprofile", postData); return this.postAuxEnd("/loadprofile", postData);
} }
//END POINT CALL FOR SENDING REFERRAL MESSAGE //END POINT CALL FOR SENDING REFERRAL MESSAGE
sendReferralMsg(postData) { sendReferralMsg(postData){
return this.postAuxEnd("/sendreferral", postData); return this.postAuxEnd("/sendreferral", postData);
} }
StartResetPassword(reqData) { StartResetPassword(reqData){
return this.postAuxEnd("/startresetpasword", reqData) return this.postAuxEnd("/startresetpasword", reqData)
} }
getCouponRedeem() { getCouponRedeem(){
var postData = { var postData = {
uuid: localStorage.getItem("uid"), uuid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
page: 0, page:0,
limit: 100 limit :100
}; };
return this.postAuxEnd("/couponredeem", postData); return this.postAuxEnd("/couponredeem", postData);
} }
@@ -345,17 +344,9 @@ class usersService {
*/ */
getUserReminders() { getUserReminders(){
return this.getAuxEnd("/reminders", null); return this.getAuxEnd("/reminders", null);
} }
verifyEmail(code) {
const reqData = {
verify_link: code,
action: 11015
}
return this.postAuxEnd("/verifysignuplink", reqData);
}
//---------------------------------------- ----- //---------------------------------------- -----
//---------------------------------------- ----- //---------------------------------------- -----
// Unified call below // Unified call below
@@ -371,11 +362,10 @@ class usersService {
} }
}; };
const endPoint = process.env.REACT_APP_USERS_ENDPOINT + uri; const endPoint = process.env.REACT_APP_USERS_ENDPOINT + uri;
return Axios.get(endPoint, { return Axios.get(endPoint,{
params: { params: {
reqData reqData
} }})
})
.then((response) => { .then((response) => {
console.log("~~~~~~~ Toks2 GET ~~~~~~~~"); console.log("~~~~~~~ Toks2 GET ~~~~~~~~");
return response; return response;
@@ -398,22 +388,22 @@ class usersService {
postAuxEnd(uri, reqData) { postAuxEnd(uri, reqData) {
const endPoint = process.env.REACT_APP_USERS_ENDPOINT + uri; const endPoint = process.env.REACT_APP_USERS_ENDPOINT + uri;
const session_token = localStorage.getItem("session_token"); const session_token = localStorage.getItem("session_token");
// session_token = session_token !=null ?session_token : ''; // session_token = session_token !=null ?session_token : '';
// 'Authorization': `Basic ${(session_token !=null) ?session_token : ''}`, // 'Authorization': `Basic ${(session_token !=null) ?session_token : ''}`,
let axiosConfig = { let axiosConfig = {
headers: { headers: {
'Accept': 'application/json', 'Accept': 'application/json',
'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Origin': '*',
'Access-Control-Expose-Headers': 'Access-Control-Allow-Origin', 'Access-Control-Expose-Headers': 'Access-Control-Allow-Origin',
'Access-Control-Allow-Headers': 'Origin, X-API-KEY, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Access-Control-Allow-Headers, Authorization, observe, enctype, Content-Length, X-Csrf-Token', 'Access-Control-Allow-Headers':'Origin, X-API-KEY, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Access-Control-Allow-Headers, Authorization, observe, enctype, Content-Length, X-Csrf-Token',
'Content-Type': 'application/json;charset=UTF-8', 'Content-Type': 'application/json;charset=UTF-8',
} }
}; };
// Axios.defaults.headers.post['Content-Type'] ='application/json;charset=utf-8'; // Axios.defaults.headers.post['Content-Type'] ='application/json;charset=utf-8';
// Axios.defaults.headers.post['Access-Control-Allow-Origin'] = '*'; //,axiosConfig // Axios.defaults.headers.post['Access-Control-Allow-Origin'] = '*'; //,axiosConfig
// Axios.defaults.withCredentials = true; // Axios.defaults.withCredentials = true;
//debugger; //debugger;
return Axios.post(endPoint, reqData) return Axios.post(endPoint, reqData)
.then((response) => { .then((response) => {
console.log(response); console.log(response);
-1
View File
@@ -2,7 +2,6 @@ import React from "react";
import SignUp from "../components/AuthPages/SignUp"; import SignUp from "../components/AuthPages/SignUp";
function SignupPage() { function SignupPage() {
return ( return (
<> <>
<SignUp /> <SignUp />
-7
View File
@@ -1,7 +0,0 @@
import React from "react";
import VerifyLink from "../components/AuthPages/VerifyLink";
export default function VerifyYouPages() {
return <VerifyLink />;
}