Compare commits

...

8 Commits

Author SHA1 Message Date
victorAnumudu c073be1ce6 formattter function add 2024-10-19 03:21:57 +01:00
victorAnumudu f43e10a75f bug fixed 2024-10-19 03:12:26 +01:00
ameye eb41751628 Merge branch 'virtual-form-name' of WrenchBoard/Users-Wrench into master 2024-10-19 01:13:22 +00:00
victorAnumudu fa7a0bd1da name added to form 2024-10-18 18:03:57 +01:00
ameye 52ff30581f Merge branch 'virtual-form-update' of WrenchBoard/Users-Wrench into master 2024-10-17 20:13:51 +00:00
victorAnumudu 858bd7c0f7 virtual card form country and state added 2024-10-17 21:06:29 +01:00
victorAnumudu b995c36a8e virtual card form country and state added 2024-10-17 21:00:17 +01:00
ameye 2363bc3fd7 Merge branch 'add-virtual-card-form' of WrenchBoard/Users-Wrench into master 2024-10-16 18:32:28 +00:00
6 changed files with 185 additions and 80 deletions
@@ -53,7 +53,7 @@ function Wallet({wallet, familyData, setFamilyWalletReload}) {
name="plan" name="plan"
// onClick={onClose} // onClick={onClose}
> >
Plan Wallet Add Card
</button> </button>
</div> </div>
</div> </div>
@@ -1,6 +1,7 @@
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import usersService from "../../../services/UsersService"; import usersService from "../../../services/UsersService";
import LoadingSpinner from "../../Spinners/LoadingSpinner"; import LoadingSpinner from "../../Spinners/LoadingSpinner";
import {PriceFormatter} from '../../Helpers/PriceFormatter'
export default function LockJob({ export default function LockJob({
details, details,
+1 -1
View File
@@ -24,7 +24,7 @@ export default function WalletBox({ wallet, payment, countries }) {
</div> </div>
) : ( ) : (
<div className="w-auto grid md:grid-cols-2 xxl:grid-cols-3 gap-4 md:gap-10"> <div className="w-auto grid md:grid-cols-2 xxl:grid-cols-3 gap-4 md:gap-10">
{ data.length > 0 && data.map((item, index) => ( { data?.length > 0 && data.map((item, index) => (
<div key={item.wallet_uid+index} className="w-full h-full"> <div key={item.wallet_uid+index} className="w-full h-full">
{item.country ? {item.country ?
<WalletItemCard walletItem={item} payment={payment} countries={countries} /> <WalletItemCard walletItem={item} payment={payment} countries={countries} />
@@ -14,8 +14,8 @@ const validationSchema = Yup.object().shape({
country: Yup.string() country: Yup.string()
.required("Required"), .required("Required"),
phone_number: Yup.string() phone_number: Yup.string()
.min(9, "Minimum 9 characters") .min(9, "Min 9 characters")
.max(20, "Maximum 25 characters") .max(11, "Max 11 characters")
.required("Required"), .required("Required"),
birthYear: Yup.string() birthYear: Yup.string()
.required("Required"), .required("Required"),
@@ -24,20 +24,18 @@ const validationSchema = Yup.object().shape({
birthDay: Yup.string() birthDay: Yup.string()
.required("Required"), .required("Required"),
address: Yup.string() address: Yup.string()
.min(5, "Minimum 3 characters") .min(5, "Min 3 characters")
.max(50, "Maximum 25 characters") .max(50, "Max 25 characters")
.required("Required"), .required("Required"),
city: Yup.string() city: Yup.string()
.min(2, "Minimum 3 characters") .min(2, "Min 3 characters")
.max(25, "Maximum 25 characters") .max(25, "Max 25 characters")
.required("Required"), .required("Required"),
state: Yup.string() state: Yup.string()
.min(2, "Minimum 3 characters")
.max(25, "Maximum 25 characters")
.required("Required"), .required("Required"),
zipCode: Yup.string() zipCode: Yup.string()
.min(1, "Minimum 3 characters") .min(1, "Min 3 characters")
.max(10, "Maximum 25 characters") .max(8, "Max 8 characters")
.required("Required"), .required("Required"),
}); });
@@ -45,15 +43,20 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
const { userDetails } = useSelector((state) => state.userDetails); const { userDetails } = useSelector((state) => state.userDetails);
const countryCode = userDetails?.country
const userApi = new usersService() const userApi = new usersService()
const [requestStatus, setRequestStatus] = useState({loading: false, status:false, message: ''}) const [requestStatus, setRequestStatus] = useState({loading: false, status:false, message: ''})
const [allCountries, setAllCountries] = useState({loading: true, data: []}) // VARIABLE TO HOLD COUNTRY LIST const [allCountries, setAllCountries] = useState({loading: true, data: []}) // VARIABLE TO HOLD COUNTRY LIST
const [state, setState] = useState({loading: true, data: {}}) // VARIABLE TO HOLD STATE LIST
let initialValues = { let initialValues = {
// initial values for formik // initial values for formik
country: '', country: countryCode ? countryCode : '',
phone_number: '', phone_number: '',
email: userDetails?.email, email: userDetails?.email,
firstname: userDetails?.firstname, firstname: userDetails?.firstname,
@@ -62,13 +65,14 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
birthMonth: '', birthMonth: '',
birthDay: '', birthDay: '',
address: '', address: '',
city: '', city: userDetails?.city ? userDetails.city : '',
state: '', state: '',
zipCode: '' zipCode: ''
}; };
const handleSubmit = (values) => { const handleSubmit = (values) => {
const reqData = { const reqData1 = {
name: values.firstname + ' ' + values.firstname, name: values.firstname + ' ' + values.firstname,
email: values.email, email: values.email,
phone_number: values.phone_number, phone_number: values.phone_number,
@@ -89,7 +93,40 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
} }
} }
} }
console.log('Values', reqData) const reqData = {
request_type: '100',
address: values.address,
city: values.city,
state: values.state,
country: values.country,
postal_code: values.zipCode,
phone_number: values.phone_number,
dob_day: values.birthDay,
dob_month: values.birthMonth,
dob_year: values.birthYear,
}
// console.log('Values', reqData)
setRequestStatus({loading: true, status:false, message: ''})
userApi.walletCardRequest(reqData).then(res => {
if(res?.data?.internal_return < 0){
setRequestStatus({loading: false, status:false, message: 'Failed, try again'})
setTimeout(()=>{
setRequestStatus({loading: false, status:true, message: ''})
},4000)
return
}
setRequestStatus({loading: false, status:true, message: 'Successful'})
setTimeout(()=>{
setRequestStatus({loading: false, status:true, message: ''})
onClose()
},4000)
}).catch(err => {
console.log('ERR', err)
setRequestStatus({loading: false, status:false, message: 'Unable to complete'})
setTimeout(()=>{
setRequestStatus({loading: false, status:false, message: ''})
},4000)
})
} }
useEffect(()=>{ useEffect(()=>{
@@ -98,6 +135,9 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
if(!res?.data?.result_list){ if(!res?.data?.result_list){
return setAllCountries({ loading: false, data: [] }); return setAllCountries({ loading: false, data: [] });
} }
// if(countryCode){
// return setAllCountries({ loading: false, data: res?.data?.result_list?.filter(item => item?.code == countryCode) });
// }
setAllCountries({ loading: false, data: res?.data?.result_list }); setAllCountries({ loading: false, data: res?.data?.result_list });
}).catch(err => { }).catch(err => {
setAllCountries({ loading: false, data: [] }); setAllCountries({ loading: false, data: [] });
@@ -105,6 +145,20 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
}) })
},[]) },[])
useEffect(()=>{
// GET STATE API
setState({loading: true, data: {}})
userApi.getStateFromCountry({country: countryCode}).then(res =>{
if(!res?.data?.country_state){
return setState({ loading: false, data: {} });
}
setState({ loading: false, data: res?.data?.country_state});
}).catch(err => {
setState({ loading: false, data: {} });
console.log('err', err)
})
},[initialValues.country])
return ( return (
<ModalCom <ModalCom
action={onClose} action={onClose}
@@ -149,11 +203,11 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
</button> </button>
</div> </div>
<div className="p-4 w-full grid lg:grid-cols-2 gap-4"> <div className="p-4 w-full grid lg:grid-cols-2 gap-4">
{/* left part */} {/* left part */}
<div className='w-full flex flex-col gap-4'> <div className='w-full flex flex-col gap-4'>
<div className="field w-full grid md:grid-cols-2 gap-4"> <h1 className='text-lg md:text-xl flex gap-1'><span className='font-bold'>Name:</span>{userDetails.lastname} {userDetails.firstname}</h1>
<div className="field w-full"> <div className="field w-full grid md:grid-cols-3 gap-4">
<div className="md:col-span-1 field w-full">
<label <label
htmlFor="country" htmlFor="country"
className="job-label job-label-flex" className="job-label job-label-flex"
@@ -171,6 +225,7 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
value={props.values.country} value={props.values.country}
className={`input-field p-2 mt-3 rounded-full placeholder:text-base text-dark-gray w-full h-[42px] bg-slate-100 focus:ring-0 focus:outline-none border`} className={`input-field p-2 mt-3 rounded-full placeholder:text-base text-dark-gray w-full h-[42px] bg-slate-100 focus:ring-0 focus:outline-none border`}
onChange={props.handleChange} onChange={props.handleChange}
disabled={countryCode ? true : false}
> >
{allCountries.loading ? {allCountries.loading ?
<option className="text-slate-500 text-lg" value=""> <option className="text-slate-500 text-lg" value="">
@@ -194,18 +249,20 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
} }
</select> </select>
</div> </div>
<InputCom <div className='md:col-span-2'>
fieldClass="px-6" <InputCom
label="Phone Number" fieldClass="px-6"
labelClass="tracking-wide" label="Phone Number"
inputBg="bg-slate-100" labelClass="tracking-wide"
inputClass="w-full input-curve lg border border-light-purple" inputBg="bg-slate-100"
type="text" inputClass="w-full input-curve lg border border-light-purple"
name="phone_number" type="text"
value={props.values.phone_number} name="phone_number"
inputHandler={props.handleChange} value={props.values.phone_number}
error={(props.errors.phone_number && props.touched.phone_number) && props.errors.phone_number} inputHandler={props.handleChange}
/> error={(props.errors.phone_number && props.touched.phone_number) && props.errors.phone_number}
/>
</div>
</div> </div>
<InputCom <InputCom
disable={true} disable={true}
@@ -220,7 +277,7 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
inputHandler={props.handleChange} inputHandler={props.handleChange}
error={(props.errors.email && props.touched.email) && props.errors.email} error={(props.errors.email && props.touched.email) && props.errors.email}
/> />
<div className="field w-full grid md:grid-cols-2 gap-4"> <div className="hidden field w-full md:grid-cols-2 gap-4">
<InputCom <InputCom
disable={true} disable={true}
fieldClass="px-6" fieldClass="px-6"
@@ -386,52 +443,70 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
inputHandler={props.handleChange} inputHandler={props.handleChange}
error={(props.errors.state && props.touched.state) && props.errors.state} error={(props.errors.state && props.touched.state) && props.errors.state}
/> */} /> */}
<div className="field w-full">
<label <div className="field w-full grid md:grid-cols-2 gap-4">
htmlFor="state" <div className="field w-full">
className="job-label job-label-flex" <label
> htmlFor="state"
<span>State/Province</span> className="job-label job-label-flex"
{props.errors.state && props.touched.state && ( >
<span className="text-[12px] text-red-500"> <span>State/Province</span>
{props.errors.state} {props.errors.state && props.touched.state && (
</span> <span className="text-[12px] text-red-500">
)} {props.errors.state}
</label> </span>
<select )}
id="state" </label>
name="state" <select
value={props.values.state} id="state"
className={`input-field p-2 mt-3 rounded-full placeholder:text-base text-dark-gray w-full h-[42px] bg-slate-100 focus:ring-0 focus:outline-none border`} name="state"
onChange={props.handleChange} value={props.values.state}
> className={`input-field p-2 mt-3 rounded-full placeholder:text-base text-dark-gray w-full h-[42px] bg-slate-100 focus:ring-0 focus:outline-none border`}
<> onChange={props.handleChange}
<option className="text-slate-500 text-lg" value=''> >
select {state.loading ?
</option> <option className="text-slate-500 text-lg" value="">
{state.map(item => ( Loading...
<option key={item.value} className="text-slate-500 text-lg" value={item.value}> </option>
{item.name} : Object.keys(state.data)?.length > 0 ?
</option> <>
))} <option className="text-slate-500 text-lg" value="">
</> Select State
</select> </option>
{Object.keys(state.data)?.map((item, index) => (
<option key={index} className="text-slate-500 text-lg" value={item}>
{state?.data[item]}
</option>
))}
</>
:
<option className="text-slate-500 text-lg" value="">
Not Found
</option>
}
</select>
</div>
<InputCom
fieldClass="px-6"
label="Zip Code"
labelClass="tracking-wide"
inputBg="bg-slate-100"
inputClass="input-curve lg border border-light-purple"
type="text"
name="zipCode"
value={props.values.zipCode}
inputHandler={props.handleChange}
error={(props.errors.zipCode && props.touched.zipCode) && props.errors.zipCode}
/>
</div> </div>
<InputCom
fieldClass="px-6"
label="Zip Code"
labelClass="tracking-wide"
inputBg="bg-slate-100"
inputClass="input-curve lg border border-light-purple"
type="text"
name="zipCode"
value={props.values.zipCode}
inputHandler={props.handleChange}
error={(props.errors.zipCode && props.touched.zipCode) && props.errors.zipCode}
/>
</div> </div>
</div> </div>
{requestStatus.message &&
<div className='px-4 my-1'>
<p className={`text-center text-base py-1 font-bold ${requestStatus.status ? 'bg-emerald-600 text-white' : 'bg-red-100 text-red-600'}`}>{requestStatus.message}</p>
</div>
}
<div className="modal-footer-wrapper grid grid-cols-1 xxs:grid-cols-3"> <div className="modal-footer-wrapper grid grid-cols-1 xxs:grid-cols-3">
<div className="w-full col-span-1 xxs:col-span-2 xxs:col-start-2 flex justify-between items-center"> <div className="w-full col-span-1 xxs:col-span-2 xxs:col-start-2 flex justify-between items-center">
<button <button
@@ -449,6 +524,7 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
<button <button
type="submit" type="submit"
className="custom-btn btn-gradient text-base text-white" className="custom-btn btn-gradient text-base text-white"
disabled={requestStatus.loading || requestStatus.status}
> >
Continue Continue
</button> </button>
@@ -488,8 +564,8 @@ const date = new Date().getFullYear()
const year = new Array(100).fill(0).map((_,i) => (date-2) - i+1 ) const year = new Array(100).fill(0).map((_,i) => (date-2) - i+1 )
const state = [ // const state = [
{value: 'abia', name: 'Abia'}, // {value: 'abia', name: 'Abia'},
{value: 'imo', name: 'Imo'}, // {value: 'imo', name: 'Imo'},
{value: 'anambra', name: 'Anambra'}, // {value: 'anambra', name: 'Anambra'},
] // ]
+3
View File
@@ -78,6 +78,9 @@ export const apiConst = {
WRENCHBOARD_START_JOBLIST: 11028, WRENCHBOARD_START_JOBLIST: 11028,
WRENCHBOARD_ACCOUNT_DASHDATA: 11029, WRENCHBOARD_ACCOUNT_DASHDATA: 11029,
WRENCHBOARD_COUNTRY_STATE: 649,
WRENCHBOARD_WALLET_CARD_REQUEST: 11080,
WRENCHBOARD_SEND_CONTACTUS: 11030, WRENCHBOARD_SEND_CONTACTUS: 11030,
WRENCHBOARD_ACCOUNT_SENDREFER: 11032, WRENCHBOARD_ACCOUNT_SENDREFER: 11032,
WRENCHBOARD_ACCOUNT_REFERLINK: 11033, WRENCHBOARD_ACCOUNT_REFERLINK: 11033,
+25
View File
@@ -1536,6 +1536,31 @@ class usersService {
return this.postAuxEnd("/recentpastdue", postData); return this.postAuxEnd("/recentpastdue", postData);
} }
//API TO GET STATES FROM COUNTRY
getStateFromCountry(reqData){
var postData = {
member_uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
action: apiConst.WRENCHBOARD_COUNTRY_STATE,
...reqData
};
return this.postAuxEnd("/countrystate", postData);
}
//API TO GET STATES FROM COUNTRY
walletCardRequest(reqData){
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
target_uid: localStorage.getItem("uid"),
action: apiConst.WRENCHBOARD_WALLET_CARD_REQUEST,
...reqData
};
return this.postAuxEnd("/wallets/card/request", postData);
}
/* /*
- 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(username) - 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(username)
- 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(password) - 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(password)