Compare commits

..

5 Commits

Author SHA1 Message Date
victorAnumudu 3998596fba validation bug fix 2024-04-16 20:56:34 +01:00
victorAnumudu 886fd64347 validated otp input to be numbers 2024-04-16 20:17:57 +01:00
tokslaw f95fd66c57 Merge branch 'layout-update' of DigiFi/digifi-www into master 2024-04-04 09:35:17 +00:00
tokslaw 98b5d4bc4f Merge branch 'Corporate' of DigiFi/digifi-www into master 2024-04-04 09:33:45 +00:00
Pascallina Ocheme 537d609117 Modified pathlink 2024-03-26 12:17:15 +01:00
3 changed files with 134 additions and 77 deletions
+127 -73
View File
@@ -1,21 +1,59 @@
import React from "react"; import React from "react";
import * as Yup from "yup";
import { Form, Formik } from "formik";
import { InputCompOne } from ".."; import { InputCompOne } from "..";
// To get the validation schema
const validationSchema = Yup.object().shape({
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"),
otp: Yup.string()
.required("OTP is required")
.test("no-e", "Invalid number", (value:any) => {
if (value && /^[0-9]*$/.test(value) == false) {
return false;
}
return true;
})
.min(5, "must be 5 digits")
.max(5, "must be 5 digits"),
// .test("no-e", "must be 11 characters", (value:any) => {
// if (value.length < 11) {
// return false;
// }
// return true;
// })
});
// initial values for formik
let initialValues = {
bvn: '',
otp: '',
};
const LetsGetStarted: React.FC = () => { const LetsGetStarted: React.FC = () => {
const [pinValues, setPinValues] = React.useState({ // const [pinValues, setPinValues] = React.useState({
bvn: "", // bvn: "",
otp: "", // otp: "",
}); // });
const [hideOTPComponent, setHideOTPComponent] = React.useState<boolean>(true); const [hideOTPComponent, setHideOTPComponent] = React.useState<boolean>(true);
const firstInputRef = React.useRef<HTMLInputElement>(null); const firstInputRef = React.useRef<HTMLInputElement>(null);
const secondInputRef = React.useRef<HTMLInputElement>(null); const secondInputRef = React.useRef<HTMLInputElement>(null);
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => { // const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
let { name, value } = e.target as HTMLInputElement; // let { name, value } = e.target as HTMLInputElement;
setPinValues((prev) => ({ ...prev, [name]: value })); // setPinValues((prev) => ({ ...prev, [name]: value }));
}; // };
const handleInput = (e: React.FormEvent<HTMLInputElement>) => { const handleInput = (e: React.FormEvent<HTMLInputElement>) => {
let { name, value } = e.target as HTMLInputElement; let { name, value } = e.target as HTMLInputElement;
@@ -24,7 +62,7 @@ const LetsGetStarted: React.FC = () => {
const regex = /^[0-9]+$/; const regex = /^[0-9]+$/;
if (regex.test(value)) { if (regex.test(value)) {
if (value?.length == 10) { if (value?.length == 11) {
setHideOTPComponent(false); setHideOTPComponent(false);
// secondInputRef.current?.focus(); // secondInputRef.current?.focus();
} else setHideOTPComponent(true); } else setHideOTPComponent(true);
@@ -34,73 +72,89 @@ const LetsGetStarted: React.FC = () => {
} }
}; };
console.log(secondInputRef) const handleSubmit = (values:any) => {
console.log('values', values)
};
return ( return (
<div className="w-full"> <Formik
<div className="containerMode flex justify-between gap-1 xl:gap-8 flex-col"> initialValues={initialValues}
<div className="my-[4rem] flex items-center justify-center w-full"> validationSchema={validationSchema}
<h1 className="font-bold text-[2.375rem] text-[#5C2684] my-[.5rem] text-center"> onSubmit={handleSubmit}
Lets Get You Started >
</h1> {(props:any) => (
</div> <Form className="">
<form className="mx-auto flex flex-col gap-8 max-w-[31.625rem] "> <div className="w-full">
<InputCompOne <div className="containerMode flex justify-between gap-1 xl:gap-8 flex-col">
parentClass="flex flex-col gap-2" <div className="my-[4rem] flex items-center justify-center w-full">
label="Enter Your BVN " <h1 className="font-bold text-[2.375rem] text-[#5C2684] my-[.5rem] text-center">
name="bvn" Lets Get You Started
parentInputClass="w-full" </h1>
labelSpan="( To get your BVN, dial *565*0# )" </div>
labelSpanClass="text-[13px] text-[#5a5a5a] font-semibold" <div className="mx-auto flex flex-col gap-8 max-w-[31.625rem] ">
placeholder="Enter your BVN" <InputCompOne
labelClass="font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#282828] mb-[2px] flex item-center gap-[4px]" parentClass="flex flex-col gap-2"
input label="Enter Your BVN "
inputClass="w-full h-[3.625rem] rounded bg-[#EFEFEF] px-4" name="bvn"
value={pinValues.bvn} parentInputClass="w-full"
onChange={handleChange} labelSpan="( To get your BVN, dial *565*0# )"
onInput={handleInput} labelSpanClass="text-[13px] text-[#5a5a5a] font-semibold"
ref={firstInputRef} placeholder="Enter your BVN"
maxLength={10} labelClass="font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#282828] mb-[2px] flex item-center gap-[4px]"
/> input
{!hideOTPComponent ? ( inputClass="w-full h-[3.625rem] rounded bg-[#EFEFEF] px-4"
<InputCompOne value={props.values.bvn}
parentClass="flex flex-col gap-2" onChange={props.handleChange}
label="Enter OTP " onInput={handleInput}
name="otp" ref={firstInputRef}
parentInputClass="w-full" maxLength={11}
labelSpan="( Please check your BVN phone number for verification pin )" error={(props.errors.bvn && props.touched.bvn) && props.errors.bvn}
labelSpanClass="text-[13px] text-[#5a5a5a] font-semibold" />
placeholder="Enter your OTP" {!hideOTPComponent && (
labelClass="font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#282828] mb-[2px] flex item-center gap-[4px]" <InputCompOne
input parentClass="flex flex-col gap-2"
inputClass="w-full h-[3.625rem] rounded bg-[#EFEFEF] px-4" label="Enter OTP "
value={pinValues.otp} name="otp"
onChange={handleChange} parentInputClass="w-full"
onInput={handleInput} labelSpan="( Please check your BVN phone number for verification pin )"
ref={secondInputRef} labelSpanClass="text-[13px] text-[#5a5a5a] font-semibold"
/> placeholder="Enter your OTP"
) : null} labelClass="font-bold text-[18px] leading-[21.78px] tracking-[2%] text-[#282828] mb-[2px] flex item-center gap-[4px]"
<button input
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" inputClass="w-full h-[3.625rem] rounded bg-[#EFEFEF] px-4"
disabled={!pinValues.otp} value={props.values.otp}
> onChange={props.handleChange}
Enter onInput={handleInput}
</button> ref={secondInputRef}
maxLength={11}
error={(props.errors.otp && props.touched.otp) && props.errors.otp}
/>
)}
<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={!props.values.otp}
>
Enter
</button>
{hideOTPComponent ? ( {hideOTPComponent ? (
<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 and
secure. It is only important for us to verify your information and secure. It is only important for us to verify your information and
also give you access to your application profile/account. also give you access to your application profile/account.
</p> </p>
) : ( ) : (
<p className="text-[#5C2684] mt-[1.5625rem] w-fit"> <p className="text-[#5C2684] mt-[1.5625rem] w-fit">
***Did not receive OTP? Click to resend ***Did not receive OTP? Click to resend
</p> </p>
)} )}
</form> </div>
</div> </div>
</div> </div>
</Form>
)}
</Formik>
); );
}; };
+3
View File
@@ -23,6 +23,7 @@ export interface InputCompOneProps {
parentSelectClass?: string; parentSelectClass?: string;
parentClass?: string; parentClass?: string;
maxLength?: number; maxLength?: number;
error?: string;
} }
const InputCompOne = forwardRef<HTMLInputElement, InputCompOneProps>( const InputCompOne = forwardRef<HTMLInputElement, InputCompOneProps>(
@@ -49,6 +50,7 @@ const InputCompOne = forwardRef<HTMLInputElement, InputCompOneProps>(
parentSelectClass, parentSelectClass,
parentClass, parentClass,
maxLength, maxLength,
error,
}, },
forwardedRef forwardedRef
) => { ) => {
@@ -58,6 +60,7 @@ const InputCompOne = forwardRef<HTMLInputElement, InputCompOneProps>(
<label htmlFor="" className={labelClass}> <label htmlFor="" className={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>}
</label> </label>
)} )}
{input && ( {input && (
+4 -4
View File
@@ -32,7 +32,7 @@ export const lowerMenuItems = [
{ {
id: 3, id: 3,
name: "CORPORATE BANKING", name: "CORPORATE BANKING",
linkPath: "/corporate-banking", linkPath: "/cooperate-banking",
}, },
{ {
id: 4, id: 4,
@@ -277,7 +277,7 @@ export const _lowerMenuItems = [
}, },
{ {
name: "CORPORATE BANKING", name: "CORPORATE BANKING",
linkPath: "/corporate-banking", linkPath: "/cooperate-banking",
subItems: [ subItems: [
{ {
name: "FOREIGN EXCHANGE SERVICES", name: "FOREIGN EXCHANGE SERVICES",
@@ -436,12 +436,12 @@ export const footerItems = [
], ],
}, },
{ {
category: "CORPORATE 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: "CORPORATE FINANCE", href: "/corporate-finance" }, { text: "COOPORATE FINANCE", href: "/corporate-finance" },
], ],
}, },
{ {