Compare commits

...

10 Commits

22 changed files with 1822 additions and 1173 deletions
+2
View File
@@ -14,5 +14,7 @@ services:
- "5173" - "5173"
environment: environment:
- PORT=${DIGIFI_PORT} - PORT=${DIGIFI_PORT}
tty: true
stdin_open: true
volumes: volumes:
src: src:
+1
View File
@@ -15,6 +15,7 @@
"formik": "2.4.5", "formik": "2.4.5",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-icons": "^5.0.1",
"react-redux": "^8.0.5", "react-redux": "^8.0.5",
"react-router-dom": "6.3.0", "react-router-dom": "6.3.0",
"react-select": "^5.8.0", "react-select": "^5.8.0",
+101 -39
View File
@@ -1,56 +1,118 @@
import { Button, InputCompOne, Stepper } from ".."; import { Button, InputCompOne, Stepper } from "..";
// import { useNavigate } from "react-router-dom"; import {Formik, Form} from 'formik'
// import { RouteHandler } from "../../router/routes"; import * as Yup from "yup";
type Props = { type Props = {
handleNextStep:()=>any handleNextStep:()=>any
} }
const initialValues = {
amount: "",
duration: "",
id: "",
};
// To get the validation schema
const validationSchema = Yup.object().shape({
duration: Yup.string()
.required("Required"),
amount: Yup.string()
.required("Required")
.test("no-e", "Invalid", (value:any) => {
if (value && /^[0-9]*$/.test(value) == false) {
return false;
}
return true;
}),
id: Yup.string()
.required("Required")
});
export default function DashboardFormInit({handleNextStep}:Props) { export default function DashboardFormInit({handleNextStep}:Props) {
// let navigate = useNavigate(); //FUNCTION TO HANDLE SUBMIT
// const navigateToProfile = () => navigate(RouteHandler.dashboardProfile); const handleSubmit = (values:any) => {
console.log(values)
handleNextStep()
};
return ( return (
<div className="w-full"> <div className="w-full">
<div className="w-full flex justify-center"> <div className="w-full flex justify-center">
<Stepper step={0} /> <Stepper step={0} />
</div> </div>
<div className="mt-[3.25rem] flex flex-col gap-9"> <Formik
<InputCompOne initialValues={initialValues}
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" validationSchema={validationSchema}
name="applyIshInput" onSubmit={handleSubmit}
label="How Much Do You Want To Apply For?" >
labelClass="font-bold text-[1.125rem]" {(props)=>(
input <Form>
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" <div className="mt-[3.25rem] flex flex-col gap-9">
placeholder="350,000" <InputCompOne
/> parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
<InputCompOne name="amount"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" label="How Much Do You Want To Apply For?"
name="applyIshInput" labelClass="font-bold text-[1.125rem]"
label="For How Many Months?" input
labelClass="font-bold text-[1.125rem]" inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem] text-right"
input placeholder="350,000"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" value={props.values.amount}
placeholder="12 Months" onChange={props.handleChange}
/> error={(props.errors.amount && props.touched.amount) ? props.errors.amount : ''}
<InputCompOne />
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" <InputCompOne
name="applyIshInput" parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
label="Direct sales agent ID ( Optional )" name="duration"
labelClass="font-bold text-[1.125rem]" label="For How Many Months?"
input labelClass="font-bold text-[1.125rem]"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" select={true}
placeholder="Agent ID" selectClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
/> selectOptions={duration}
<Button selectValue={props.values.duration}
className="my-8 max-w-[25.875rem] btn-Y text-black w-full h-11" onChange={props.handleChange}
text="Next" error={(props.errors.duration && props.touched.duration) ? props.errors.duration : ''}
type="button" />
onClick={handleNextStep} <InputCompOne
/> parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
</div> name="id"
label="Direct sales agent ID ( Optional )"
labelClass="font-bold text-[1.125rem]"
floatLabel='Enter agent ID'
input
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
placeholder="Agent ID"
value={props.values.id}
onChange={props.handleChange}
error={(props.errors.id && props.touched.id) ? props.errors.id : ''}
/>
<Button
className="my-8 max-w-[25.875rem] btn-Y text-black w-full h-11"
text="Next"
type="submit"
/>
</div>
</Form>
)}
</Formik>
</div> </div>
); );
} }
interface SelectOption {
loading: boolean;
data: {value: string;
label: string}[]
}
const duration: SelectOption = {
loading: false,
data: [
{ value: "", label: "Please Select" },
{ value: "6", label: "6 Months" },
{ value: "12", label: "12 Months" },
{ value: "18", label: "18 Months" },
{ value: "24", label: "24 Months" },
]
}
@@ -1,4 +1,7 @@
import { Button, InputCompOne, Stepper } from '../../shared/index'; import { Button, InputCompOne, Stepper } from '../../shared/index';
import {Formik, Form} from 'formik'
import * as Yup from "yup";
// import { useNavigate } from "react-router-dom"; // import { useNavigate } from "react-router-dom";
// import { RouteHandler } from '../../../router/routes'; // import { RouteHandler } from '../../../router/routes';
@@ -6,41 +9,81 @@ type Props = {
handleNextStep:()=>any handleNextStep:()=>any
} }
const initialValues = {
account_number: "",
checked: false
};
// To get the validation schema
const validationSchema = Yup.object().shape({
account_number: Yup.string()
.required("Required"),
checked: Yup.bool() // use bool instead of boolean
.oneOf([true], "You must accept the terms and conditions")
});
export default function DashboardHomeAttestation({handleNextStep}:Props) { export default function DashboardHomeAttestation({handleNextStep}:Props) {
// let navigate = useNavigate(); // let navigate = useNavigate();
// const navigateToProfile = () => navigate(RouteHandler.dashboardProfile); // const navigateToProfile = () => navigate(RouteHandler.dashboardProfile);
//FUNCTION TO HANDLE SUBMIT
const handleSubmit = (values:any) => {
console.log(values)
handleNextStep()
};
return ( return (
<div className="w-full"> <div className="w-full">
<div className="w-full flex justify-center"> <div className="w-full flex justify-center">
<Stepper step={4} /> <Stepper step={4} />
</div> </div>
<div className="mt-[3.25rem] flex flex-col gap-9"> <p className='my-10 text-red-500 text-lg md:text-2xl'>Applicant's Attestation and Debit Instruction</p>
<p className='text-red-500 text-lg md:text-2xl'>Applicant's Attestation and Debit Instruction</p> <p className='text-red-500 text-base'>NB: Must be your FCMB account number</p>
<p className='text-red-500 text-base'>NB: Must be your FCMB account number</p> <Formik
<div className="flex items-center gap-[4.125rem]"> initialValues={initialValues}
<InputCompOne validationSchema={validationSchema}
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" onSubmit={handleSubmit}
name="applyIshInput" >
label="Disbursement account number" {(props)=>(
labelClass="font-bold text-[1.125rem]" <Form>
input <div className="flex flex-col gap-9">
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" <div className="flex items-center gap-[4.125rem]">
placeholder="0102547896" <InputCompOne
/> parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
</div> name="account_number"
<div className='max-w-[25.875rem] flex gap-4 items-start'> floatLabel="Disbursement account number"
<input type='checkbox' className='w-4 h-4 p-2 accent-purple-600 text-purple-600 bg-gray-100 border-gray-300 rounded focus:ring-purple-500' /> // labelClass="font-bold text-[1.125rem]"
<p className='text-[12px] text-justify'>By pressing, you agree that you have read, understood and accept the <span className='text-blue-600'>applicatant's attestation</span> and <span className='text-blue-600'>terms and conditions</span> for FCMB input
premium salary loan. You also give us permission to collect financial information and run credit checks on the account provided through our partners inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
</p> placeholder="0102547896"
</div> value={props.values.account_number}
<Button onChange={props.handleChange}
className="my-8 max-w-[25.875rem] btn-Y text-black w-full h-11" error={(props.errors.account_number && props.touched.account_number) ? props.errors.account_number : ''}
text="Apply" />
type="button" </div>
onClick={handleNextStep} <div className='max-w-[25.875rem]'>
/> <div className='flex gap-4 items-start'>
</div> <input
type='checkbox'
name="checked"
className='w-4 h-4 p-2 accent-purple-600 text-purple-600 bg-gray-100 border-gray-300 rounded focus:ring-purple-500'
onChange={props.handleChange}
/>
<p className='text-[12px] text-justify'>By pressing, you agree that you have read, understood and accept the <span className='text-blue-600'>applicatant's attestation</span> and <span className='text-blue-600'>terms and conditions</span> for FCMB
premium salary loan. You also give us permission to collect financial information and run credit checks on the account provided through our partners
</p>
</div>
{props.errors.checked && props.touched.checked && <span className='text-[10px] text-red-500'>{props.errors.checked}</span>}
</div>
<Button
className="my-8 max-w-[25.875rem] btn-Y text-black w-full h-11"
text="Apply"
type="submit"
/>
</div>
</Form>
)}
</Formik>
</div> </div>
); );
} }
@@ -1,72 +1,166 @@
import { Button, InputCompOne, Stepper } from '../../shared/index'; import { Button, InputCompOne, Stepper } from '../../shared/index';
import {Formik, Form} from 'formik'
import * as Yup from "yup";
type Props = { type Props = {
handleNextStep:()=>any handleNextStep:()=>any
} }
const initialValues = {
gender: "",
address: "",
marital_status: "",
state: "",
email:""
};
// To get the validation schema
const validationSchema = Yup.object().shape({
gender: Yup.string()
.required("Required"),
address: Yup.string()
.required("Required"),
marital_status: Yup.string()
.required("Required"),
state: Yup.string()
.required("Required"),
email: Yup.string()
.email("Invalid")
.required("Required"),
});
export default function DashboardHomeDetail({handleNextStep}:Props) { export default function DashboardHomeDetail({handleNextStep}:Props) {
//FUNCTION TO HANDLE SUBMIT
const handleSubmit = (values:any) => {
console.log(values)
handleNextStep()
};
return ( return (
<div className="w-full"> <div className="w-full">
<div className="w-full flex justify-center"> <div className="w-full flex justify-center">
<Stepper step={1} /> <Stepper step={1} />
</div> </div>
<div className="mt-[3.25rem] flex flex-col gap-9"> <Formik
<div className="flex items-center gap-[4.125rem]"> initialValues={initialValues}
<InputCompOne validationSchema={validationSchema}
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" onSubmit={handleSubmit}
name="applyIshInput" >
label="Select your gender" {(props)=>(
labelClass="font-bold text-[1.125rem]" <Form>
input <div className="mt-[3.25rem] flex flex-col gap-9">
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" <div className="flex items-center gap-[4.125rem]">
placeholder="Male" <InputCompOne
/> parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
<InputCompOne name="gender"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" label="Select your gender"
name="applyIshInput" labelClass="font-bold text-[1.125rem]"
label="Residential address" select={true}
labelClass="font-bold text-[1.125rem]" selectClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
input selectOptions={gender}
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" selectValue={props.values.gender}
placeholder="Somewhere in lagos" onChange={props.handleChange}
/> error={(props.errors.gender && props.touched.gender) ? props.errors.gender : ''}
</div> />
<div className="flex items-center gap-[4.125rem]"> <InputCompOne
<InputCompOne parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" name="address"
name="applyIshInput" label="Residential address"
label="Marital status" labelClass="font-bold text-[1.125rem]"
labelClass="font-bold text-[1.125rem]" input
input inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" placeholder="Somewhere in lagos"
placeholder="Single" value={props.values.address}
/>{" "} onChange={props.handleChange}
<InputCompOne error={(props.errors.address && props.touched.address) ? props.errors.address : ''}
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" />
name="applyIshInput" </div>
label="Select your state" <div className="flex items-center gap-[4.125rem]">
labelClass="font-bold text-[1.125rem]" <InputCompOne
input parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" name="marital_status"
placeholder="Lagos" label="Marital status"
/> labelClass="font-bold text-[1.125rem]"
</div> select={true}
<InputCompOne selectClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" selectOptions={maritalStatus}
name="applyIshInput" selectValue={props.values.marital_status}
label="Email address" onChange={props.handleChange}
labelClass="font-bold text-[1.125rem]" error={(props.errors.marital_status && props.touched.marital_status) ? props.errors.marital_status : ''}
input />
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" <InputCompOne
placeholder="johndoe@gmail.com" parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
/> name="state"
<Button label="Select your state"
className="my-8 max-w-[25.875rem] btn-Y text-black w-full h-11" labelClass="font-bold text-[1.125rem]"
text="Next" select={true}
type="button" selectClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
onClick={handleNextStep} selectOptions={state}
/> selectValue={props.values.state}
</div> onChange={props.handleChange}
error={(props.errors.state && props.touched.state) ? props.errors.state : ''}
/>
</div>
<InputCompOne
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
name="email"
label="Email address"
labelClass="font-bold text-[1.125rem]"
input
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
placeholder="johndoe@gmail.com"
value={props.values.email}
onChange={props.handleChange}
error={(props.errors.email && props.touched.email) ? props.errors.email : ''}
/>
<Button
className="my-8 max-w-[25.875rem] btn-Y text-black w-full h-11"
text="Next"
type="submit"
/>
</div>
</Form>
)}
</Formik>
</div> </div>
); );
} }
interface SelectOption {
loading: boolean;
data: {value: string;
label: string}[]
}
const gender: SelectOption = {
loading: false,
data: [
{ value: "", label: "Please Select" },
{ value: "male", label: "Male" },
{ value: "female", label: "Female" },
{ value: "others", label: "Prefer not to say" },
]
}
const maritalStatus: SelectOption = {
loading: false,
data: [
{ value: "", label: "Please Select" },
{ value: "single", label: "Single" },
{ value: "married", label: "Married" },
{ value: "divorced", label: "Divorced" },
]
}
const state: SelectOption = {
loading: false,
data: [
{ value: "", label: "Please Select" },
{ value: "abia", label: "Abia" },
{ value: "imo", label: "Imo" },
{ value: "lagos", label: "Lagos" },
]
}
@@ -1,133 +1,275 @@
import { Button, InputCompOne, Stepper } from '../../shared/index'; import { Button, InputCompOne, Stepper } from '../../shared/index';
import {Formik, Form} from 'formik'
import * as Yup from "yup";
type Props = { type Props = {
handleNextStep:()=>any handleNextStep:()=>any
} }
const initialValues = {
job_title: "",
employer_name: "",
job_sector: "",
industry: "",
date_of_resumption: "",
employer_email:"",
annual_income: "",
monthly_salary: "",
salary_payment_date: "",
employee_id: "",
qualification: ""
};
// To get the validation schema
const validationSchema = Yup.object().shape({
job_title: Yup.string()
.required("Required"),
employer_name: Yup.string()
.required("Required"),
job_sector: Yup.string()
.required("Required"),
industry: Yup.string()
.required("Required"),
date_of_resumption: Yup.string()
.required("Required"),
employer_email: Yup.string()
.email("Invalid")
.required("Required"),
annual_income: Yup.string()
.required("Required")
.test("no-e", "Invalid", (value:any) => {
if (value && /^[0-9]*$/.test(value) == false) {
return false;
}
return true;
}),
monthly_salary: Yup.string()
.required("Required")
.test("no-e", "Invalid", (value:any) => {
if (value && /^[0-9]*$/.test(value) == false) {
return false;
}
return true;
}),
salary_payment_date: Yup.string()
.required("Required"),
employee_id: Yup.string()
.required("Required"),
qualification: Yup.string()
.required("Required"),
});
export default function DashboardHomeEmploymentInfo({handleNextStep}:Props) { export default function DashboardHomeEmploymentInfo({handleNextStep}:Props) {
//FUNCTION TO HANDLE SUBMIT
const handleSubmit = (values:any) => {
console.log(values)
handleNextStep()
};
return ( return (
<div className="w-full"> <div className="w-full">
<div className="w-full flex justify-center"> <div className="w-full flex justify-center">
<Stepper step={2} /> <Stepper step={2} />
</div> </div>
<div className="mt-[3.25rem] flex flex-col gap-9"> <Formik
<p className='text-red-500 text-lg md:text-2xl'>Employment Informaton</p> initialValues={initialValues}
<div className="flex items-center gap-[4.125rem]"> validationSchema={validationSchema}
<InputCompOne onSubmit={handleSubmit}
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" >
name="applyIshInput" {(props)=>(
label="Job Title" <Form>
labelClass="font-bold text-[1.125rem]" <div className="mt-[3.25rem] flex flex-col gap-9">
input <p className='text-red-500 text-lg md:text-2xl'>Employment Informaton</p>
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" <div className="flex items-center gap-[4.125rem]">
placeholder="Software Engineer" <InputCompOne
/> parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
<InputCompOne name="job_title"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" floatLabel="Job Title"
name="applyIshInput" // labelClass="font-bold text-[1.125rem]"
label="Employer name" input
labelClass="font-bold text-[1.125rem]" inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
input placeholder="Software Engineer"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" value={props.values.job_title}
placeholder="Mr. Mark John" onChange={props.handleChange}
/> error={(props.errors.job_title && props.touched.job_title) ? props.errors.job_title : ''}
</div> />
<div className="flex items-center gap-[4.125rem]"> <InputCompOne
<InputCompOne parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" name="employer_name"
name="applyIshInput" floatLabel="Employer name"
label="Job Sector" // labelClass="font-bold text-[1.125rem]"
labelClass="font-bold text-[1.125rem]" input
input inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" placeholder="Mr. Mark John"
placeholder="Technology" value={props.values.employer_name}
/> onChange={props.handleChange}
<InputCompOne error={(props.errors.employer_name && props.touched.employer_name) ? props.errors.employer_name : ''}
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" />
name="applyIshInput" </div>
label="Sector" <div className="flex items-center gap-[4.125rem]">
labelClass="font-bold text-[1.125rem]" <InputCompOne
input parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" name="job_sector"
placeholder="Engineering" floatLabel="Job Sector"
/> // labelClass="font-bold text-[1.125rem]"
</div> select={true}
<div className="flex items-center gap-[4.125rem]"> selectClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
<InputCompOne selectOptions={jobSector}
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" selectValue={props.values.job_sector}
name="applyIshInput" onChange={props.handleChange}
label="Date of resumption" error={(props.errors.job_sector && props.touched.job_sector) ? props.errors.job_sector : ''}
labelClass="font-bold text-[1.125rem]" />
input <InputCompOne
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
placeholder="12/12/2015" name="industry"
/> floatLabel="Select your industry"
<InputCompOne // labelClass="font-bold text-[1.125rem]"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" select={true}
name="applyIshInput" selectClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
label="Employers official email" selectOptions={industry}
labelClass="font-bold text-[1.125rem]" selectValue={props.values.industry}
input onChange={props.handleChange}
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" error={(props.errors.industry && props.touched.industry) ? props.errors.industry : ''}
placeholder="example@gmail.com" />
/> </div>
</div> <div className="flex items-center gap-[4.125rem]">
<div className="flex items-center gap-[4.125rem]"> <InputCompOne
<InputCompOne parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" name="date_of_resumption"
name="applyIshInput" floatLabel="Date of resumption"
label="Annual Income" // labelClass="font-bold text-[1.125rem]"
labelClass="font-bold text-[1.125rem]" input
input inputType='date'
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
placeholder="1,200,000" placeholder="12/12/2015"
/> value={props.values.date_of_resumption}
<InputCompOne onChange={props.handleChange}
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" error={(props.errors.date_of_resumption && props.touched.date_of_resumption) ? props.errors.date_of_resumption : ''}
name="applyIshInput" />
label="Net monthly salary" <InputCompOne
labelClass="font-bold text-[1.125rem]" parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
input name="employer_email"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" floatLabel="Employers official email"
placeholder="100,000" // labelClass="font-bold text-[1.125rem]"
/> input
</div> inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
<div className="flex items-center gap-[4.125rem]"> placeholder="example@gmail.com"
<InputCompOne value={props.values.employer_email}
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" onChange={props.handleChange}
name="applyIshInput" error={(props.errors.employer_email && props.touched.employer_email) ? props.errors.employer_email : ''}
label="Salary payment date" />
labelClass="font-bold text-[1.125rem]" </div>
input <div className="flex items-center gap-[4.125rem]">
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" <InputCompOne
placeholder="30th of every month" parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
/>{" "} name="annual_income"
<InputCompOne floatLabel="Annual Income"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" // labelClass="font-bold text-[1.125rem]"
name="applyIshInput" input
label="Employee ID" inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem] text-right"
labelClass="font-bold text-[1.125rem]" placeholder="1,200,000"
input value={props.values.annual_income}
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" onChange={props.handleChange}
placeholder="LS/001/005" error={(props.errors.annual_income && props.touched.annual_income) ? props.errors.annual_income : ''}
/> />
</div> <InputCompOne
<InputCompOne parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" name="monthly_salary"
name="applyIshInput" floatLabel="Net monthly salary"
label="Highest level of education" // labelClass="font-bold text-[1.125rem]"
labelClass="font-bold text-[1.125rem]" input
input inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem] text-right"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" placeholder="100,000"
placeholder="B.sc" value={props.values.monthly_salary}
/> onChange={props.handleChange}
<Button error={(props.errors.monthly_salary && props.touched.monthly_salary) ? props.errors.monthly_salary : ''}
className="my-8 max-w-[25.875rem] btn-Y text-black w-full h-11" />
text="Next" </div>
type="button" <div className="flex items-center gap-[4.125rem]">
onClick={handleNextStep} <InputCompOne
/> parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
</div> name="salary_payment_date"
floatLabel="Salary payment date"
// labelClass="font-bold text-[1.125rem]"
input
inputType='date'
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
placeholder="30th of every month"
value={props.values.salary_payment_date}
onChange={props.handleChange}
error={(props.errors.salary_payment_date && props.touched.salary_payment_date) ? props.errors.salary_payment_date : ''}
/>
<InputCompOne
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
name="employee_id"
floatLabel="Employee ID"
// labelClass="font-bold text-[1.125rem]"
input
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
placeholder="LS/001/005"
value={props.values.employee_id}
onChange={props.handleChange}
error={(props.errors.employee_id && props.touched.employee_id) ? props.errors.employee_id : ''}
/>
</div>
<InputCompOne
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
name="qualification"
floatLabel="Highest level of education"
// labelClass="font-bold text-[1.125rem]"
select={true}
selectClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
selectOptions={qualification}
selectValue={props.values.qualification}
onChange={props.handleChange}
error={(props.errors.qualification && props.touched.qualification) ? props.errors.qualification : ''}
/>
<Button
className="my-8 max-w-[25.875rem] btn-Y text-black w-full h-11"
text="Next"
type="submit"
/>
</div>
</Form>
)}
</Formik>
</div> </div>
); );
} }
interface SelectOption {
loading: boolean;
data: {value: string;
label: string}[]
}
const jobSector: SelectOption = {
loading: false,
data: [
{ value: "", label: "Please Select" },
{ value: "private (non academic)", label: "Private (non academic)" },
]
}
const industry: SelectOption = {
loading: false,
data: [
{ value: "", label: "Please Select" },
{ value: "engineering", label: "Engineering" },
]
}
const qualification: SelectOption = {
loading: false,
data: [
{ value: "", label: "Please Select" },
{ value: "b.sc + professional qualification", label: "B.Sc + Professional Qualification" },
]
}
@@ -1,131 +1,231 @@
import { Button, InputCompOne, Stepper } from '../../shared/index'; import { Button, InputCompOne, Stepper } from '../../shared/index';
import {Formik, Form} from 'formik'
import * as Yup from "yup";
type Props = { type Props = {
handleNextStep:()=>any handleNextStep:()=>any
} }
const initialValues = {
ref_name: "",
ref_email: "",
ref_number: "",
ref_relationship: "",
ref_bvn: "",
ref_two_name: "",
ref_two_email: "",
ref_two_number: "",
ref_two_relationship: "",
ref_two_bvn: "",
};
// To get the validation schema
const validationSchema = Yup.object().shape({
ref_name: Yup.string()
.required("Required"),
ref_email: Yup.string()
.email("Invalid")
.required("Required"),
ref_number: Yup.string()
.required("Required"),
ref_relationship: Yup.string()
.required("Required"),
ref_bvn: Yup.string()
.required("BVN is required")
.test("no-e", "Invalid number", (value:any) => {
if (value && /^[0-9]*$/.test(value) == false) {
return false;
}
return true;
})
.min(11, "must be 11 digits")
.max(11, "must be 11 digits"),
ref_two_name: Yup.string()
.required("Required"),
ref_two_email: Yup.string()
.email("Invalid")
.required("Required"),
ref_two_number: Yup.string()
.required("Required"),
ref_two_relationship: Yup.string()
.required("Required"),
ref_two_bvn: Yup.string()
.required("BVN is required")
.test("no-e", "Invalid number", (value:any) => {
if (value && /^[0-9]*$/.test(value) == false) {
return false;
}
return true;
})
.min(11, "must be 11 digits")
.max(11, "must be 11 digits"),
});
export default function DashboardHomeRefereeInfo({handleNextStep}:Props) { export default function DashboardHomeRefereeInfo({handleNextStep}:Props) {
//FUNCTION TO HANDLE SUBMIT
const handleSubmit = (values:any) => {
console.log(values)
handleNextStep()
};
return ( return (
<div className="w-full"> <div className="w-full">
<div className="w-full flex justify-center"> <div className="w-full flex justify-center">
<Stepper step={3} /> <Stepper step={3} />
</div> </div>
<div className="mt-[3.25rem] flex flex-col gap-9"> <Formik
<p className='text-red-500 text-lg md:text-2xl'>Reference Details <span className='text-base'>(Must be 18 years and above)</span></p> initialValues={initialValues}
<div className="flex items-center gap-[4.125rem]"> validationSchema={validationSchema}
<div className='max-w-[25.875rem] w-full flex flex-col gap-9'> onSubmit={handleSubmit}
<p className='text-red-500 text-base'>Reference one</p> >
<InputCompOne {(props)=>(
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" <Form>
name="applyIshInput" <div className="mt-[3.25rem] flex flex-col gap-9">
label="Full name" <p className='text-red-500 text-lg md:text-2xl'>Reference Details <span className='text-base'>(Must be 18 years and above)</span></p>
labelClass="font-bold text-[1.125rem]" <div className="flex items-center gap-[4.125rem]">
input <div className='w-full max-w-[25.875rem]'>
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" <p className='text-red-500 text-base'>Reference one</p>
placeholder="John James" <div className='w-full flex flex-col gap-9'>
/> <InputCompOne
<InputCompOne parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" name="ref_name"
name="applyIshInput" floatLabel="Full name"
label="Relationship" // labelClass="font-bold text-[1.125rem]"
labelClass="font-bold text-[1.125rem]" input
input inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" placeholder="John James"
placeholder="Sister" value={props.values.ref_name}
/> onChange={props.handleChange}
<InputCompOne error={(props.errors.ref_name && props.touched.ref_name) ? props.errors.ref_name : ''}
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" />
name="applyIshInput" <InputCompOne
label="Phone number" parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
labelClass="font-bold text-[1.125rem]" name="ref_relationship"
input floatLabel="Relationship"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" // labelClass="font-bold text-[1.125rem]"
placeholder="07000000000" input
/> inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
<InputCompOne placeholder="Sister"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" value={props.values.ref_relationship}
name="applyIshInput" onChange={props.handleChange}
label="Email address" error={(props.errors.ref_relationship && props.touched.ref_relationship) ? props.errors.ref_relationship : ''}
labelClass="font-bold text-[1.125rem]" />
input <InputCompOne
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
placeholder="demo@gamil.com" name="ref_number"
/> floatLabel="Phone number"
<InputCompOne // labelClass="font-bold text-[1.125rem]"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" input
name="applyIshInput" inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
label="BVN" placeholder="07000000000"
labelClass="font-bold text-[1.125rem]" value={props.values.ref_number}
input onChange={props.handleChange}
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" error={(props.errors.ref_number && props.touched.ref_number) ? props.errors.ref_number : ''}
placeholder="2228457896" />
/> <InputCompOne
</div> parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
<div className='max-w-[25.875rem] w-full flex flex-col gap-9'> name="ref_email"
<p className='text-red-500 text-base'>Reference one</p> floatLabel="Email address"
<InputCompOne // labelClass="font-bold text-[1.125rem]"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" input
name="applyIshInput" inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
label="Full name" placeholder="demo@gamil.com"
labelClass="font-bold text-[1.125rem]" value={props.values.ref_email}
input onChange={props.handleChange}
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" error={(props.errors.ref_email && props.touched.ref_email) ? props.errors.ref_email : ''}
placeholder="John James" />
/> <InputCompOne
<InputCompOne parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" name="ref_bvn"
name="applyIshInput" floatLabel="BVN"
label="Relationship" // labelClass="font-bold text-[1.125rem]"
labelClass="font-bold text-[1.125rem]" input
input inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" placeholder="2228457896"
placeholder="Sister" value={props.values.ref_bvn}
/> onChange={props.handleChange}
<InputCompOne error={(props.errors.ref_bvn && props.touched.ref_bvn) ? props.errors.ref_bvn : ''}
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" />
name="applyIshInput" </div>
label="Phone number" </div>
labelClass="font-bold text-[1.125rem]" <div className='w-full max-w-[25.875rem]'>
input <p className='text-red-500 text-base'>Reference two</p>
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" <div className='w-full flex flex-col gap-9'>
placeholder="07000000000" <InputCompOne
/> parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
<InputCompOne name="ref_two_name"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" floatLabel="Full name"
name="applyIshInput" // labelClass="font-bold text-[1.125rem]"
label="Email address" input
labelClass="font-bold text-[1.125rem]" inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
input placeholder="John James"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" value={props.values.ref_two_name}
placeholder="demo@gamil.com" onChange={props.handleChange}
/> error={(props.errors.ref_two_name && props.touched.ref_two_name) ? props.errors.ref_two_name : ''}
<InputCompOne />
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" <InputCompOne
name="applyIshInput" parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
label="BVN" name="ref_two_relationship"
labelClass="font-bold text-[1.125rem]" floatLabel="Relationship"
input // labelClass="font-bold text-[1.125rem]"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" input
placeholder="2228457896" inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
/> placeholder="Sister"
</div> value={props.values.ref_two_relationship}
</div> onChange={props.handleChange}
<InputCompOne error={(props.errors.ref_two_relationship && props.touched.ref_two_relationship) ? props.errors.ref_two_relationship : ''}
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4" />
name="applyIshInput" <InputCompOne
label="Highest level of education" parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
labelClass="font-bold text-[1.125rem]" name="ref_two_number"
input floatLabel="Phone number"
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]" // labelClass="font-bold text-[1.125rem]"
placeholder="B.sc" input
/> inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
<Button placeholder="07000000000"
className="my-8 max-w-[25.875rem] btn-Y text-black w-full h-11" value={props.values.ref_two_number}
text="Next" onChange={props.handleChange}
type="button" error={(props.errors.ref_two_number && props.touched.ref_two_number) ? props.errors.ref_two_number : ''}
onClick={handleNextStep} />
/> <InputCompOne
</div> parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
name="ref_two_email"
floatLabel="Email address"
// labelClass="font-bold text-[1.125rem]"
input
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
placeholder="demo@gamil.com"
value={props.values.ref_two_email}
onChange={props.handleChange}
error={(props.errors.ref_two_email && props.touched.ref_two_email) ? props.errors.ref_two_email : ''}
/>
<InputCompOne
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
name="ref_two_bvn"
floatLabel="BVN"
// labelClass="font-bold text-[1.125rem]"
input
inputClass="w-full h-[3.625rem] bg-[#EFEFEF] px-4 rounded-[.375rem]"
placeholder="2228457896"
value={props.values.ref_two_bvn}
onChange={props.handleChange}
error={(props.errors.ref_two_bvn && props.touched.ref_two_bvn) ? props.errors.ref_two_bvn : ''}
/>
</div>
</div>
</div>
<Button
className="my-8 max-w-[25.875rem] btn-Y text-black w-full h-11"
text="Next"
type="submit"
/>
</div>
</Form>
)}
</Formik>
</div> </div>
); );
} }
@@ -1,6 +1,7 @@
import React from "react"; import React from "react";
import DebitAccount from "./DebitAccount"; import DebitAccount from "./DebitAccount";
const ApplicantsAttestation: React.FC = () => { const ApplicantsAttestation: React.FC = () => {
return ( return (
<> <>
+1 -1
View File
@@ -32,6 +32,7 @@ const BVN = ({handleNextStep}:Props) => {
const handleSubmit = (values:any) => { const handleSubmit = (values:any) => {
console.log('values', values) console.log('values', values)
handleNextStep()
}; };
return ( return (
@@ -70,7 +71,6 @@ const BVN = ({handleNextStep}:Props) => {
<button <button
type='submit' type='submit'
className="w-full h-[3.625rem] rounded bg-[#FBB700] rounded-2 px-4 text-[18px] text-[#282828] font-semibold disabled:text-[#282828] disabled:text-opacity-50" className="w-full h-[3.625rem] rounded bg-[#FBB700] rounded-2 px-4 text-[18px] text-[#282828] font-semibold disabled:text-[#282828] disabled:text-opacity-50"
onClick={handleNextStep}
> >
Enter Enter
</button> </button>
+285 -75
View File
@@ -1,61 +1,87 @@
import React, { useRef, useState } from "react"; import React from "react";
import InputDetails from "./IntroDetails";
import OTPSection from "./OtpSection";
import SpouseDetails from "./SpouseDetails";
import { Button } from "..";
// interface Option { import { Button, InputCompOne } from "..";
// value: string;
// label: string; import {Formik, Form} from 'formik'
// } import * as Yup from "yup";
const initialValues = {
title: "",
marital_status: "",
agent_id: "",
bvn: "",
first_name: "",
phone: "",
email: "",
surname: "",
dob: "",
second_name: "",
spouse_bvn: "",
};
// To get the validation schema
const validationSchema = Yup.object().shape({
title: Yup.string()
.required("Required"),
marital_status: Yup.string()
.required("Required"),
agent_id: Yup.string()
.required("Required"),
bvn: Yup.string()
.required("BVN is required")
.test("no-e", "Invalid number", (value:any) => {
if (value && /^[0-9]*$/.test(value) == false) {
return false;
}
return true;
})
.min(11, "must be 11 digits")
.max(11, "must be 11 digits"),
first_name: Yup.string()
.required("Required"),
phone: Yup.string()
.required("Required"),
email: Yup.string()
.required("Required")
.email("Wrong email format"),
surname: Yup.string()
.required("Required"),
dob: Yup.string()
.required("Required"),
});
interface BasicInfoProps { interface BasicInfoProps {
inputValues: {
title: string;
marital: string;
agentId: string;
bvn: string;
firstName: string;
phone: string;
email: string;
surname: string;
dob: string;
secondName: string;
spouseBVN: string;
};
setInputValues: React.Dispatch<React.SetStateAction<any>>;
handleNextStep: any; handleNextStep: any;
} }
const BasicInfo: React.FC<BasicInfoProps> = ({ const BasicInfo: React.FC<BasicInfoProps> = ({
inputValues,
setInputValues,
handleNextStep, handleNextStep,
}) => { }) => {
const [hideOTPComponent, setHideOTPComponent] = useState<boolean>(false); // const inputRef = useRef<HTMLInputElement>(null);
const inputRef = useRef<HTMLInputElement>(null);
const handleChange = (e: React.FormEvent<HTMLInputElement>) => { // const handleInput = (e: React.FormEvent<HTMLInputElement>) => {
const { name, value } = e.target as HTMLInputElement; // const { name, value } = e.target as HTMLInputElement;
setInputValues((prev: typeof inputValues) => ({ ...prev, [name]: value }));
};
const handleInput = (e: React.FormEvent<HTMLInputElement>) => { // if (name === "bvn") {
const { name, value } = e.target as HTMLInputElement; // const isNumeric = /^[0-9]+$/.test(value);
if (name === "bvn") { // if (isNumeric) {
const isNumeric = /^[0-9]+$/.test(value); // if (value.length === 10) {
// setHideOTPComponent(false);
// } else {
// setHideOTPComponent(true);
// }
// } else {
// console.log("Invalid BVN");
// }
// }
// };
if (isNumeric) {
if (value.length === 10) { //FUNCTION TO HANDLE SUBMIT
setHideOTPComponent(false); const handleSubmit = (values:any) => {
} else { console.log(values)
setHideOTPComponent(true); handleNextStep()
}
} else {
console.log("Invalid BVN");
}
}
}; };
return ( return (
@@ -64,38 +90,222 @@ const BasicInfo: React.FC<BasicInfoProps> = ({
<h1 className="font-semibold text-[2.375rem] text-[#5C2684] my-[.5rem]"> <h1 className="font-semibold text-[2.375rem] text-[#5C2684] my-[.5rem]">
Lets Get You Started Lets Get You Started
</h1> </h1>
<form> <Formik
<InputDetails initialValues={initialValues}
inputValues={inputValues} validationSchema={validationSchema}
handleChange={handleChange} onSubmit={handleSubmit}
handleInput={handleInput} >
inputRef={inputRef} {(props)=>(
/> <Form>
{!hideOTPComponent && ( <div className="w-full rounded py-3 bg-[#5C2684] px-5">
<> <p className="text-base text-[#FBB700] tracking-[3%] font-extrabold w-fit">
<OTPSection BASIC INFORMATION
inputValues={inputValues} </p>
handleChange={handleChange} </div>
handleInput={handleInput} <div className="mt-8 grid grid-cols-2">
inputRef={inputRef} <div className="flex flex-col gap-4 max-w-[15.6875rem]">
/> <InputCompOne
<SpouseDetails parentInputClass="max-w-[224px] w-full"
inputValues={inputValues} parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
handleChange={handleChange} name="title"
handleInput={handleInput} label="Title"
inputRef={inputRef} labelClass="font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#5C2684] mb-[2px]"
/> select={true}
<Button selectClass="w-full h-[36px] rounded-[6px]"
className="mt-8 btn-R bg-[#5A2C82]" selectOptions={titleOptions}
text="Enter" selectValue={props.values.title}
type="button" onChange={props.handleChange}
onClick={handleNextStep} error={(props.errors.title && props.touched.title) ? props.errors.title : ''}
/> />
</> <InputCompOne
)} parentInputClass="max-w-[224px] w-full"
</form> parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
name="marital_status"
label="Marital Status"
labelClass="font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#5C2684] mb-[2px]"
select={true}
selectClass="w-full h-[36px] rounded-[6px]"
selectOptions={maritalStatusOptions}
selectValue={props.values.marital_status}
onChange={props.handleChange}
error={(props.errors.marital_status && props.touched.marital_status) ? props.errors.marital_status : ''}
/>
<InputCompOne
parentInputClass="max-w-[224px] w-full"
parentClass="max-w-[25.875rem] w-full flex flex-col gap-4"
name="agent_id"
label="Direct Sales Agent ID"
labelClass="font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#5C2684] mb-[2px]"
select={true}
selectClass="w-full h-[36px] rounded-[6px]"
selectOptions={{loading: false, data:[{ value: "", label: "Select" }, { value: "dd", label: "AB001" }]}}
selectValue={props.values.agent_id}
onChange={props.handleChange}
error={(props.errors.agent_id && props.touched.agent_id) ? props.errors.agent_id : ''}
/>
<InputCompOne
label="BVN"
name="bvn"
parentInputClass="w-full"
labelSpan="( To get your BVN, dial *565*0# )"
labelSpanClass="text-[11px] text-[#7a7373]"
placeholder="Enter your BVN"
labelClass="font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#5C2684] mb-[2px] gap-[2px]"
input={true}
inputClass="w-full h-[36px] bg-[#EFEFEF] rounded-[6px]"
value={props.values.bvn}
onChange={props.handleChange}
error={(props.errors.bvn && props.touched.bvn) ? props.errors.bvn : ''}
/>
</div>
</div>
<div className="mt-5">
<div className="grid grid-cols-2 gap-4">
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="First Name"
name="first_name"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.first_name}
onChange={props.handleChange}
error={(props.errors.first_name && props.touched.first_name) ? props.errors.first_name : ''}
/>
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="Phone Number"
name="phone"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.phone}
onChange={props.handleChange}
error={(props.errors.phone && props.touched.phone) ? props.errors.phone : ''}
/>
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="Email Address"
name="email"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.email}
onChange={props.handleChange}
error={(props.errors.email && props.touched.email) ? props.errors.email : ''}
/>
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="Surname"
name="surname"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem] px-3"
value={props.values.surname}
onChange={props.handleChange}
error={(props.errors.surname && props.touched.surname) ? props.errors.surname : ''}
/>
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="Date of Birth"
name="dob"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputType='date'
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem] px-3"
value={props.values.dob}
onChange={props.handleChange}
error={(props.errors.dob && props.touched.dob) ? props.errors.dob : ''}
/>
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="Second Name"
name="second_name"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem] px-3"
value={props.values.second_name}
onChange={props.handleChange}
error={(props.errors.second_name && props.touched.second_name) ? props.errors.second_name : ''}
/>
</div>
</div>
<div className='w-full'>
<div className="w-full rounded py-3 bg-[#5C2684] px-5 mt-5">
<p className="text-base text-[#FBB700] tracking-[3%] font-extrabold w-fit">
SPOUSE DETAILS ( If not applicable, please move to the next stage )
</p>
</div>
<div className="mt-8 grid grid-cols-2">
<div className="flex flex-col gap-4 max-w-[15.6875rem]">
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="BVN"
name="spouse_bvn"
parentInputClass="w-full"
labelSpan="( To get your BVN, dial *565*0# )"
labelSpanClass="text-[11px] text-[#7a7373]"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.spouse_bvn}
onChange={props.handleChange}
error={(props.errors.spouse_bvn && props.touched.spouse_bvn) ? props.errors.spouse_bvn : ''}
/>
</div>
</div>
</div>
<>
<Button
className="mt-8 btn-R bg-[#5A2C82]"
text="Enter"
type="submit"
/>
</>
</Form>
)}
</Formik>
</> </>
); );
}; };
export default BasicInfo; export default BasicInfo;
interface SelectOption {
loading: boolean;
data: {value: string;
label: string}[]
}
const maritalStatusOptions: SelectOption = {
loading: false,
data: [
{ value: "", label: "Select" },
{ value: "single", label: "Single" },
{ value: "married", label: "Married" },
{ value: "divorced", label: "Divorced" },
{ value: "widowed", label: "Widowed" },
]
}
const titleOptions: SelectOption = {
loading: false,
data: [
{ value: "", label: "Select" },
{ value: "ms", label: "Ms" },
{ value: "mr", label: "Mr" },
{ value: "miss", label: "Miss" },
{ value: "mrs", label: "Mrs" },
]
}
+124 -69
View File
@@ -3,8 +3,40 @@ import {useNavigate} from 'react-router-dom'
import { Button, InputCompOne } from ".."; import { Button, InputCompOne } from "..";
import { RouteHandler } from "../../router/routes"; import { RouteHandler } from "../../router/routes";
import {Formik, Form} from 'formik'
import * as Yup from "yup";
const initialValues = {
disburse_account: "",
bank_name: "",
account_name: "",
account_number: "",
checked: false
};
// To get the validation schema
const validationSchema = Yup.object().shape({
disburse_account: Yup.string()
.required("Required"),
bank_name: Yup.string()
.required("Required"),
account_name: Yup.string()
.required("Required"),
account_number: Yup.string()
.required("Required"),
checked: Yup.bool() // use bool instead of boolean
.oneOf([true], "You must accept the terms and conditions")
});
const DebitAccount: React.FC = () => { const DebitAccount: React.FC = () => {
const navigate = useNavigate() const navigate = useNavigate()
//FUNCTION TO HANDLE SUBMIT
const handleSubmit = (values:any) => {
console.log(values)
navigate(RouteHandler.letsGetStarted, {replace:true})
};
return ( return (
<> <>
<div className="w-full rounded py-3 mb-9 bg-[#5C2684] px-5"> <div className="w-full rounded py-3 mb-9 bg-[#5C2684] px-5">
@@ -12,78 +44,101 @@ const DebitAccount: React.FC = () => {
CREDIT ACCOUNT ( Your account to receive your loan ) CREDIT ACCOUNT ( Your account to receive your loan )
</p> </p>
</div> </div>
<InputCompOne <Formik
parentClass="max-w-[29.4375rem] w-full my-5 ml-5" initialValues={initialValues}
label="Disbursement Account Number " validationSchema={validationSchema}
name="disbursementAccountNumber" onSubmit={handleSubmit}
labelSpan="( Your FCMB Account )" >
labelSpanClass="text-[12px] text-[#5C2684] ml-1" {(props)=>(
parentInputClass="w-full" <Form>
labelClass="font-bold text-[18px] leading-[21.7808px] tracking-[2%] text-[#5C2684] mb-[2px]" <InputCompOne
input parentClass="max-w-[29.4375rem] w-full my-5 ml-5"
inputClass="w-full h-[36px] bg-[#EFEFEF] px-[2px] rounded-[6px]" label="Disbursement Account Number "
/> name="disburse_account"
labelSpan="( Your FCMB Account )"
labelSpanClass="text-[12px] text-[#5C2684] ml-1"
parentInputClass="w-full"
labelClass="font-bold text-[18px] leading-[21.7808px] tracking-[2%] text-[#5C2684] mb-[2px]"
input
inputClass="w-full h-[36px] bg-[#EFEFEF] rounded-[6px]"
value={props.values.disburse_account}
onChange={props.handleChange}
error={(props.errors.disburse_account && props.touched.disburse_account) ? props.errors.disburse_account : ''}
/>
<div className="mt-9 flex flex-col gap-9"> <div className="mt-9 flex flex-col gap-9">
<div className="w-full rounded py-3 bg-[#5C2684] px-5"> <div className="w-full rounded py-3 bg-[#5C2684] px-5">
<p className="text-base text-[#FBB700] tracking-[3%] font-extrabold w-fit"> <p className="text-base text-[#FBB700] tracking-[3%] font-extrabold w-fit">
DEBIT ACCOUNT ( Your salary account for monthly repayment ) DEBIT ACCOUNT ( Your salary account for monthly repayment )
</p> </p>
</div> </div>
<InputCompOne <InputCompOne
parentClass="max-w-[471px] w-full ml-5" parentClass="max-w-[471px] w-full ml-5"
label="Bank Name" label="Bank Name"
name="bankName" name="bank_name"
parentInputClass="w-full" parentInputClass="w-full"
labelClass="font-bold text-[18px] leading-[21.7808px] tracking-[2%] text-[#5C2684] mb-[2px]" labelClass="font-bold text-[18px] leading-[21.7808px] tracking-[2%] text-[#5C2684] mb-[2px]"
input input
inputClass="w-full h-[36px] bg-[#EFEFEF] px-[2px] rounded-[6px]" inputClass="w-full h-[36px] bg-[#EFEFEF] rounded-[6px]"
/> value={props.values.bank_name}
onChange={props.handleChange}
error={(props.errors.bank_name && props.touched.bank_name) ? props.errors.bank_name : ''}
/>
<div className="flex items-center gap-[59px]"> <div className="flex items-center gap-[59px]">
<InputCompOne <InputCompOne
parentClass="max-w-[471px] w-full ml-5" parentClass="max-w-[471px] w-full ml-5"
label="Account Number" label="Account Number"
name="accountNumber" name="account_number"
parentInputClass="w-full" parentInputClass="w-full"
labelClass="font-bold text-[18px] leading-[21.7808px] tracking-[2%] text-[#5C2684] mb-[2px]" labelClass="font-bold text-[18px] leading-[21.7808px] tracking-[2%] text-[#5C2684] mb-[2px]"
input input
inputClass="w-full h-[36px] bg-[#EFEFEF] px-[2px] rounded-[6px]" inputClass="w-full h-[36px] bg-[#EFEFEF] rounded-[6px]"
/> value={props.values.account_number}
<InputCompOne onChange={props.handleChange}
parentClass="max-w-[471px] w-full ml-5" error={(props.errors.account_number && props.touched.account_number) ? props.errors.account_number : ''}
label="Account Name" />
name="accountName" <InputCompOne
parentInputClass="w-full" parentClass="max-w-[471px] w-full ml-5"
labelClass="font-bold text-[18px] leading-[21.7808px] tracking-[2%] text-[#5C2684] mb-[2px]" label="Account Name"
input name="account_name"
inputClass="w-full h-[36px] bg-[#EFEFEF] px-[2px] rounded-[6px]" parentInputClass="w-full"
/> labelClass="font-bold text-[18px] leading-[21.7808px] tracking-[2%] text-[#5C2684] mb-[2px]"
</div> input
inputClass="w-full h-[36px] bg-[#EFEFEF] rounded-[6px]"
value={props.values.account_name}
onChange={props.handleChange}
error={(props.errors.account_name && props.touched.account_name) ? props.errors.account_name : ''}
/>
</div>
<div className="max-w-[578px] flex items-center"> <div className="max-w-[578px] flex items-center">
<input <input
type="checkbox" type="checkbox"
// checked={true} // checked={true}
defaultChecked
// onChange={onChange} name='checked'
className="form-checkbox h-[25px] w-[25px] rounded-sm text-[#5c2684] " onChange={props.handleChange}
style={{ backgroundColor: "#5C2684" }} className="form-checkbox h-[25px] w-[25px] rounded-sm text-[#5c2684] "
/> style={{ backgroundColor: "#5C2684" }}
<label className="ml-2 text-gray-700"> />
I have read, understood and accept the{" "} <label className="ml-2 text-gray-700">
<span className="text-[#4545CB]">applicant's attestation</span> and I have read, understood and accept the{" "}
all the <span className="text-[#4545CB]">terms and conditions</span>{" "} <span className="text-[#4545CB]">applicant's attestation</span> and
for FCMB premium salary loan. all the <span className="text-[#4545CB]">terms and conditions</span>{" "}
</label> for FCMB premium salary loan.
</div> </label>
<Button {props.errors.checked && props.touched.checked && <span className='text-[10px] text-red-500'>{props.errors.checked}</span>}
className="my-8 max-w-[33.875rem] btn-R bg-[#5A2C82] w-full h-11" </div>
text="Apply" <Button
type="button" className="my-8 max-w-[33.875rem] btn-R bg-[#5A2C82] w-full h-11"
onClick={()=>navigate(RouteHandler.letsGetStarted, {replace:true})} text="Apply"
/> type="submit"
</div> />
</div>
</Form>
)}
</Formik>
</> </>
); );
}; };
@@ -1,99 +0,0 @@
import React from "react";
import { InputCompOne } from "..";
const EmploymentDetails: React.FC = () => {
return (
<>
<div className="w-full rounded py-3 bg-[#5C2684] px-5">
<p className="text-base text-[#FBB700] tracking-[3%] font-extrabold w-fit">
EMPLOYMENT DETAILS
</p>
</div>
<div className="flex flex-col gap-4">
<InputCompOne
parentClass="max-w-[17.9375rem] w-full"
label="Job Title"
name="jobTitle"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
<div className="flex items-center gap-[3.6875rem]">
<InputCompOne
parentClass="max-w-[23.1875rem] w-full"
label="Employers Name"
name="employerName"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
<InputCompOne
parentClass="max-w-[23.1875rem] w-full"
label="Employers Official Email"
name="employerOfficialEmail"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
</div>
<div className="flex items-center gap-[9rem]">
<InputCompOne
parentClass="max-w-[17.9375rem] w-full"
label="Resumption Date"
name="resumptionDate"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
<InputCompOne
parentClass="max-w-[17.9375rem] w-full"
label="Employee ID."
name="employeeID"
labelSpan="Upload your work ID"
labelSpanClass="text-[11px] text-[#7a7373]"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
</div>
<div className="flex items-center gap-[3.6875rem]">
<InputCompOne
parentClass="max-w-[23.1875rem] w-full"
label="Salary ( Gross annual income )"
name="salaryGross"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
<InputCompOne
parentClass="max-w-[23.1875rem] w-full"
label="Salary ( Net monthly Income )"
name="salaryNet"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
</div>
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="Salary Payment Date"
name="salary-payment-date"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
</div>
</>
);
};
export default EmploymentDetails;
-28
View File
@@ -1,35 +1,9 @@
import React from "react";
import BasicInfo from "./BasicInfo"; import BasicInfo from "./BasicInfo";
import YourAreAlmostThere from "./YourAreAlmostThere"; import YourAreAlmostThere from "./YourAreAlmostThere";
import LoanAmountComp from "./LoanAmountComp"; import LoanAmountComp from "./LoanAmountComp";
import ApplicantsAttestation from "./ApplicantsAttestation"; import ApplicantsAttestation from "./ApplicantsAttestation";
const GetStarted = ({handleNextStep, step}:{handleNextStep:any, step:string|number|any}) => { const GetStarted = ({handleNextStep, step}:{handleNextStep:any, step:string|number|any}) => {
// const [step, setStep] = React.useState(1);
// const handleNextStep = () => {
// if (step < 5) {
// setStep(step + 1);
// }
// };
// const handlePreviousStep: React.MouseEvent<HTMLButtonElement> = () => {
// setStep(step - 1);
// };
const [inputValues, setInputValues] = React.useState({
title: "",
marital: "",
agentId: "",
bvn: "",
firstName: "",
phone: "",
email: "",
surname: "",
dob: "",
secondName: "",
spouseBVN: "",
});
return ( return (
<div className="w-full flex items-center justify-center"> <div className="w-full flex items-center justify-center">
@@ -38,8 +12,6 @@ const GetStarted = ({handleNextStep, step}:{handleNextStep:any, step:string|numb
<main> <main>
{step === 2 && ( {step === 2 && (
<BasicInfo <BasicInfo
inputValues={inputValues}
setInputValues={setInputValues}
handleNextStep={handleNextStep} handleNextStep={handleNextStep}
/> />
)} )}
-133
View File
@@ -1,133 +0,0 @@
import React from "react";
import InputCompOne from "../shared/InputCompOne";
interface Option {
value: string;
label: string;
}
interface InputSectionProps {
inputValues: {
title: string;
marital: string;
agentId: string;
bvn: string;
};
handleChange: (e: React.FormEvent<HTMLInputElement>) => void;
handleInput: (e: React.FormEvent<HTMLInputElement>) => void;
inputRef: React.RefObject<HTMLInputElement>;
}
const InputSection: React.FC<InputSectionProps> = ({
inputValues,
handleChange,
handleInput,
inputRef,
}) => {
const basicInfoInputFields = [
{
label: "Title",
name: "title",
parentInputClass: "max-w-[224px] w-full",
labelClass:
"font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#5C2684] mb-[2px]",
select: true,
selectClass: "w-full h-[36px] rounded-[6px]",
selectOptions: titleOptions,
value: inputValues.title,
},
{
label: "Marital Status",
name: "marital",
parentInputClass: "max-w-[224px] w-full",
labelClass:
"font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#5C2684] mb-[2px]",
select: true,
selectClass: "w-full h-[36px] rounded-[6px]",
selectOptions: maritalStatusOptions,
value: inputValues.marital,
onInput: handleInput,
},
{
label: "Direct Sales Agent ID",
name: "agentId",
parentInputClass: "max-w-[224px] w-full",
labelClass:
"font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#5C2684] mb-[2px]",
select: true,
selectClass: "w-full h-[36px] rounded-[6px]",
selectOptions: [{ value: "", label: "Select" }],
value: inputValues.agentId,
onInput: handleInput,
},
{
label: "BVN",
name: "bvn",
parentInputClass: " w-full",
labelSpan: "( To get your BVN, dial *565*0# )",
labelSpanClass: "text-[11px] text-[#7a7373]",
placeholder: "Enter your BVN",
labelClass:
"font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#5C2684] mb-[2px] gap-[2px]",
input: true,
inputClass: "w-full h-[36px] bg-[#EFEFEF] px-[2px] rounded-[6px]",
value: inputValues.bvn,
onInput: handleInput,
maxLength: 10,
},
];
return (
<>
<div className="w-full rounded py-3 bg-[#5C2684] px-5">
<p className="text-base text-[#FBB700] tracking-[3%] font-extrabold w-fit">
BASIC INFORMATION
</p>
</div>
<div className="mt-8 grid grid-cols-2">
<div className="flex flex-col gap-4 max-w-[15.6875rem]">
{basicInfoInputFields.map((field, index) => (
<InputCompOne
key={index}
label={field.label}
name={field.name}
parentInputClass={field.parentInputClass}
labelClass={field.labelClass}
select={field.select}
selectClass={field.selectClass}
selectOptions={field.selectOptions}
value={field.value}
onChange={handleChange}
onInput={field.onInput}
placeholder={field.placeholder}
labelSpan={field.labelSpan}
labelSpanClass={field.labelSpanClass}
input={field.input}
inputClass={field.inputClass}
maxLength={field.maxLength}
ref={inputRef}
/>
))}
</div>
</div>
</>
);
};
export default InputSection;
const maritalStatusOptions: Option[] = [
{ value: "", label: "Select" },
{ value: "single", label: "Single" },
{ value: "married", label: "Married" },
{ value: "divorced", label: "Divorced" },
{ value: "widowed", label: "Widowed" },
];
const titleOptions: Option[] = [
{ value: "", label: "Select" },
{ value: "ms", label: "Ms" },
{ value: "mr", label: "Mr" },
{ value: "miss", label: "Miss" },
{ value: "mrs", label: "Mrs" },
];
+163 -90
View File
@@ -1,20 +1,56 @@
import React from "react";
import { Button, InputCompOne } from ".."; import { Button, InputCompOne } from "..";
interface SliderProps { import {Formik, Form} from 'formik'
handleSliderChange: (e: React.ChangeEvent<HTMLInputElement>) => void; import * as Yup from "yup";
value: number;
} const initialValues = {
monthly_salary: "",
loan_amount: "",
duration: 6
};
// To get the validation schema
const validationSchema = Yup.object().shape({
duration: Yup.number()
.required("Required"),
monthly_salary: Yup.string()
.required("Required")
.test("no-e", "Invalid", (value:any) => {
if (value && /^[0-9]*$/.test(value) == false) {
return false;
}
return true;
}),
loan_amount: Yup.string()
.required("Required")
.test("no-e", "Invalid", (value:any) => {
if (value && /^[0-9]*$/.test(value) == false) {
return false;
}
return true;
}),
});
// interface SliderProps {
// handleSliderChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
// value: number;
// }
interface LoanAmountProps { interface LoanAmountProps {
handleNextStep: any; handleNextStep: any;
} }
const LoanAmountComp: React.FC<LoanAmountProps> = ({ handleNextStep }) => { const LoanAmountComp: React.FC<LoanAmountProps> = ({ handleNextStep }) => {
const [value, setValue] = React.useState(6); // const [value, setValue] = React.useState(6);
const handleSliderChange = (e: any) => { // const handleSliderChange = (e: any) => {
setValue(e.target.value); // setValue(e.target.value);
// };
//FUNCTION TO HANDLE SUBMIT
const handleSubmit = (values:any) => {
console.log(values)
handleNextStep()
}; };
return ( return (
@@ -35,95 +71,132 @@ const LoanAmountComp: React.FC<LoanAmountProps> = ({ handleNextStep }) => {
</p> </p>
</div> </div>
</div> </div>
<div className="flex flex-col gap-[45px] justify-center ml-[40px] mb-[40px]"> <Formik
<InputCompOne initialValues={initialValues}
parentClass="max-w-[29.4375rem] w-full" validationSchema={validationSchema}
label="Your Monthly Salary*" onSubmit={handleSubmit}
name="salary" >
parentInputClass="w-full" {(props)=>(
labelClass="font-bold text-[18px] leading-[21.7808px] tracking-[2%] text-[#5C2684] mb-[2px]" <Form>
input <div className="flex flex-col gap-[45px] justify-center ml-[40px] mb-[40px]">
inputClass="w-full h-[51px] bg-[#EFEFEF] rounded-[6px] placeholder:text-green-600 placeholder:font-bold px-4" <InputCompOne
placeholder="150,000" parentClass="max-w-[29.4375rem] w-full"
/> label="Your Monthly Salary*"
name="monthly_salary"
parentInputClass="w-full"
labelClass="font-bold text-[18px] leading-[21.7808px] tracking-[2%] text-[#5C2684] mb-[2px]"
input
inputClass="w-full h-[51px] bg-[#EFEFEF] rounded-[6px] placeholder:text-green-600 placeholder:font-bold px-4"
placeholder="150,000"
value={props.values.monthly_salary}
onChange={props.handleChange}
error={(props.errors.monthly_salary && props.touched.monthly_salary) ? props.errors.monthly_salary : ''}
/>
<div className="w-full border-[.1875rem] rounded-xl border-black min-h-[884px] py-4 px-8 max-w-[784px]"> <div className="w-full border-[.1875rem] rounded-xl border-black min-h-[884px] py-4 px-8 max-w-[784px]">
<p className="leading-[22px] tracking-[3%] text-[#5C2684] w-[729px] mb-[2.625rem]"> <p className="leading-[22px] tracking-[3%] text-[#5C2684] w-[729px] mb-[2.625rem]">
The maximum amount you can apply for on this offer is based on the The maximum amount you can apply for on this offer is based on the
information you shared with us in your loan application. We have information you shared with us in your loan application. We have
made this offer to suit your monthly remuneration and to enable you made this offer to suit your monthly remuneration and to enable you
pay your loan on-time pay your loan on-time
</p> </p>
<InputCompOne <InputCompOne
parentClass="max-w-[45.8125rem] w-full mb-3" parentClass="max-w-[45.8125rem] w-full mb-3"
label="How much do you want to apply for?" label="How much do you want to apply for?"
name="loan" name="loan_amount"
parentInputClass="w-full" parentInputClass="w-full"
labelClass="font-bold text-[18px] leading-[21.7808px] tracking-[2%] text-[#5C2684] mb-[2px]" labelClass="font-bold text-[18px] leading-[21.7808px] tracking-[2%] text-[#5C2684] mb-[2px]"
input input
inputClass="w-full h-[51px] bg-[#EFEFEF] rounded-[6px] placeholder:text-green-600 placeholder:font-bold px-9" inputClass="w-full h-[51px] bg-[#EFEFEF] rounded-[6px] placeholder:text-green-600 placeholder:font-bold px-9"
placeholder="350,000" placeholder="350,000"
/> value={props.values.loan_amount}
<div className="flex items-center justify-between w-full"> onChange={props.handleChange}
<div className=" h-[68px] flex flex-col py-1 px-[13px] shadow-md text-[#5C2684]"> error={(props.errors.loan_amount && props.touched.loan_amount) ? props.errors.loan_amount : ''}
<span>Minimum Offer:</span> />
<p> <div className="flex items-center justify-between w-full">
<b>N</b>100,000 <div className=" h-[68px] flex flex-col py-1 px-[13px] shadow-md text-[#5C2684]">
</p> <span>Minimum Offer:</span>
</div> <p>
<b>N</b>100,000
</p>
</div>
<div className="h-[68px] flex flex-col py-1 px-[13px] shadow-md text-[#5C2684]"> <div className="h-[68px] flex flex-col py-1 px-[13px] shadow-md text-[#5C2684]">
<span>Maximum Offer:</span> <span>Maximum Offer:</span>
<p> <p>
<b>N</b>500,000 <b>N</b>500,000
</p> </p>
</div> </div>
</div> </div>
<Slider handleSliderChange={handleSliderChange} value={value} /> <>
<div className="flex flex-col items-start mt-11 mb-16">
<p className="text-lg font-semibold">For how many months? <span className='text-[10px] text-red-500'>{(props.errors.duration && props.touched.duration) ? props.errors.duration : ''}</span></p>
<div className="w-full">
<input
type="range"
min="6"
max="24"
value={props.values.duration}
onChange={props.handleChange}
className="slider w-full h-2 bg-gray-300 rounded-lg appearance-none cursor-pointer"
style={{
background: `linear-gradient(90deg, #6B21A8 ${
((props.values.duration - 6) / 18) * 100
}%, #D1D5DB ${((props.values.duration - 6) / 18) * 100}%)`,
}}
/>
</div>
<div className="mt-4 text-lg font-semibold text-gray-700 w-full flex items-center text-center justify-center">
{props.values.duration} months
</div>
</div>
</>
<div className="w-full flex items-center justify-center flex-col"> <div className="w-full flex items-center justify-center flex-col">
<div className="w-[279px] h-[130px] mb-[76px] flex items-center justify-center flex-col"> <div className="w-[279px] h-[130px] mb-[76px] flex items-center justify-center flex-col">
<p className="text-[#FBB700]">Your Monthly Repayment</p> <p className="text-[#FBB700]">Your Monthly Repayment</p>
<p>N</p> <p>N</p>
</div> </div>
<Button <Button
className="max-w-[462px] w-full bg-[#5C2684] rounded h-[2.75rem]" className="max-w-[462px] w-full bg-[#5C2684] rounded h-[2.75rem]"
text="Submit" text="Submit"
type="button" type='submit'
onClick={handleNextStep} />
/> </div>
</div> </div>
</div> </div>
</div> </Form>
)}
</Formik>
</> </>
); );
}; };
export default LoanAmountComp; export default LoanAmountComp;
const Slider: React.FC<SliderProps> = ({ handleSliderChange, value }) => { // const Slider: React.FC<SliderProps> = ({ handleSliderChange, value }) => {
return ( // return (
<div className="flex flex-col items-start mt-11 mb-16"> // <div className="flex flex-col items-start mt-11 mb-16">
<p className="text-lg font-semibold">For how many months?</p> // <p className="text-lg font-semibold">For how many months?</p>
<div className="w-full"> // <div className="w-full">
<input // <input
type="range" // type="range"
min="6" // min="6"
max="24" // max="24"
value={value} // value={value}
onChange={handleSliderChange} // onChange={handleSliderChange}
className="slider w-full h-2 bg-gray-300 rounded-lg appearance-none cursor-pointer" // className="slider w-full h-2 bg-gray-300 rounded-lg appearance-none cursor-pointer"
style={{ // style={{
background: `linear-gradient(90deg, #6B21A8 ${ // background: `linear-gradient(90deg, #6B21A8 ${
((value - 6) / 18) * 100 // ((value - 6) / 18) * 100
}%, #D1D5DB ${((value - 6) / 18) * 100}%)`, // }%, #D1D5DB ${((value - 6) / 18) * 100}%)`,
}} // }}
/> // />
</div> // </div>
<div className="mt-4 text-lg font-semibold text-gray-700 w-full flex items-center text-center justify-center"> // <div className="mt-4 text-lg font-semibold text-gray-700 w-full flex items-center text-center justify-center">
{value} months // {value} months
</div> // </div>
</div> // </div>
); // );
}; // };
-111
View File
@@ -1,111 +0,0 @@
import React from "react";
import InputCompOne from "../shared/InputCompOne";
interface OTPSectionProps {
inputValues: {
firstName: string;
phone: string;
email: string;
surname: string;
dob: string;
secondName: string;
};
handleChange: (e: React.FormEvent<HTMLInputElement>) => void;
handleInput: (e: React.FormEvent<HTMLInputElement>) => void;
inputRef: React.RefObject<HTMLInputElement>;
}
const OTPSection: React.FC<OTPSectionProps> = ({
inputValues,
handleChange,
handleInput,
inputRef,
}) => {
return (
<div className="mt-5">
<div className="grid grid-cols-2 gap-4">
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="First Name"
name="firstName"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
value={inputValues.firstName}
onChange={handleChange}
onInput={handleInput}
ref={inputRef}
/>
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="Phone Number"
name="phone"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
value={inputValues.phone}
onChange={handleChange}
onInput={handleInput}
ref={inputRef}
/>
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="Email Address"
name="email"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
value={inputValues.email}
onChange={handleChange}
onInput={handleInput}
ref={inputRef}
/>
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="Surname"
name="surname"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem] px-3"
value={inputValues.surname}
onChange={handleChange}
onInput={handleInput}
ref={inputRef}
/>
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="Date of Birth"
name="dob"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem] px-3"
value={inputValues.dob}
onChange={handleChange}
onInput={handleInput}
ref={inputRef}
/>
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="Second Name"
name="secondName"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem] px-3"
value={inputValues.secondName}
onChange={handleChange}
onInput={handleInput}
ref={inputRef}
/>
</div>
</div>
);
};
export default OTPSection;
@@ -1,126 +0,0 @@
import React from "react";
import { InputCompOne } from "..";
const ReferenceDetails: React.FC = () => {
return (
<>
<div className="w-full rounded py-3 bg-[#5C2684] px-5">
<p className="text-base text-[#FBB700] tracking-[3%] font-extrabold w-fit">
REFERENCE DETAILS ( Must be 18 years and above )
</p>
</div>
<div className="">
<div className="flex flex-col gap-[3.4375rem]">
<div className="flex flex-col gap-4">
<div className="flex items-center gap-[6.5625rem]">
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Name"
name="referenceName"
labelSpan="1st reference"
labelSpanClass="text-[12px] text-[#5C2684] ml-1"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Relationship with He/She"
name="referenceRelationship"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
</div>
<div className="flex items-center gap-[6.5625rem]">
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Phone Number"
name="referencePhoneNumber"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Email Address"
name="referenceEmail"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
</div>
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="BVN"
name="ReferenceBvn"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
</div>
<div className="flex flex-col gap-4">
<div className="flex items-center gap-[6.5625rem]">
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Name"
name="referenceName2"
labelSpan="2nd reference"
labelSpanClass="text-[12px] text-[#5C2684] ml-[4px]"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Relationship with He/She"
name="referenceRelationship2"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
</div>
<div className="flex items-center gap-[6.5625rem]">
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Phone Number"
name="referencePhoneNumber2"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Email Address"
name="referenceEmail2"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
</div>
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="BVN"
name="ReferenceBvn2"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
/>
</div>
</div>
</div>
</>
);
};
export default ReferenceDetails;
@@ -1,49 +0,0 @@
import React from "react";
import { InputCompOne } from "..";
interface SpouseDetailsProps {
inputValues: {
spouseBVN: string;
};
handleChange: (e: React.FormEvent<HTMLInputElement>) => void;
handleInput: (e: React.FormEvent<HTMLInputElement>) => void;
inputRef: React.RefObject<HTMLInputElement>;
}
const SpouseDetails: React.FC<SpouseDetailsProps> = ({
inputValues,
handleChange,
handleInput,
inputRef,
}) => {
return (
<>
<div className="w-full rounded py-3 bg-[#5C2684] px-5 mt-5">
<p className="text-base text-[#FBB700] tracking-[3%] font-extrabold w-fit">
SPOUSE DETAILS ( If not applicable, please move to the next stage )
</p>
</div>
<div className="mt-8 grid grid-cols-2">
<div className="flex flex-col gap-4 max-w-[15.6875rem]">
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="BVN"
name="spouseBVN"
parentInputClass="w-full"
labelSpan="( To get your BVN, dial *565*0# )"
labelSpanClass="text-[11px] text-[#7a7373]"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
value={inputValues.spouseBVN}
onChange={handleChange}
onInput={handleInput}
ref={inputRef}
/>
</div>
</div>
</>
);
};
export default SpouseDetails;
+385 -14
View File
@@ -1,29 +1,400 @@
import React from "react"; import React from "react";
// import { useNavigate } from "react-router-dom"; import { Button, InputCompOne } from "..";
import EmploymentDetails from "./EmploymentDetails";
import ReferenceDetails from "./ReferenceDetails"; import {Formik, Form} from 'formik'
import { Button } from ".."; import * as Yup from "yup";
const initialValues = {
job_title: "",
employer_name: "",
employer_email:"",
date_of_resumption: "",
employee_id: "",
annual_income: "",
monthly_salary: "",
salary_payment_date: "",
ref_name: "",
ref_email: "",
ref_number: "",
ref_relationship: "",
ref_bvn: "",
ref_two_name: "",
ref_two_email: "",
ref_two_number: "",
ref_two_relationship: "",
ref_two_bvn: "",
};
// To get the validation schema
const validationSchema = Yup.object().shape({
job_title: Yup.string()
.required("Required"),
employer_name: Yup.string()
.required("Required"),
date_of_resumption: Yup.string()
.required("Required"),
employer_email: Yup.string()
.email("Invalid")
.required("Required"),
annual_income: Yup.string()
.required("Required")
.test("no-e", "Invalid", (value:any) => {
if (value && /^[0-9]*$/.test(value) == false) {
return false;
}
return true;
}),
monthly_salary: Yup.string()
.required("Required")
.test("no-e", "Invalid", (value:any) => {
if (value && /^[0-9]*$/.test(value) == false) {
return false;
}
return true;
}),
salary_payment_date: Yup.string()
.required("Required"),
employee_id: Yup.string()
.required("Required"),
ref_name: Yup.string()
.required("Required"),
ref_email: Yup.string()
.email("Invalid")
.required("Required"),
ref_number: Yup.string()
.required("Required"),
ref_relationship: Yup.string()
.required("Required"),
ref_bvn: Yup.string()
.required("BVN is required")
.test("no-e", "Invalid number", (value:any) => {
if (value && /^[0-9]*$/.test(value) == false) {
return false;
}
return true;
})
.min(11, "must be 11 digits")
.max(11, "must be 11 digits"),
ref_two_name: Yup.string()
.required("Required"),
ref_two_email: Yup.string()
.email("Invalid")
.required("Required"),
ref_two_number: Yup.string()
.required("Required"),
ref_two_relationship: Yup.string()
.required("Required"),
ref_two_bvn: Yup.string()
.required("BVN is required")
.test("no-e", "Invalid number", (value:any) => {
if (value && /^[0-9]*$/.test(value) == false) {
return false;
}
return true;
})
.min(11, "must be 11 digits")
.max(11, "must be 11 digits"),
});
interface YourAreAlmostThereProps { interface YourAreAlmostThereProps {
handleNextStep: any; handleNextStep: any;
} }
const YourAreAlmostThere: React.FC<YourAreAlmostThereProps> = ({ handleNextStep }) => { const YourAreAlmostThere: React.FC<YourAreAlmostThereProps> = ({ handleNextStep }) => {
//FUNCTION TO HANDLE SUBMIT
const handleSubmit = (values:any) => {
console.log(values)
handleNextStep()
};
return ( return (
<> <>
<h1 className="font-semibold text-[2.375rem] text-[#5C2684] my-[.5rem]"> <h1 className="font-semibold text-[2.375rem] text-[#5C2684] my-[.5rem]">
Youre almost there Youre almost there
</h1> </h1>
<form action="" className="flex flex-col gap-6"> <Formik
<EmploymentDetails /> initialValues={initialValues}
<ReferenceDetails /> validationSchema={validationSchema}
<Button onSubmit={handleSubmit}
className="my-8 max-w-[20.3125rem] btn-R bg-[#5A2C82]" >
text="Continue" {(props)=>(
type="button" <Form>
onClick={handleNextStep} <div className="flex flex-col gap-6">
/> <>
</form> <div className="w-full rounded py-3 bg-[#5C2684] px-5">
<p className="text-base text-[#FBB700] tracking-[3%] font-extrabold w-fit">
EMPLOYMENT DETAILS
</p>
</div>
<div className="flex flex-col gap-4">
<InputCompOne
parentClass="max-w-[17.9375rem] w-full"
label="Job Title"
name="job_title"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.job_title}
onChange={props.handleChange}
error={(props.errors.job_title && props.touched.job_title) ? props.errors.job_title : ''}
/>
<div className="flex items-center gap-[3.6875rem]">
<InputCompOne
parentClass="max-w-[23.1875rem] w-full"
label="Employers Name"
name="employer_name"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.employer_name}
onChange={props.handleChange}
error={(props.errors.employer_name && props.touched.employer_name) ? props.errors.employer_name : ''}
/>
<InputCompOne
parentClass="max-w-[23.1875rem] w-full"
label="Employers Official Email"
name="employer_email"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.employer_email}
onChange={props.handleChange}
error={(props.errors.employer_email && props.touched.employer_email) ? props.errors.employer_email : ''}
/>
</div>
<div className="flex items-center gap-[9rem]">
<InputCompOne
parentClass="max-w-[17.9375rem] w-full"
label="Resumption Date"
name="date_of_resumption"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputType='date'
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.date_of_resumption}
onChange={props.handleChange}
error={(props.errors.date_of_resumption && props.touched.date_of_resumption) ? props.errors.date_of_resumption : ''}
/>
<InputCompOne
parentClass="max-w-[17.9375rem] w-full"
label="Employee ID."
name="employee_id"
labelSpan="Upload your work ID"
labelSpanClass="text-[11px] text-[#7a7373]"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.employee_id}
onChange={props.handleChange}
error={(props.errors.employee_id && props.touched.employee_id) ? props.errors.employee_id : ''}
/>
</div>
<div className="flex items-center gap-[3.6875rem]">
<InputCompOne
parentClass="max-w-[23.1875rem] w-full"
label="Salary ( Gross annual income )"
name="annual_income"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.annual_income}
onChange={props.handleChange}
error={(props.errors.annual_income && props.touched.annual_income) ? props.errors.annual_income : ''}
/>
<InputCompOne
parentClass="max-w-[23.1875rem] w-full"
label="Salary ( Net monthly Income )"
name="monthly_salary"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.monthly_salary}
onChange={props.handleChange}
error={(props.errors.monthly_salary && props.touched.monthly_salary) ? props.errors.monthly_salary : ''}
/>
</div>
<InputCompOne
parentClass="max-w-[20.3125rem]"
label="Salary Payment Date"
name="salary_payment_date"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputType='date'
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.salary_payment_date}
onChange={props.handleChange}
error={(props.errors.salary_payment_date && props.touched.salary_payment_date) ? props.errors.salary_payment_date : ''}
/>
</div>
</>
<>
<div className="w-full rounded py-3 bg-[#5C2684] px-5">
<p className="text-base text-[#FBB700] tracking-[3%] font-extrabold w-fit">
REFERENCE DETAILS ( Must be 18 years and above )
</p>
</div>
<div className="">
<div className="flex flex-col gap-[3.4375rem]">
<div className="flex flex-col gap-4">
<div className="flex items-center gap-[6.5625rem]">
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Name"
name="ref_name"
labelSpan="1st reference"
labelSpanClass="text-[12px] text-[#5C2684] ml-1"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
value={props.values.ref_name}
onChange={props.handleChange}
error={(props.errors.ref_name && props.touched.ref_name) ? props.errors.ref_name : ''}
/>
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Relationship with He/She"
name="ref_relationship"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] px-[.125rem] rounded-[.375rem]"
value={props.values.ref_relationship}
onChange={props.handleChange}
error={(props.errors.ref_relationship && props.touched.ref_relationship) ? props.errors.ref_relationship : ''}
/>
</div>
<div className="flex items-center gap-[6.5625rem]">
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Phone Number"
name="ref_number"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.ref_number}
onChange={props.handleChange}
error={(props.errors.ref_number && props.touched.ref_number) ? props.errors.ref_number : ''}
/>
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Email Address"
name="ref_email"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.ref_email}
onChange={props.handleChange}
error={(props.errors.ref_email && props.touched.ref_email) ? props.errors.ref_email : ''}
/>
</div>
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="BVN"
name="ref_bvn"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.ref_bvn}
onChange={props.handleChange}
error={(props.errors.ref_bvn && props.touched.ref_bvn) ? props.errors.ref_bvn : ''}
/>
</div>
<div className="flex flex-col gap-4">
<div className="flex items-center gap-[6.5625rem]">
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Name"
name="ref_two_name"
labelSpan="2nd reference"
labelSpanClass="text-[12px] text-[#5C2684] ml-[4px]"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.ref_two_name}
onChange={props.handleChange}
error={(props.errors.ref_two_name && props.touched.ref_two_name) ? props.errors.ref_two_name : ''}
/>
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Relationship with He/She"
name="ref_two_relationship"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.ref_two_relationship}
onChange={props.handleChange}
error={(props.errors.ref_two_relationship && props.touched.ref_two_relationship) ? props.errors.ref_two_relationship : ''}
/>
</div>
<div className="flex items-center gap-[6.5625rem]">
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Phone Number"
name="ref_two_number"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.ref_two_number}
onChange={props.handleChange}
error={(props.errors.ref_two_number && props.touched.ref_two_number) ? props.errors.ref_two_number : ''}
/>
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="Email Address"
name="ref_two_email"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.ref_two_email}
onChange={props.handleChange}
error={(props.errors.ref_two_email && props.touched.ref_two_email) ? props.errors.ref_two_email : ''}
/>
</div>
<InputCompOne
parentClass="max-w-[20.3125rem] w-full"
label="BVN"
name="ref_two_bvn"
parentInputClass="w-full"
labelClass="font-bold text-[1.125rem] leading-[1.3613rem] tracking-[2%] text-[#5C2684] mb-[.125rem]"
input
inputClass="w-full h-[2.25rem] bg-[#EFEFEF] rounded-[.375rem]"
value={props.values.ref_two_bvn}
onChange={props.handleChange}
error={(props.errors.ref_two_bvn && props.touched.ref_two_bvn) ? props.errors.ref_two_bvn : ''}
/>
</div>
</div>
</div>
</>
<Button
className="my-8 max-w-[20.3125rem] btn-R bg-[#5A2C82]"
text="Continue"
type="submit"
/>
</div>
</Form>
)}
</Formik>
</> </>
); );
}; };
+7 -2
View File
@@ -1,10 +1,13 @@
import { FaCaretDown } from "react-icons/fa";
import dashIcon from "../../assets/images/dashboard/dashDefault.svg"; import dashIcon from "../../assets/images/dashboard/dashDefault.svg";
type Props = { type Props = {
name: string; name: string;
fillColor?: string; fillColor?: string;
className?:string;
}; };
export default function Icons({ name, fillColor }: Props) { export default function Icons({ name, fillColor, className }: Props) {
return ( return (
<> <>
{name == "home" ? ( {name == "home" ? (
@@ -106,7 +109,9 @@ export default function Icons({ name, fillColor }: Props) {
fill={fillColor ? fillColor : "#FFF"} fill={fillColor ? fillColor : "#FFF"}
/> />
</svg> </svg>
) : name == "dash-icon" ? ( ) :name == 'arrow-down'?
<FaCaretDown className={`text-xl ${className && className}`} />
:name == "dash-icon" ? (
<img src={dashIcon} alt="dash-icon" /> <img src={dashIcon} alt="dash-icon" />
) : null} ) : null}
</> </>
+54 -18
View File
@@ -1,26 +1,27 @@
import React, { forwardRef } from "react"; import React, { forwardRef } from "react";
import { Icons } from "../Icons";
export interface InputCompOneProps { export interface InputCompOneProps {
label: string; label?: string;
labelClass: string; labelClass?: string;
labelSpan?: string; labelSpan?: string;
labelSpanClass?: string; labelSpanClass?: string;
floatLabel?: string;
placeholder?: string; placeholder?: string;
value?: string; value?: string | any;
onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void; onChange?: (e:any) => any;
onInput?: (e: React.FormEvent<HTMLInputElement>) => void; onInput?: (e:any) => any;
name: string; name: string;
tabIndex?: number; tabIndex?: number;
ref?: React.RefObject<HTMLInputElement>; ref?: React.RefObject<HTMLInputElement>;
selectValue?: string; selectValue?: string;
input?: boolean; input?: boolean;
select?: boolean; select?: boolean;
selectOptions?: { value: string; label: string }[]; selectOptions?: {loading:boolean, data:{ value: string; label: string }[]};
inputType?: string; inputType?: string;
inputClass?: string; inputClass?: string;
parentInputClass?: string; parentInputClass?: string;
selectClass?: string; selectClass?: string;
parentSelectClass?: string;
parentClass?: string; parentClass?: string;
maxLength?: number; maxLength?: number;
error?: string; error?: string;
@@ -33,6 +34,7 @@ const InputCompOne = forwardRef<HTMLInputElement, InputCompOneProps>(
labelClass, labelClass,
labelSpan, labelSpan,
labelSpanClass, labelSpanClass,
floatLabel,
placeholder, placeholder,
value, value,
onChange, onChange,
@@ -42,12 +44,11 @@ const InputCompOne = forwardRef<HTMLInputElement, InputCompOneProps>(
selectValue, selectValue,
input = false, input = false,
select = false, select = false,
selectOptions = [], selectOptions = {loading:false, data:[]},
inputType = "text", inputType = "text",
inputClass, inputClass,
parentInputClass, parentInputClass,
selectClass, selectClass,
parentSelectClass,
parentClass, parentClass,
maxLength, maxLength,
error, error,
@@ -57,14 +58,14 @@ const InputCompOne = forwardRef<HTMLInputElement, InputCompOneProps>(
return ( return (
<div className={parentClass}> <div className={parentClass}>
{label && ( {label && (
<label htmlFor="" className={labelClass}> <label htmlFor={label ? label : floatLabel} className={`flex gap-2 items-center flex-wrap ${labelClass}`}>
{label} {label}
{labelSpan && <span className={labelSpanClass}>{labelSpan}</span>} {labelSpan && <span className={labelSpanClass}>{labelSpan}</span>}
{error && <span className='text-[10px] text-red-500'>{error}</span>} {error && label && <span className='text-[10px] text-red-500'>{error}</span>}
</label> </label>
)} )}
{input && ( {input && (
<div className={parentInputClass}> <div className={`relative ${parentInputClass}`}>
<input <input
type={inputType} type={inputType}
placeholder={placeholder} placeholder={placeholder}
@@ -74,25 +75,60 @@ const InputCompOne = forwardRef<HTMLInputElement, InputCompOneProps>(
name={name} name={name}
tabIndex={tabIndex} tabIndex={tabIndex}
ref={forwardedRef} ref={forwardedRef}
className={inputClass} className={`px-4 ${floatLabel && 'peer pt-4 placeholder:text-transparent'} ${inputClass}`}
maxLength={maxLength} maxLength={maxLength}
id={label ? label : floatLabel}
/> />
{floatLabel &&
<label
htmlFor={label ? label : floatLabel}
className={`flex items-center gap-2 cursor-pointer text-sm text-black/70 dark:text-white absolute left-4 top-0 translate-y-0 peer-focus:top-0 peer-focus:translate-y-0 peer-placeholder-shown:top-1/2 peer-placeholder-shown:-translate-y-1/2 transition-all duration-500`}
>
{floatLabel}
{error && floatLabel && !label && <span className='text-[10px] text-red-500'>{error}</span>}
</label>
}
</div> </div>
)} )}
{select && ( {select && (
<div className={parentSelectClass}> <div className={`relative ${parentInputClass}`}>
<select <select
name={name} name={name}
id="" id={label ? label : floatLabel}
value={selectValue} value={selectValue}
className={selectClass} className={`px-4 appearance-none ${floatLabel && 'peer pt-4'} ${selectClass}`}
onChange={onChange}
> >
{selectOptions.map(({ value, label }) => ( {selectOptions.loading ?
<option value=''>Loading</option>
: selectOptions.data.length ?
selectOptions.data.map(({ value, label }) => (
<option key={value} value={value}>
{label}
</option>
))
:
<option value=''>Not Found</option>
}
{/* {selectOptions.map(({ value, label }) => (
<option key={value} value={value}> <option key={value} value={value}>
{label} {label}
</option> </option>
))} ))} */}
</select> </select>
{floatLabel &&
<label
htmlFor={label ? label : floatLabel}
className={`flex items-center gap-2 cursor-pointer text-sm text-black/70 dark:text-white absolute left-4 top-0 translate-y-0 peer-focus:top-0 peer-focus:translate-y-0 transition-all duration-500`}
>
{floatLabel}
{error && floatLabel && !label && <span className='text-[10px] text-red-500'>{error}</span>}
</label>
}
{/* select custon arrow */}
<div className='absolute right-4 top-1/2 -translate-y-1/2'>
<Icons name='arrow-down' />
</div>
</div> </div>
)} )}
</div> </div>
+1 -1
View File
@@ -8,7 +8,7 @@ interface GetStartedLayoutProps {
const GetStartedLayout: React.FC<GetStartedLayoutProps> = ({ children }) => { const GetStartedLayout: React.FC<GetStartedLayoutProps> = ({ children }) => {
return ( return (
<div className="containerMode mb-[5.4375rem]"> <div className="containerMode mb-[5.4375rem]">
<div className='sticky top-0 bg-white'> <div className='sticky z-50 top-0 bg-white'>
<Header hideSidebar={true} hideMenu={true} /> <Header hideSidebar={true} hideMenu={true} />
</div> </div>
<div className="flex flex-col min-h-[70vh] justify-between"> <div className="flex flex-col min-h-[70vh] justify-between">