Compare commits

..

1 Commits

Author SHA1 Message Date
Elias f63171273e max input length: bvn & code 2024-05-07 15:19:40 +01:00
7 changed files with 531 additions and 596 deletions
-4
View File
@@ -7,7 +7,3 @@ INSTAGRAM_URL=https://www.instagram.com
# BACKEND END POINTS # BACKEND END POINTS
VITE_USERS_ENDPOINT='https://digifi-apidev.chiefsoft.net/digiusers/v1' VITE_USERS_ENDPOINT='https://digifi-apidev.chiefsoft.net/digiusers/v1'
# ENQUIRIES CONTACTS
VITE_CALL_ENDPOINT='09099000000'
VITE_EMAIL_ENDPOINT='fcmbloan@support.com'
-100
View File
@@ -9,12 +9,10 @@
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"@reduxjs/toolkit": "^2.2.1", "@reduxjs/toolkit": "^2.2.1",
"axios": "^1.6.8",
"clsx": "2.1.0", "clsx": "2.1.0",
"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",
@@ -1807,11 +1805,6 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/autoprefixer": { "node_modules/autoprefixer": {
"version": "10.4.18", "version": "10.4.18",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz",
@@ -1849,16 +1842,6 @@
"postcss": "^8.1.0" "postcss": "^8.1.0"
} }
}, },
"node_modules/axios": {
"version": "1.6.8",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
"integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/babel-plugin-macros": { "node_modules/babel-plugin-macros": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
@@ -2047,17 +2030,6 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
}, },
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/commander": { "node_modules/commander": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
@@ -2152,14 +2124,6 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/didyoumean": { "node_modules/didyoumean": {
"version": "1.2.2", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
@@ -2586,25 +2550,6 @@
"integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
"dev": true "dev": true
}, },
"node_modules/follow-redirects": {
"version": "1.15.6",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/foreground-child": { "node_modules/foreground-child": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
@@ -2620,19 +2565,6 @@
"url": "https://github.com/sponsors/isaacs" "url": "https://github.com/sponsors/isaacs"
} }
}, },
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/formik": { "node_modules/formik": {
"version": "2.4.5", "version": "2.4.5",
"resolved": "https://registry.npmjs.org/formik/-/formik-2.4.5.tgz", "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.5.tgz",
@@ -3146,25 +3078,6 @@
"node": ">=8.6" "node": ">=8.6"
} }
}, },
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/minimatch": { "node_modules/minimatch": {
"version": "9.0.3", "version": "9.0.3",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
@@ -3619,11 +3532,6 @@
"resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz",
"integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==" "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA=="
}, },
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/punycode": { "node_modules/punycode": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -3680,14 +3588,6 @@
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
"integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
}, },
"node_modules/react-icons": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz",
"integrity": "sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==",
"peerDependencies": {
"react": "*"
}
},
"node_modules/react-is": { "node_modules/react-is": {
"version": "16.13.1", "version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -152,12 +152,12 @@ const DashboardHomeIntro: FC<DashboardHomeIntroProps> = ({ handleNextStep, step
> >
{(data:any)=>( {(data:any)=>(
<div className="w-full p-4 rounded-lg shadow-lg bg-white overflow-x-auto min-h-[250px] max-h-[450px]"> <div className="w-full p-4 rounded-lg shadow-lg bg-white overflow-x-auto min-h-[250px] max-h-[450px]">
<table className="text-[12px] sm:text-base w-full table-auto"> <table className="w-full table-auto">
<thead> <thead>
<tr className='text-left border-b-2'> <tr className='text-left border-b-2'>
<th className='px-1 py-4'>Date</th> <th className='px-1 py-4'>Date</th>
<th className='px-1 py-4 text-right'>Amount</th> <th className='px-1 py-4 text-right'>Amount</th>
<th className='px-1 py-4 text-center min-w-[110px]'>Payment Term</th> <th className='px-1 py-4 text-center'>Payment Term</th>
<th className='px-1 py-4 text-center'>Status</th> <th className='px-1 py-4 text-center'>Status</th>
<th className='px-1 py-4'>Action</th> <th className='px-1 py-4'>Action</th>
</tr> </tr>
+204 -148
View File
@@ -1,42 +1,42 @@
import React from "react"; import React from 'react';
import * as Yup from "yup"; import * as Yup from 'yup';
import { Form, Formik } from "formik"; import { Form, Formik } from 'formik';
import { InputCompOne } from ".."; import { InputCompOne } from '..';
import {useNavigate} from 'react-router-dom' import { useNavigate } from 'react-router-dom';
import { RouteHandler } from "../../router/routes"; import { RouteHandler } from '../../router/routes';
import { useDispatch } from "react-redux"; import { useDispatch } from 'react-redux';
import { updateUserDetails } from "../../store/UserDetails"; import { updateUserDetails } from '../../store/UserDetails';
import { validateBVN, verifyOTP } from "../../core/apiRequest"; import { validateBVN, verifyOTP } from '../../core/apiRequest';
import { RequestStatus } from "../../core/models"; import { RequestStatus } from '../../core/models';
// To get the validation schema // To get the validation schema
const validationSchema = Yup.object().shape({ const validationSchema = Yup.object().shape({
bvn: Yup.string() bvn: Yup.string()
.required("BVN is required") .required('BVN is required')
.test("no-e", "Invalid number", (value:any) => { .test('no-e', 'Invalid number', (value: any) => {
if (value && /^[0-9]*$/.test(value) == false) { if (value && /^[0-9]*$/.test(value) == false) {
return false; return false;
} }
return true; return true;
}) })
.min(11, "must be 11 digits") .min(11, 'must be 11 digits')
.max(11, "must be 11 digits"), .max(11, 'must be 11 digits'),
otp: Yup.string() otp: Yup.string()
// .when('require_otp', { // .when('require_otp', {
// is: true, // is: true,
// then: Yup.string().required("OTP is required") // then: Yup.string().required("OTP is required")
// }) // })
// .required("OTP is required") // .required("OTP is required")
.test("no-e", "Invalid number", (value:any) => { .test('no-e', 'Invalid number', (value: any) => {
if (value && /^[0-9]*$/.test(value) == false) { if (value && /^[0-9]*$/.test(value) == false) {
return false; return false;
} }
return true; return true;
}) })
.min(5, "must be 5 digits") .min(5, 'must be 5 digits')
.max(5, "must be 5 digits"), .max(5, 'must be 5 digits'),
// .test("no-e", "must be 11 characters", (value:any) => { // .test("no-e", "must be 11 characters", (value:any) => {
// if (value.length < 11) { // if (value.length < 11) {
// return false; // return false;
@@ -52,151 +52,207 @@ let initialValues = {
}; };
type ValidBVN = { type ValidBVN = {
verification_id:string verification_id: string;
valid: undefined | boolean valid: undefined | boolean;
} };
const LetsGetStarted: React.FC = () => { const LetsGetStarted: React.FC = () => {
const dispatch = useDispatch() const dispatch = useDispatch();
const navigate = useNavigate() const navigate = useNavigate();
// const [pinValues, setPinValues] = React.useState({ // const [pinValues, setPinValues] = React.useState({
// bvn: "", // bvn: "",
// otp: "", // otp: "",
// }); // });
// const otpInputRef = React.useRef<HTMLInputElement>(null); // const otpInputRef = React.useRef<HTMLInputElement>(null);
const [requestStatusBVN, setRequestStatusBVN] = React.useState<RequestStatus>({loading:false, status:undefined, message:''}); const [requestStatusBVN, setRequestStatusBVN] = React.useState<RequestStatus>(
{ loading: false, status: undefined, message: '' }
);
const [requestStatusOTP, setRequestStatusOTP] = React.useState<RequestStatus>({loading:false, status:undefined, message:''}); const [requestStatusOTP, setRequestStatusOTP] = React.useState<RequestStatus>(
{ loading: false, status: undefined, message: '' }
);
const [bvnIsValid, setBvnIsValid] = React.useState<ValidBVN>({ const [bvnIsValid, setBvnIsValid] = React.useState<ValidBVN>({
verification_id: '', verification_id: '',
valid: undefined valid: undefined,
}); });
// e: React.FormEvent<HTMLInputElement> // e: React.FormEvent<HTMLInputElement>
// let { value } = e.target as HTMLInputElement; // let { value } = e.target as HTMLInputElement;
const bvnValidation = (values:any) => { // Function to Validate BVN const bvnValidation = (values: any) => {
let bvn = values.bvn // Function to Validate BVN
setRequestStatusBVN({loading:true, status:false, message:''}) let bvn = values.bvn;
validateBVN({bvn}).then(res => { setRequestStatusBVN({ loading: true, status: false, message: '' });
if(!res || !res.data.call_return){ validateBVN({ bvn })
setBvnIsValid({verification_id:'', valid: false}) .then((res) => {
setRequestStatusBVN({loading:false, status:false, message:'unable to verify BVN'}) if (!res || !res.data.call_return) {
return setTimeout(()=>{ setBvnIsValid({ verification_id: '', valid: false });
setRequestStatusBVN({loading:false, status:false, message:''}) setRequestStatusBVN({
}, 4000) loading: false,
} status: false,
setBvnIsValid({verification_id:res.data.verification_id, valid: true}) message: 'unable to verify BVN',
setRequestStatusBVN({loading:false, status:true, message:'verified'}) });
}).catch(err => { return setTimeout(() => {
setBvnIsValid({verification_id:'', valid: false}) setRequestStatusBVN({ loading: false, status: false, message: '' });
console.log(err) }, 4000);
}) }
setBvnIsValid({
verification_id: res.data.verification_id,
valid: true,
});
setRequestStatusBVN({
loading: false,
status: true,
message: 'verified',
});
})
.catch((err) => {
setBvnIsValid({ verification_id: '', valid: false });
console.log(err);
});
}; };
const handleSubmit = (values:any) => { // Function to VERIFY OTP AND LOGIN USER const handleSubmit = (values: any) => {
setRequestStatusOTP({loading:true, status:false, message:''}) // Function to VERIFY OTP AND LOGIN USER
setRequestStatusOTP({ loading: true, status: false, message: '' });
// console.log('values', values) // console.log('values', values)
verifyOTP({...values, verification_id:bvnIsValid.verification_id}).then(res=>{ verifyOTP({ ...values, verification_id: bvnIsValid.verification_id })
if(!res || !res.data.call_return){ .then((res) => {
setRequestStatusOTP({loading:false, status:false, message:'wrong otp'}) if (!res || !res.data.call_return) {
return setTimeout(()=>{ setRequestStatusOTP({
setRequestStatusOTP({loading:false, status:false, message:''}) loading: false,
},4000) status: false,
} message: 'wrong otp',
// console.log(res.data) });
localStorage.setItem('token', res.data?.token) return setTimeout(() => {
localStorage.setItem('uid', res?.data?.customer[0]?.uid) setRequestStatusOTP({ loading: false, status: false, message: '' });
dispatch(updateUserDetails({ ...res?.data?.customer[0] })); }, 4000);
navigate(RouteHandler.dashboardHome, {replace:true}) }
}).catch(err => { // console.log(res.data)
setRequestStatusOTP({loading:false, status:false, message:'something went wrong, try again'}) localStorage.setItem('token', res.data?.token);
console.log(err) localStorage.setItem('uid', res?.data?.customer[0]?.uid);
return setTimeout(()=>{ dispatch(updateUserDetails({ ...res?.data?.customer[0] }));
setRequestStatusOTP({loading:false, status:false, message:''}) navigate(RouteHandler.dashboardHome, { replace: true });
},4000) })
}) .catch((err) => {
setRequestStatusOTP({
loading: false,
status: false,
message: 'something went wrong, try again',
});
console.log(err);
return setTimeout(() => {
setRequestStatusOTP({ loading: false, status: false, message: '' });
}, 4000);
});
}; };
return ( return (
<Formik <Formik
initialValues={initialValues} initialValues={initialValues}
validationSchema={validationSchema} validationSchema={validationSchema}
onSubmit={bvnIsValid.valid ? handleSubmit : bvnValidation} onSubmit={bvnIsValid.valid ? handleSubmit : bvnValidation}
> >
{(props:any) => ( {(props: any) => (
<Form className=""> <Form className="">
<div className="w-full"> <div className="w-full">
<div className="containerMode flex justify-between gap-1 xl:gap-8 flex-col"> <div className="containerMode flex justify-between gap-1 xl:gap-8 flex-col">
<div className="my-[4rem] flex items-center justify-center w-full"> <div className="my-[4rem] flex items-center justify-center w-full">
<h1 className="font-bold text-[2.375rem] text-[#5C2684] my-[.5rem] text-center"> <h1 className="font-bold text-[2.375rem] text-[#5C2684] my-[.5rem] text-center">
Lets Get You Started Lets Get You Started
</h1> </h1>
</div>
<div className="mx-auto flex flex-col gap-8 max-w-[31.625rem] ">
<div className='w-full'>
<InputCompOne
parentClass="flex flex-col gap-2"
label="Enter Your BVN "
name="bvn"
parentInputClass="w-full"
labelSpan="( To get your BVN, dial *565*0# )"
labelSpanClass="text-[13px] text-[#5a5a5a] font-semibold"
placeholder="Enter your BVN"
labelClass="font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#282828] mb-[2px] flex item-center gap-[4px]"
input
inputClass="w-full h-[3.625rem] rounded bg-[#EFEFEF] px-4"
value={props.values.bvn}
onChange={props.handleChange}
error={(props.errors.bvn && props.touched.bvn) && props.errors.bvn}
/>
<p className={`p-2 ${!requestStatusBVN.status ? 'text-red-500' : 'text-emerald-500'}`}>{requestStatusBVN.loading ? 'verifying...' : requestStatusBVN.message}</p>
</div> </div>
{bvnIsValid.valid && ( <div className="mx-auto flex flex-col gap-8 max-w-[31.625rem] ">
<InputCompOne <div className="w-full">
parentClass="flex flex-col gap-2" <InputCompOne
label="Enter OTP " parentClass="flex flex-col gap-2"
name="otp" label="Enter Your BVN "
parentInputClass="w-full" name="bvn"
labelSpan="( Please check your BVN phone number for verification pin )" parentInputClass="w-full"
labelSpanClass="text-[13px] text-[#5a5a5a] font-semibold" labelSpan="( To get your BVN, dial *565*0# )"
placeholder="Enter your OTP" labelSpanClass="text-[13px] text-[#5a5a5a] font-semibold"
labelClass="font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#282828] mb-[2px] flex item-center gap-[4px]" placeholder="Enter your BVN"
input labelClass="font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#282828] mb-[2px] flex item-center gap-[4px]"
inputClass="w-full h-[3.625rem] rounded bg-[#EFEFEF] px-4" input
value={props.values.otp} inputClass="w-full h-[3.625rem] rounded bg-[#EFEFEF] px-4"
onChange={props.handleChange} value={props.values.bvn}
error={(props.errors.otp && props.touched.otp) && props.errors.otp} onChange={props.handleChange}
/> error={
)} props.errors.bvn && props.touched.bvn && props.errors.bvn
<button }
type='submit' maxLength={11}
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" />
disabled={requestStatusBVN.loading || (!props.values.otp && bvnIsValid.valid)} <p
> className={`p-2 ${
Enter !requestStatusBVN.status
</button> ? 'text-red-500'
: 'text-emerald-500'
}`}
>
{requestStatusBVN.loading
? 'verifying...'
: requestStatusBVN.message}
</p>
</div>
{bvnIsValid.valid && (
<InputCompOne
parentClass="flex flex-col gap-2"
label="Enter OTP "
name="otp"
parentInputClass="w-full"
labelSpan="( Please check your BVN phone number for verification pin )"
labelSpanClass="text-[13px] text-[#5a5a5a] font-semibold"
placeholder="Enter your OTP"
labelClass="font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#282828] mb-[2px] flex item-center gap-[4px]"
input
inputClass="w-full h-[3.625rem] rounded bg-[#EFEFEF] px-4"
value={props.values.otp}
onChange={props.handleChange}
error={
props.errors.otp && props.touched.otp && props.errors.otp
}
maxLength={5}
/>
)}
<button
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"
disabled={
requestStatusBVN.loading ||
(!props.values.otp && bvnIsValid.valid)
}
>
Enter
</button>
<p className={`p-2 ${!requestStatusOTP.status ? 'text-red-500' : 'text-emerald-500'}`}>{requestStatusOTP.message}</p> <p
className={`p-2 ${
!requestStatusOTP.status
? 'text-red-500'
: 'text-emerald-500'
}`}
>
{requestStatusOTP.message}
</p>
{bvnIsValid.valid || bvnIsValid.valid == undefined ? ( {bvnIsValid.valid || bvnIsValid.valid == undefined ? (
<p className="text-[#5C2684] mt-[1.5625rem] w-fit"> <p className="text-[#5C2684] mt-[1.5625rem] w-fit">
***Every personal information attached to your BVN is safe and ***Every personal information attached to your BVN is safe
secure. It is only important for us to verify your information and and secure. It is only important for us to verify your
also give you access to your application profile/account. information and also give you access to your application
</p> profile/account.
) : ( </p>
<p className="text-[#5C2684] mt-[1.5625rem] w-fit"> ) : (
***Did not receive OTP? Click to resend <p className="text-[#5C2684] mt-[1.5625rem] w-fit">
</p> ***Did not receive OTP? Click to resend
)} </p>
)}
</div>
</div> </div>
</div> </div>
</div> </Form>
</Form> )}
)}
</Formik> </Formik>
); );
}; };
+36 -48
View File
@@ -1,27 +1,26 @@
import { useState } from 'react'; import { useState } from "react";
import { Link, useLocation } from 'react-router-dom'; import { Link, useLocation } from "react-router-dom";
import Logo from '../../assets/icons/logo.svg'; import Logo from "../../assets/icons/logo.svg";
import { Icons } from '../../components'; import { Icons } from "../../components";
import { contactDetails } from '../../utils/data';
type Props = { type Props = {
asideDisplay?: () => void; asideDisplay?: () => void;
logoutUser: () => void; logoutUser: () => void
}; };
export default function Aside({ asideDisplay, logoutUser }: Props) { export default function Aside({ asideDisplay, logoutUser }: Props) {
const { pathname } = useLocation(); const { pathname } = useLocation();
const [openNestedLink, setOpenNestedLink] = useState<{ name: string | null }>( const [openNestedLink, setOpenNestedLink] = useState<{ name: string | null }>(
{ name: '' } { name: "" }
); );
const handleOpenNestedLink = (e: any) => { const handleOpenNestedLink = (e: any) => {
if (!e || !e.target) { if (!e || !e.target) {
return setOpenNestedLink({ name: '' }); return setOpenNestedLink({ name: "" });
} }
if (openNestedLink.name && openNestedLink.name == e.target.name) { if (openNestedLink.name && openNestedLink.name == e.target.name) {
setOpenNestedLink({ name: '' }); setOpenNestedLink({ name: "" });
} else { } else {
setOpenNestedLink({ name: e.target.name }); setOpenNestedLink({ name: e.target.name });
} }
@@ -46,8 +45,8 @@ export default function Aside({ asideDisplay, logoutUser }: Props) {
onClick={(e) => handleOpenNestedLink(e)} onClick={(e) => handleOpenNestedLink(e)}
className={`py-2 pl-2 text-left relative w-full overflow-hidden rounded-lg flex justify-between items-center z-10 bg-inherit ${ className={`py-2 pl-2 text-left relative w-full overflow-hidden rounded-lg flex justify-between items-center z-10 bg-inherit ${
allNestedLinks.includes(pathname) allNestedLinks.includes(pathname)
? ' text-[#5C2684]' ? " text-[#5C2684]"
: ' text-[#585858]' : " text-[#585858]"
}`} }`}
> >
{link.name} {link.name}
@@ -61,8 +60,8 @@ export default function Aside({ asideDisplay, logoutUser }: Props) {
<div <div
className={`transition-all duration-300 w-full z-1 ${ className={`transition-all duration-300 w-full z-1 ${
openNestedLink.name == link.name openNestedLink.name == link.name
? 'relative top-0' ? "relative top-0"
: 'absolute -top-[500px]' : "absolute -top-[500px]"
}`} }`}
> >
{link.nestedLink.map((nextLink, index) => ( {link.nestedLink.map((nextLink, index) => (
@@ -71,17 +70,17 @@ export default function Aside({ asideDisplay, logoutUser }: Props) {
asideDisplay && asideDisplay(); asideDisplay && asideDisplay();
}} }}
key={index} key={index}
to={nextLink.link ? nextLink.link : '#'} to={nextLink.link ? nextLink.link : "#"}
className={`w-full my-1 flex items-center gap-2 py-2 pl-5 text-base font-medium ${ className={`w-full my-1 flex items-center gap-2 py-2 pl-5 text-base font-medium ${
pathname == nextLink.link pathname == nextLink.link
? ' text-[#5C2684]' ? " text-[#5C2684]"
: 'text-[#585858]' : "text-[#585858]"
}`} }`}
> >
<Icons <Icons
name={nextLink.icon} name={nextLink.icon}
fillColor={`${ fillColor={`${
pathname == nextLink.link ? '#5C2684' : '#585858' pathname == nextLink.link ? "#5C2684" : "#585858"
}`} }`}
/> />
{nextLink.name} {nextLink.name}
@@ -97,14 +96,14 @@ export default function Aside({ asideDisplay, logoutUser }: Props) {
asideDisplay && asideDisplay(); asideDisplay && asideDisplay();
}} }}
key={index} key={index}
to={link.link ? link.link : '#'} to={link.link ? link.link : "#"}
className={`w-full my-4 flex items-center gap-2 py-2 pl-5 rounded-lg text-base font-medium ${ className={`w-full my-4 flex items-center gap-2 py-2 pl-5 rounded-lg text-base font-medium ${
pathname == link.link ? 'text-[#5C2684]' : 'text-[#585858]' pathname == link.link ? "text-[#5C2684]" : "text-[#585858]"
}`} }`}
> >
<Icons <Icons
name={link.icon} name={link.icon}
fillColor={`${pathname == link.link ? '#5C2684' : '#585858'}`} fillColor={`${pathname == link.link ? "#5C2684" : "#585858"}`}
/> />
{link.name} {link.name}
</Link> </Link>
@@ -120,25 +119,19 @@ export default function Aside({ asideDisplay, logoutUser }: Props) {
Log out Log out
</button> </button>
<div className="flex flex-col gap-[.4375rem] text-[.75rem]"> <div className="flex flex-col gap-[.4375rem] text-[.75rem]">
<p className="font-extrabold tracking-[3%] text-[#FBB700] underline"> <p className="font-extrabold tracking-[3%] text-[#FBB700] underline">
For more enquiries and support For more enquiries and support
</p> </p>
{/* <p className="font-extrabold tracking-[3%] text-[#5A5A5A]"> <p className="font-extrabold tracking-[3%] text-[#5A5A5A]">
Call: 09099000000 Call: 09099000000
</p> </p>
<p className="font-extrabold tracking-[3%] text-[#5A5A5A]"> <p className="font-extrabold tracking-[3%] text-[#5A5A5A]">
Email: fcmbloan@support.com Email: fcmbloan@support.com
</p> */} </p>
{contactDetails.map(({ name, value }) => (
<p
key={name}
className="font-extrabold tracking-[3%] text-[#5A5A5A]"
>
{name}: {value}
</p>
))}
</div> </div>
</div> </div>
</div> </div>
); );
@@ -156,34 +149,29 @@ type AsideLinksType = {
}[]; }[];
const asideLinks: AsideLinksType = [ const asideLinks: AsideLinksType = [
{ name: "Dashboard", link: "/dashboard/home", icon: "dash-icon", nestedLink: [] },
{ {
name: 'Dashboard', name: "Your Profile",
link: '/dashboard/home', link: "/dashboard/profile",
icon: 'dash-icon', icon: "dash-icon",
nestedLink: [], nestedLink: [],
}, },
{ {
name: 'Your Profile', name: "Employment Details",
link: '/dashboard/profile', link: "/dashboard/verification",
icon: 'dash-icon', icon: "dash-icon",
nestedLink: [], nestedLink: [],
}, },
{ {
name: 'Employment Details', name: "Reference Details",
link: '/dashboard/verification', link: "/dashboard/payments",
icon: 'dash-icon', icon: "dash-icon",
nestedLink: [], nestedLink: [],
}, },
{ {
name: 'Reference Details', name: "Agreements",
link: '/dashboard/payments', link: "/dashboard/legals",
icon: 'dash-icon', icon: "dash-icon",
nestedLink: [],
},
{
name: 'Agreements',
link: '/dashboard/legals',
icon: 'dash-icon',
nestedLink: [], nestedLink: [],
}, },
// {name: 'Nested Link', icon: 'home', nestedLink:[ // {name: 'Nested Link', icon: 'home', nestedLink:[
@@ -83,8 +83,8 @@ export default function DashboardLayout({ children }: { children: ReactNode }) {
</div> </div>
</div> </div>
</header> </header>
<div className="flex p-2 md:p-5 relative"> <div className="flex p-5 relative">
<div className="w-full p-2 md:p-5">{children}</div> <div className="w-full p-5">{children}</div>
</div> </div>
</main> </main>
</div> </div>
+286 -291
View File
@@ -1,561 +1,556 @@
import FBook from '../assets/icons/facebook.svg'; import FBook from "../assets/icons/facebook.svg";
import Twitter from '../assets/icons/twitter.svg'; import Twitter from "../assets/icons/twitter.svg";
import Instagram from '../assets/icons/instagram.svg'; import Instagram from "../assets/icons/instagram.svg";
import FBookWhite from '../assets/images/socials/facebook.svg'; import FBookWhite from "../assets/images/socials/facebook.svg";
import LinkedInWhite from '../assets/images/socials/linkedin.svg'; import LinkedInWhite from "../assets/images/socials/linkedin.svg";
import XWhite from '../assets/images/socials/twitterx.svg'; import XWhite from "../assets/images/socials/twitterx.svg";
import WhatsappWhite from '../assets/images/socials/whatsapp.svg'; import WhatsappWhite from "../assets/images/socials/whatsapp.svg";
import YoutubeWhite from '../assets/images/socials/youtube.svg'; import YoutubeWhite from "../assets/images/socials/youtube.svg";
import InstagramWhite from '../assets/images/socials/instagram.svg'; import InstagramWhite from "../assets/images/socials/instagram.svg";
import { RouteHandler } from '../router/routes'; import { RouteHandler } from "../router/routes";
let process = import.meta.env; let process = import.meta.env;
export const top_header_data = [ export const top_header_data = [
{ id: 1, name: 'HOME', href: RouteHandler.homepage }, { id: 1, name: "HOME", href: RouteHandler.homepage },
{ id: 2, name: 'PERSONAL', href: RouteHandler.personalBanking }, { id: 2, name: "PERSONAL", href: RouteHandler.personalBanking },
{ id: 3, name: 'BUSINESS', href: RouteHandler.businessBanking }, { id: 3, name: "BUSINESS", href: RouteHandler.businessBanking },
{ id: 4, name: 'CORPORATE', href: RouteHandler.cooperateBanking }, { id: 4, name: "CORPORATE", href: RouteHandler.cooperateBanking },
]; ];
export const lowerMenuItems = [ export const lowerMenuItems = [
{ {
id: 1, id: 1,
name: 'PERSONAL BANKING', name: "PERSONAL BANKING",
linkPath: '/personal-banking', linkPath: "/personal-banking",
}, },
{ {
id: 2, id: 2,
name: 'BUSINESS BANKING', name: "BUSINESS BANKING",
linkPath: '/business-banking', linkPath: "/business-banking",
}, },
{ {
id: 3, id: 3,
name: 'CORPORATE BANKING', name: "CORPORATE BANKING",
linkPath: '/cooperate-banking', linkPath: "/cooperate-banking",
}, },
{ {
id: 4, id: 4,
name: 'GROUP & SUBSIDIARIES', name: "GROUP & SUBSIDIARIES",
linkPath: '', linkPath: "",
}, },
{ {
id: 5, id: 5,
name: 'ABOUT US', name: "ABOUT US",
linkPath: '/about-us', linkPath: "/about-us",
}, },
{ {
id: 6, id: 6,
name: 'MY BANK AND I', name: "MY BANK AND I",
linkPath: '', linkPath: "",
}, },
]; ];
export const _lowerMenuItems = [ export const _lowerMenuItems = [
{ {
name: 'PERSONAL BANKING', name: "PERSONAL BANKING",
linkPath: '/personal-banking', linkPath: "/personal-banking",
subItems: [ subItems: [
{ {
name: 'CURRENT ACCOUNTS', name: "CURRENT ACCOUNTS",
linkPath: '/current-accounts', linkPath: "/current-accounts",
subItems: [ subItems: [
{ {
name: 'CLASSIC CURRENT ACCOUNT', name: "CLASSIC CURRENT ACCOUNT",
linkPath: '/personal-classic-current-account', linkPath: "/personal-classic-current-account",
}, },
{ {
name: 'PREMIUM CURRENT ACCOUNT', name: "PREMIUM CURRENT ACCOUNT",
linkPath: '/premium-current-account', linkPath: "/premium-current-account",
}, },
{ {
name: 'PERSONAL BUSINESS ACCOUNT', name: "PERSONAL BUSINESS ACCOUNT",
linkPath: '/personal-business-account', linkPath: "/personal-business-account",
}, },
{ {
name: 'DOMICILIARY CURRENT ACCOUNT', name: "DOMICILIARY CURRENT ACCOUNT",
linkPath: '/domiciliary-current-account', linkPath: "/domiciliary-current-account",
}, },
], ],
}, },
{ {
name: 'SAVINGS ACCOUNTS', name: "SAVINGS ACCOUNTS",
linkPath: '/savings-accounts', linkPath: "/savings-accounts",
subItems: [ subItems: [
{ name: 'FCMB EASY ACCOUNT', linkPath: '/easy-account' }, { name: "FCMB EASY ACCOUNT", linkPath: "/easy-account" },
{ name: 'KIDS (0-17 YRS)', linkPath: '/kids' }, { name: "KIDS (0-17 YRS)", linkPath: "/kids" },
{ name: 'FLEXX (18-30 YRS)', linkPath: '/flexx-account' }, { name: "FLEXX (18-30 YRS)", linkPath: "/flexx-account" },
{ {
name: 'CLASSIC SAVINGS ACCOUNT', name: "CLASSIC SAVINGS ACCOUNT",
linkPath: '/classic-savings-account', linkPath: "/classic-savings-account",
}, },
{ {
name: 'PREMIUM SAVINGS ACCOUNT', name: "PREMIUM SAVINGS ACCOUNT",
linkPath: '/fcmb-premium-savings-account', linkPath: "/fcmb-premium-savings-account",
}, },
{ {
name: 'FCMB SALARY SAVINGS ACCOUNT', name: "FCMB SALARY SAVINGS ACCOUNT",
linkPath: '/fcmb-salary-savings-account', linkPath: "/fcmb-salary-savings-account",
}, },
{ {
name: 'DOMICILIARY SAVINGS ACCOUNT', name: "DOMICILIARY SAVINGS ACCOUNT",
linkPath: '/domiciliary-savings-account', linkPath: "/domiciliary-savings-account",
}, },
], ],
}, },
{ {
name: 'INVESTMENTS', name: "INVESTMENTS",
linkPath: '/investment-accounts', linkPath: "/investment-accounts",
subItems: [ subItems: [
{ name: 'FIXED DEPOSITS', linkPath: '/fixed-deposits' }, { name: "FIXED DEPOSITS", linkPath: "/fixed-deposits" },
{ name: 'GRO (App)', linkPath: '/GRO' }, { name: "GRO (App)", linkPath: "/GRO" },
{ name: 'GRO (Web)', linkPath: 'https://www.investwithgro.com/' }, { name: "GRO (Web)", linkPath: "https://www.investwithgro.com/" },
{ {
name: 'I-NEST SAVING', name: "I-NEST SAVING",
linkPath: 'https://i-nest.fcmb.com/#/welcome', linkPath: "https://i-nest.fcmb.com/#/welcome",
}, },
{ name: 'CALL DEPOSITS', linkPath: '/call-deposits' }, { name: "CALL DEPOSITS", linkPath: "/call-deposits" },
{ {
name: 'EDUCATION INVESTMENT PLAN', name: "EDUCATION INVESTMENT PLAN",
linkPath: '/education-investment', linkPath: "/education-investment",
}, },
{ {
name: 'MUTUAL FUNDS', name: "MUTUAL FUNDS",
linkPath: 'https://www.fcmbassetmanagement.com/mutual-funds/', linkPath: "https://www.fcmbassetmanagement.com/mutual-funds/",
}, },
], ],
}, },
{ {
name: 'LOANS AND CREDIT CARDS', name: "LOANS AND CREDIT CARDS",
linkPath: '/loans-and-credit-cards', linkPath: "/loans-and-credit-cards",
subItems: [ subItems: [
{ name: 'FASTCASH', linkPath: '/fastcash' }, { name: "FASTCASH", linkPath: "/fastcash" },
{ name: 'SALARY PLUS LOAN', linkPath: '/salary-plus-loan' }, { name: "SALARY PLUS LOAN", linkPath: "/salary-plus-loan" },
{ name: 'PREMIUM SALARY LOAN', linkPath: '/premium-salary-loan' }, { name: "PREMIUM SALARY LOAN", linkPath: "/premium-salary-loan" },
{ name: 'AUTO LOAN', linkPath: '/auto-loan' }, { name: "AUTO LOAN", linkPath: "/auto-loan" },
{ name: 'AIRTIME LOAN', linkPath: '/airtime-loan' }, { name: "AIRTIME LOAN", linkPath: "/airtime-loan" },
{ name: 'CREDIT CARDS', linkPath: '/credit-cards' }, { name: "CREDIT CARDS", linkPath: "/credit-cards" },
{ {
name: 'EASYLIFT LOAN', name: "EASYLIFT LOAN",
linkPath: 'https://easyliftloanform.fcmb.com', linkPath: "https://easyliftloanform.fcmb.com",
}, },
{ name: 'MORTGAGE', linkPath: 'http://mortgage.fcmb.com/' }, { name: "MORTGAGE", linkPath: "http://mortgage.fcmb.com/" },
], ],
}, },
{ {
name: 'NON-RESIDENT NIGERIAN (NRN) BANKING', name: "NON-RESIDENT NIGERIAN (NRN) BANKING",
linkPath: 'https://www.fcmb.com/non-resident-nigerian', linkPath: "https://www.fcmb.com/non-resident-nigerian",
}, },
{ {
name: 'WAYS TO BANK', name: "WAYS TO BANK",
linkPath: '/ways-to-bank', linkPath: "/ways-to-bank",
subItems: [ subItems: [
{ name: 'FCMB MOBILE', linkPath: '/fcmb-mobile' }, { name: "FCMB MOBILE", linkPath: "/fcmb-mobile" },
{ {
name: 'RETAIL INTERNET BANKING', name: "RETAIL INTERNET BANKING",
linkPath: 'https://ibank.fcmb.com/', linkPath: "https://ibank.fcmb.com/",
}, },
{ name: 'USSD BANKING', linkPath: '/ussd' }, { name: "USSD BANKING", linkPath: "/ussd" },
{ name: 'OUR BRANCH NETWORK', linkPath: '/branch-network' }, { name: "OUR BRANCH NETWORK", linkPath: "/branch-network" },
{ name: 'OUR ATM NETWORK', linkPath: '/atm-network' }, { name: "OUR ATM NETWORK", linkPath: "/atm-network" },
{ name: 'FLASHMECASH', linkPath: '/flashme-cash' }, { name: "FLASHMECASH", linkPath: "/flashme-cash" },
{ name: 'OUR CARDS', linkPath: '/our-cards' }, { name: "OUR CARDS", linkPath: "/our-cards" },
{ name: 'FCMB ELECTRONIC CHANNELS', linkPath: '/e-channels' }, { name: "FCMB ELECTRONIC CHANNELS", linkPath: "/e-channels" },
{ name: 'AGENT BANKING', linkPath: '/agent-banking' }, { name: "AGENT BANKING", linkPath: "/agent-banking" },
{ {
name: 'FCMB SECURE COMMUNICATION', name: "FCMB SECURE COMMUNICATION",
linkPath: '/secure-communication', linkPath: "/secure-communication",
}, },
{ name: 'TEMI', linkPath: '/temi' }, { name: "TEMI", linkPath: "/temi" },
], ],
}, },
{ name: 'BANCASSURANCE', linkPath: '/bancassurance' }, { name: "BANCASSURANCE", linkPath: "/bancassurance" },
], ],
}, },
{ {
name: 'BUSINESS BANKING', name: "BUSINESS BANKING",
linkPath: '/business-banking', linkPath: "/business-banking",
subItems: [ subItems: [
{ {
name: 'PROPOSITIONS', name: "PROPOSITIONS",
linkPath: '', linkPath: "",
subItems: [ subItems: [
{ name: 'SHEVENTURES', linkPath: '/she-ventures' }, { name: "SHEVENTURES", linkPath: "/she-ventures" },
{ name: 'BUSINESS ZONE', linkPath: 'https://businesszone.fcmb.com/' }, { name: "BUSINESS ZONE", linkPath: "https://businesszone.fcmb.com/" },
{ {
name: 'FOOD BUSINESS SUPPORT', name: "FOOD BUSINESS SUPPORT",
linkPath: 'https://www.fcmb.com/food-business-support/', linkPath: "https://www.fcmb.com/food-business-support/",
}, },
{ name: 'SCHOOL BUSINESS SUPPORT', linkPath: '/school-support' }, { name: "SCHOOL BUSINESS SUPPORT", linkPath: "/school-support" },
], ],
}, },
{ {
name: 'CURRENT ACCOUNTS', name: "CURRENT ACCOUNTS",
linkPath: '/business-current-accounts', linkPath: "/business-current-accounts",
subItems: [ subItems: [
{ {
name: 'CORPORATE CURRENT ACCOUNT', name: "CORPORATE CURRENT ACCOUNT",
linkPath: '/corporate-current-account', linkPath: "/corporate-current-account",
}, },
{ name: 'FCMB BUSINESS ACCOUNT', linkPath: '/fcmb-business-account' }, { name: "FCMB BUSINESS ACCOUNT", linkPath: "/fcmb-business-account" },
{ {
name: 'DOMICILIARY CURRENT ACCOUNT', name: "DOMICILIARY CURRENT ACCOUNT",
linkPath: '/business-domiciliary-current-account', linkPath: "/business-domiciliary-current-account",
}, },
], ],
}, },
{ {
name: 'SAVINGS ACCOUNTS', name: "SAVINGS ACCOUNTS",
linkPath: '/node/178', linkPath: "/node/178",
subItems: [ subItems: [
{ {
name: 'BUSINESS SAVINGS ACCOUNT', name: "BUSINESS SAVINGS ACCOUNT",
linkPath: '/business-savings-account', linkPath: "/business-savings-account",
}, },
], ],
}, },
{ {
name: 'LOANS', name: "LOANS",
linkPath: '/business-loans', linkPath: "/business-loans",
subItems: [ subItems: [
{ {
name: 'SME DEVELOPMENT FINANCE FACILITY', name: "SME DEVELOPMENT FINANCE FACILITY",
linkPath: '/sme-development-finance-facility', linkPath: "/sme-development-finance-facility",
}, },
{ {
name: 'SME ASSET FINANCE FACILITY', name: "SME ASSET FINANCE FACILITY",
linkPath: '/sme-asset-finance-facility', linkPath: "/sme-asset-finance-facility",
}, },
{ {
name: 'SME WORKING CAPITAL FACILITY', name: "SME WORKING CAPITAL FACILITY",
linkPath: '/sme-working-capital-facility', linkPath: "/sme-working-capital-facility",
}, },
{ name: 'QUICK LOAN', linkPath: '/quick-loan' }, { name: "QUICK LOAN", linkPath: "/quick-loan" },
{ {
name: 'SME INVOICE DISCOUNTING FINANCE (IDF) FACILITY', name: "SME INVOICE DISCOUNTING FINANCE (IDF) FACILITY",
linkPath: '/invoice-discounting-loan', linkPath: "/invoice-discounting-loan",
}, },
{ {
name: 'SME LOCAL PURCHASE ORDER (LPO) FINANCE FACILITY', name: "SME LOCAL PURCHASE ORDER (LPO) FINANCE FACILITY",
linkPath: '/local-purchase-order-loan', linkPath: "/local-purchase-order-loan",
}, },
], ],
}, },
{ name: 'BONDS & GUARANTEES', linkPath: '/bonds-and-guarantees' }, { name: "BONDS & GUARANTEES", linkPath: "/bonds-and-guarantees" },
{ name: 'INTERVENTION FUNDS', linkPath: '/intervention-funds' }, { name: "INTERVENTION FUNDS", linkPath: "/intervention-funds" },
{ name: 'TRADE SERVICE', linkPath: '/trade-service' }, { name: "TRADE SERVICE", linkPath: "/trade-service" },
{ {
name: 'PAYMENT & COLLECTION', name: "PAYMENT & COLLECTION",
linkPath: '/payment-and-collection', linkPath: "/payment-and-collection",
subItems: [ subItems: [
{ name: 'COLLECTION SOLUTIONS', linkPath: '/collection-solutions' }, { name: "COLLECTION SOLUTIONS", linkPath: "/collection-solutions" },
{ name: 'PAYMENT SOLUTIONS', linkPath: '/payment-solutions' }, { name: "PAYMENT SOLUTIONS", linkPath: "/payment-solutions" },
], ],
}, },
{ {
name: 'WAYS TO BANK', name: "WAYS TO BANK",
linkPath: '/business-ways-to-bank', linkPath: "/business-ways-to-bank",
subItems: [ subItems: [
{ {
name: 'BUSINESS INTERNET BANKING', name: "BUSINESS INTERNET BANKING",
linkPath: 'https://ibank.fcmb.com/corporate/BbgLoginScreenUI.aspx', linkPath: "https://ibank.fcmb.com/corporate/BbgLoginScreenUI.aspx",
}, },
{ {
name: 'CORPORATE INTERNET BANKING', name: "CORPORATE INTERNET BANKING",
linkPath: 'https://www.fcmbonline.com/', linkPath: "https://www.fcmbonline.com/",
}, },
{ name: 'OUR ATM NETWORK', linkPath: '/atm-network2' }, { name: "OUR ATM NETWORK", linkPath: "/atm-network2" },
{ name: 'FCMB ONLINE', linkPath: '/fcmb-online-business' }, { name: "FCMB ONLINE", linkPath: "/fcmb-online-business" },
{ {
name: 'FCMB ELECTRONIC CHANNELS', name: "FCMB ELECTRONIC CHANNELS",
linkPath: 'https://www.fcmb.com/e-channels', linkPath: "https://www.fcmb.com/e-channels",
}, },
{ name: 'FCMB BUSINESS APP', linkPath: '/FCMB-business-app' }, { name: "FCMB BUSINESS APP", linkPath: "/FCMB-business-app" },
], ],
}, },
], ],
}, },
{ {
name: 'CORPORATE BANKING', name: "CORPORATE BANKING",
linkPath: '/cooperate-banking', linkPath: "/cooperate-banking",
subItems: [ subItems: [
{ {
name: 'FOREIGN EXCHANGE SERVICES', name: "FOREIGN EXCHANGE SERVICES",
linkPath: '/foreign-exchange-services', linkPath: "/foreign-exchange-services",
}, },
{ name: 'TRADE SERVICES', linkPath: '/node/166' }, { name: "TRADE SERVICES", linkPath: "/node/166" },
{ name: 'CASH MANAGEMENT SOLUTIONS', linkPath: '/cash-management' }, { name: "CASH MANAGEMENT SOLUTIONS", linkPath: "/cash-management" },
{ name: 'CORPORATE FINANCE', linkPath: '/corporate-finance' }, { name: "CORPORATE FINANCE", linkPath: "/corporate-finance" },
], ],
}, },
{ {
name: 'GROUP & SUBSIDIARIES', name: "GROUP & SUBSIDIARIES",
linkPath: '', linkPath: "",
subItems: [ subItems: [
{ name: 'FCMB GROUP PLC', linkPath: 'https://www.fcmbgroup.com/' }, { name: "FCMB GROUP PLC", linkPath: "https://www.fcmbgroup.com/" },
{ {
name: 'CSL STOCKBROKERS', name: "CSL STOCKBROKERS",
linkPath: 'https://www.cslstockbrokers.com/', linkPath: "https://www.cslstockbrokers.com/",
}, },
{ {
name: 'FCMB CAPITAL MARKETS', name: "FCMB CAPITAL MARKETS",
linkPath: 'https://www.fcmbcapitalmarketsng.com/', linkPath: "https://www.fcmbcapitalmarketsng.com/",
}, },
{ {
name: 'FCMB ASSET MANAGEMENT', name: "FCMB ASSET MANAGEMENT",
linkPath: 'https://www.fcmbassetmanagement.com/index/', linkPath: "https://www.fcmbassetmanagement.com/index/",
}, },
{ {
name: 'FCMB MICROFINANCE BANK', name: "FCMB MICROFINANCE BANK",
linkPath: '/fcmb-microfinance-initiative', linkPath: "/fcmb-microfinance-initiative",
}, },
{ name: 'FCMB UK', linkPath: 'http://www.fcmbuk.com/' }, { name: "FCMB UK", linkPath: "http://www.fcmbuk.com/" },
{ {
name: 'FCMB PENSIONS LIMITED', name: "FCMB PENSIONS LIMITED",
linkPath: 'https://www.fcmbpensions.com/', linkPath: "https://www.fcmbpensions.com/",
}, },
{ {
name: 'CREDIT DIRECT LIMITED', name: "CREDIT DIRECT LIMITED",
linkPath: 'https://www.creditdirect.ng', linkPath: "https://www.creditdirect.ng",
}, },
{ name: 'FCMB TRUSTEES', linkPath: 'http://fcmbtrustees.com/' }, { name: "FCMB TRUSTEES", linkPath: "http://fcmbtrustees.com/" },
], ],
}, },
{ {
name: 'ABOUT US', name: "ABOUT US",
linkPath: '/about-us', linkPath: "/about-us",
subItems: [ subItems: [
{ {
name: 'OUR VISION/MISSION/VALUES', name: "OUR VISION/MISSION/VALUES",
linkPath: '/about-us/vision-mision-core-values', linkPath: "/about-us/vision-mision-core-values",
}, },
{ name: 'OUR HISTORY', linkPath: '/about-us/our-history' }, { name: "OUR HISTORY", linkPath: "/about-us/our-history" },
{ {
name: 'INVESTOR RELATIONS', name: "INVESTOR RELATIONS",
linkPath: 'http://www.fcmbgroup.com/investor-relations', linkPath: "http://www.fcmbgroup.com/investor-relations",
}, },
{ name: 'CSR', linkPath: '/corporate-social-responsibility/index.html' }, { name: "CSR", linkPath: "/corporate-social-responsibility/index.html" },
{ name: 'SUSTAINABILITY', linkPath: '/sustainability/index.html' }, { name: "SUSTAINABILITY", linkPath: "/sustainability/index.html" },
{ name: 'OUR LEADERSHIP', linkPath: '/about-us/our-leadership' }, { name: "OUR LEADERSHIP", linkPath: "/about-us/our-leadership" },
{ name: 'BOARD OF DIRECTORS', linkPath: '/about-us/board-of-directors' }, { name: "BOARD OF DIRECTORS", linkPath: "/about-us/board-of-directors" },
{ {
name: 'MEDIA RELATIONS', name: "MEDIA RELATIONS",
linkPath: '/media-relations', linkPath: "/media-relations",
subItems: [ subItems: [
{ name: 'PRESS RELEASES', linkPath: '/press-releases' }, { name: "PRESS RELEASES", linkPath: "/press-releases" },
{ name: 'MEDIA STATEMENTS', linkPath: '/press-statements' }, { name: "MEDIA STATEMENTS", linkPath: "/press-statements" },
], ],
}, },
{ name: 'AWARDS AND RECOGNITION', linkPath: '/awards' }, { name: "AWARDS AND RECOGNITION", linkPath: "/awards" },
{ {
name: 'OUR POLICY', name: "OUR POLICY",
linkPath: '/our-policies', linkPath: "/our-policies",
subItems: [ subItems: [
{ name: 'BUSINESS CONTINUITY', linkPath: '/business-continuity' }, { name: "BUSINESS CONTINUITY", linkPath: "/business-continuity" },
{ {
name: 'CORPORATE GOVERNANCE POLICY', name: "CORPORATE GOVERNANCE POLICY",
linkPath: '/corporate-governance', linkPath: "/corporate-governance",
}, },
{ name: 'PRIVACY POLICY', linkPath: '/privacy-policy' }, { name: "PRIVACY POLICY", linkPath: "/privacy-policy" },
{ name: 'QUALITY POLICY', linkPath: '/quality-policy' }, { name: "QUALITY POLICY", linkPath: "/quality-policy" },
], ],
}, },
], ],
}, },
{ {
name: 'MY BANK AND I', name: "MY BANK AND I",
linkPath: '', linkPath: "",
subItems: [ subItems: [
{ name: 'TELEPHONE SELF SERVICE', linkPath: '/telephone-self-service' }, { name: "TELEPHONE SELF SERVICE", linkPath: "/telephone-self-service" },
{ {
name: 'CURRENT CAMPAIGNS/PROMOS', name: "CURRENT CAMPAIGNS/PROMOS",
linkPath: '/current-campaigns-promos', linkPath: "/current-campaigns-promos",
subItems: [ subItems: [
{ {
name: 'BOOK YOUR FLIGHTS AND PAY IN INSTALMENTS WITH FCMB', name: "BOOK YOUR FLIGHTS AND PAY IN INSTALMENTS WITH FCMB",
linkPath: '/247travels', linkPath: "/247travels",
}, },
{ name: 'REFER AND WIN', linkPath: '/refer-and-win' }, { name: "REFER AND WIN", linkPath: "/refer-and-win" },
{ name: 'CARD DISCOUNTS', linkPath: '/card-discounts' }, { name: "CARD DISCOUNTS", linkPath: "/card-discounts" },
{ {
name: 'FLEXX WRITING CHALLENGE', name: "FLEXX WRITING CHALLENGE",
linkPath: 'https://flexxzone.fcmb.com/writing-challenge/', linkPath: "https://flexxzone.fcmb.com/writing-challenge/",
}, },
{ {
name: 'FLEXXPRENEUR', name: "FLEXXPRENEUR",
linkPath: linkPath:
'https://flexxzone.fcmb.com/2020/07/flexxpreneur-is-back-2/', "https://flexxzone.fcmb.com/2020/07/flexxpreneur-is-back-2/",
}, },
{ {
name: '3-MONTH FREE BANKING', name: "3-MONTH FREE BANKING",
linkPath: 'https://www.fcmb.com/campaign/smebanking', linkPath: "https://www.fcmb.com/campaign/smebanking",
}, },
], ],
}, },
{ name: 'CAREERS', linkPath: '/career' }, { name: "CAREERS", linkPath: "/career" },
{ name: 'CUSTOMER FEEDBACK', linkPath: '/customer-feedback' }, { name: "CUSTOMER FEEDBACK", linkPath: "/customer-feedback" },
{ name: 'CUSTOMER SERVICE', linkPath: '/customer-service' }, { name: "CUSTOMER SERVICE", linkPath: "/customer-service" },
], ],
}, },
]; ];
export const socialsIcons = [ export const socialsIcons = [
{ name: 'facebook', image: FBook, link: process.VITE_FACEBOOK_URL }, { name: "facebook", image: FBook, link: process.VITE_FACEBOOK_URL },
{ name: 'twitter', image: Twitter, link: process.VITE_TWITTER_URL }, { name: "twitter", image: Twitter, link: process.VITE_TWITTER_URL },
{ name: 'instagram', image: Instagram, link: process.VITE_INSTAGRAM_URL }, { name: "instagram", image: Instagram, link: process.VITE_INSTAGRAM_URL },
]; ];
export const footerItems = [ export const footerItems = [
{ {
category: 'PERSONAL BANKING', category: "PERSONAL BANKING",
subItems: [ subItems: [
{ text: 'CURRENT ACCOUNTS', href: '/current-accounts' }, { text: "CURRENT ACCOUNTS", href: "/current-accounts" },
{ text: 'SAVINGS ACCOUNTS', href: '/savings-accounts' }, { text: "SAVINGS ACCOUNTS", href: "/savings-accounts" },
{ text: 'INVESTMENTS', href: '/investment-accounts' }, { text: "INVESTMENTS", href: "/investment-accounts" },
{ text: 'LOANS AND CREDIT CARDS', href: '/loans-and-credit-cards' }, { text: "LOANS AND CREDIT CARDS", href: "/loans-and-credit-cards" },
{ {
text: 'NON-RESIDENT NIGERIAN (NRN) BANKING', text: "NON-RESIDENT NIGERIAN (NRN) BANKING",
href: 'https://www.fcmb.com/non-resident-nigerian', href: "https://www.fcmb.com/non-resident-nigerian",
}, },
{ text: 'WAYS TO BANK', href: '/ways-to-bank' }, { text: "WAYS TO BANK", href: "/ways-to-bank" },
{ text: 'BANCASSURANCE', href: '/bancassurance' }, { text: "BANCASSURANCE", href: "/bancassurance" },
], ],
}, },
{ {
category: 'BUSINESS BANKING', category: "BUSINESS BANKING",
subItems: [ subItems: [
{ text: 'PROPOSITIONS', href: '' }, { text: "PROPOSITIONS", href: "" },
{ text: 'CURRENT ACCOUNTS', href: '/business-current-accounts' }, { text: "CURRENT ACCOUNTS", href: "/business-current-accounts" },
{ text: 'SAVINGS ACCOUNTS', href: '/node/178' }, { text: "SAVINGS ACCOUNTS", href: "/node/178" },
{ text: 'LOANS', href: '/business-loans' }, { text: "LOANS", href: "/business-loans" },
{ text: 'BONDS & GUARANTEES', href: '/bonds-and-guarantees' }, { text: "BONDS & GUARANTEES", href: "/bonds-and-guarantees" },
{ text: 'INTERVENTION FUNDS', href: '/intervention-funds' }, { text: "INTERVENTION FUNDS", href: "/intervention-funds" },
{ text: 'TRADE SERVICE', href: '/trade-service' }, { text: "TRADE SERVICE", href: "/trade-service" },
{ text: 'PAYMENT & COLLECTION', href: '/payment-and-collection' }, { text: "PAYMENT & COLLECTION", href: "/payment-and-collection" },
{ text: 'WAYS TO BANK', href: '/business-ways-to-bank' }, { text: "WAYS TO BANK", href: "/business-ways-to-bank" },
], ],
}, },
{ {
category: 'COOPORATE BANKING', category: "COOPORATE BANKING",
subItems: [ subItems: [
{ text: 'FOREIGN EXCHANGE SERVICES', href: '/foreign-exchange-services' }, { text: "FOREIGN EXCHANGE SERVICES", href: "/foreign-exchange-services" },
{ text: 'TRADE SERVICES', href: '/node/166' }, { text: "TRADE SERVICES", href: "/node/166" },
{ text: 'CASH MANAGEMENT SOLUTIONS', href: '/cash-management' }, { text: "CASH MANAGEMENT SOLUTIONS", href: "/cash-management" },
{ text: 'COOPORATE FINANCE', href: '/corporate-finance' }, { text: "COOPORATE FINANCE", href: "/corporate-finance" },
], ],
}, },
{ {
category: 'GROUP & SUBSIDIARIES', category: "GROUP & SUBSIDIARIES",
subItems: [ subItems: [
{ text: 'FCMB GROUP PLC', href: 'https://www.fcmbgroup.com/' }, { text: "FCMB GROUP PLC", href: "https://www.fcmbgroup.com/" },
{ text: 'CSL STOCKBROKERS', href: 'https://www.cslstockbrokers.com/' }, { text: "CSL STOCKBROKERS", href: "https://www.cslstockbrokers.com/" },
{ {
text: 'FCMB CAPITAL MARKETS', text: "FCMB CAPITAL MARKETS",
href: 'https://www.fcmbcapitalmarketsng.com/', href: "https://www.fcmbcapitalmarketsng.com/",
}, },
{ {
text: 'FCMB ASSET MANAGEMENT', text: "FCMB ASSET MANAGEMENT",
href: 'https://www.fcmbassetmanagement.com/index/', href: "https://www.fcmbassetmanagement.com/index/",
}, },
{ text: 'FCMB MICROFINANCE BANK', href: '/fcmb-microfinance-initiative' }, { text: "FCMB MICROFINANCE BANK", href: "/fcmb-microfinance-initiative" },
{ text: 'FCMB UK', href: 'http://www.fcmbuk.com/' }, { text: "FCMB UK", href: "http://www.fcmbuk.com/" },
{ text: 'FCMB PENSIONS LIMITED', href: 'https://www.fcmbpensions.com/' }, { text: "FCMB PENSIONS LIMITED", href: "https://www.fcmbpensions.com/" },
{ text: 'CREDIT DIRECT LIMITED', href: 'https://www.creditdirect.ng' }, { text: "CREDIT DIRECT LIMITED", href: "https://www.creditdirect.ng" },
{ text: 'FCMB TRUSTEES', href: 'http://fcmbtrustees.com/' }, { text: "FCMB TRUSTEES", href: "http://fcmbtrustees.com/" },
], ],
}, },
{ {
category: 'ABOUT US', category: "ABOUT US",
subItems: [ subItems: [
{ {
text: 'OUR VISION/MISSION/VALUES', text: "OUR VISION/MISSION/VALUES",
href: '/about-us/vision-mision-core-values', href: "/about-us/vision-mision-core-values",
}, },
{ text: 'OUR HISTORY', href: '/about-us/our-history' }, { text: "OUR HISTORY", href: "/about-us/our-history" },
{ {
text: 'INVESTOR RELATIONS', text: "INVESTOR RELATIONS",
href: 'http://www.fcmbgroup.com/investor-relations', href: "http://www.fcmbgroup.com/investor-relations",
}, },
{ text: 'CSR', href: '/corporate-social-responsibility/index.html' }, { text: "CSR", href: "/corporate-social-responsibility/index.html" },
{ text: 'SUSTAINABILITY', href: '/sustainability/index.html' }, { text: "SUSTAINABILITY", href: "/sustainability/index.html" },
{ text: 'OUR LEADERSHIP', href: '/about-us/our-leadership' }, { text: "OUR LEADERSHIP", href: "/about-us/our-leadership" },
{ text: 'BOARD OF DIRECTORS', href: '/about-us/board-of-directors' }, { text: "BOARD OF DIRECTORS", href: "/about-us/board-of-directors" },
{ text: 'MEDIA RELATIONS', href: '/media-relations' }, { text: "MEDIA RELATIONS", href: "/media-relations" },
{ text: 'AWARDS AND RECOGNITION', href: '/awards' }, { text: "AWARDS AND RECOGNITION", href: "/awards" },
{ text: 'OUR POLICY', href: '/our-policies' }, { text: "OUR POLICY", href: "/our-policies" },
], ],
}, },
{ {
category: 'MY BANK AND I', category: "MY BANK AND I",
subItems: [ subItems: [
{ text: 'TELEPHONE SELF SERVICE', href: '/telephone-self-service' }, { text: "TELEPHONE SELF SERVICE", href: "/telephone-self-service" },
{ text: 'CURRENT CAMPAIGNS/PROMOS', href: '/current-campaigns-promos' }, { text: "CURRENT CAMPAIGNS/PROMOS", href: "/current-campaigns-promos" },
{ text: 'CAREERS', href: '/career' }, { text: "CAREERS", href: "/career" },
{ text: 'CUSTOMER FEEDBACK', href: '/customer-feedback' }, { text: "CUSTOMER FEEDBACK", href: "/customer-feedback" },
{ text: 'CUSTOMER SERVICE', href: '/customer-service' }, { text: "CUSTOMER SERVICE", href: "/customer-service" },
], ],
}, },
]; ];
export const footerSocialLinks = [ export const footerSocialLinks = [
{ {
href: 'https://www.facebook.com/FcmbMyBank/', href: "https://www.facebook.com/FcmbMyBank/",
icon: FBookWhite, icon: FBookWhite,
}, },
{ {
href: 'https://twitter.com/myfcmb/', href: "https://twitter.com/myfcmb/",
icon: XWhite, icon: XWhite,
}, },
{ {
href: 'https://www.linkedin.com/company/first-city-monument-bank-ltd/', href: "https://www.linkedin.com/company/first-city-monument-bank-ltd/",
icon: LinkedInWhite, icon: LinkedInWhite,
}, },
{ {
href: 'https://www.youtube.com/user/fcmbplc', href: "https://www.youtube.com/user/fcmbplc",
icon: YoutubeWhite, icon: YoutubeWhite,
}, },
{ {
href: 'https://www.instagram.com/myfcmb/', href: "https://www.instagram.com/myfcmb/",
icon: InstagramWhite, icon: InstagramWhite,
}, },
{ {
href: 'https://api.whatsapp.com/send?phone=09099999814', href: "https://api.whatsapp.com/send?phone=09099999814",
icon: WhatsappWhite, icon: WhatsappWhite,
}, },
]; ];
export const footerCustomerLinks = [ export const footerCustomerLinks = [
{ {
text: 'PRIVACY POLICY', text: "PRIVACY POLICY",
href: 'https://www.fcmb.com/privacy-policy', href: "https://www.fcmb.com/privacy-policy",
}, },
{ {
text: 'PRESS RELEASES', text: "PRESS RELEASES",
href: '/press-releases', href: "/press-releases",
}, },
{ {
text: 'SHARE PRICE', text: "SHARE PRICE",
href: '/', href: "/",
}, },
{ {
text: 'WHISTLE BLOWER', text: "WHISTLE BLOWER",
href: '/fcmb-whistle-blower-form', href: "/fcmb-whistle-blower-form",
}, },
{ {
text: 'FRAUD PREVENTION', text: "FRAUD PREVENTION",
href: '/customer-service', href: "/customer-service",
}, },
{ {
text: 'AML', text: "AML",
href: '/customer-service', href: "/customer-service",
}, },
{ {
text: 'CAREERS', text: "CAREERS",
href: '/career', href: "/career",
}, },
]; ];
export const contactDetails = [
{ name: 'Call', value: import.meta.env.VITE_CALL_ENDPOINT },
{ name: 'Email', value: import.meta.env.VITE_EMAIL_ENDPOINT },
];