Compare commits

...

3 Commits

Author SHA1 Message Date
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
4 changed files with 107 additions and 58 deletions
@@ -53,7 +53,7 @@ function Wallet({wallet, familyData, setFamilyWalletReload}) {
name="plan"
// onClick={onClose}
>
Plan Wallet
Add Card
</button>
</div>
</div>
@@ -24,20 +24,18 @@ const validationSchema = Yup.object().shape({
birthDay: Yup.string()
.required("Required"),
address: Yup.string()
.min(5, "Minimum 3 characters")
.max(50, "Maximum 25 characters")
.min(5, "Min 3 characters")
.max(50, "Max 25 characters")
.required("Required"),
city: Yup.string()
.min(2, "Minimum 3 characters")
.max(25, "Maximum 25 characters")
.min(2, "Min 3 characters")
.max(25, "Max 25 characters")
.required("Required"),
state: Yup.string()
.min(2, "Minimum 3 characters")
.max(25, "Maximum 25 characters")
.required("Required"),
zipCode: Yup.string()
.min(1, "Minimum 3 characters")
.max(10, "Maximum 25 characters")
.min(1, "Min 3 characters")
.max(8, "Max 8 characters")
.required("Required"),
});
@@ -45,15 +43,20 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
const { userDetails } = useSelector((state) => state.userDetails);
const countryCode = userDetails?.country
const userApi = new usersService()
const [requestStatus, setRequestStatus] = useState({loading: false, status:false, message: ''})
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 = {
// initial values for formik
country: '',
country: countryCode ? countryCode : '',
phone_number: '',
email: userDetails?.email,
firstname: userDetails?.firstname,
@@ -67,6 +70,7 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
zipCode: ''
};
const handleSubmit = (values) => {
const reqData = {
name: values.firstname + ' ' + values.firstname,
@@ -98,6 +102,9 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
if(!res?.data?.result_list){
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 });
}).catch(err => {
setAllCountries({ loading: false, data: [] });
@@ -105,6 +112,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 (
<ModalCom
action={onClose}
@@ -171,6 +192,7 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
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`}
onChange={props.handleChange}
disabled={countryCode ? true : false}
>
{allCountries.loading ?
<option className="text-slate-500 text-lg" value="">
@@ -386,50 +408,63 @@ const VirtualAddCardPopout = ({ details, onClose, situation, walletItem }) => {
inputHandler={props.handleChange}
error={(props.errors.state && props.touched.state) && props.errors.state}
/> */}
<div className="field w-full">
<label
htmlFor="state"
className="job-label job-label-flex"
>
<span>State/Province</span>
{props.errors.state && props.touched.state && (
<span className="text-[12px] text-red-500">
{props.errors.state}
</span>
)}
</label>
<select
id="state"
name="state"
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
</option>
{state.map(item => (
<option key={item.value} className="text-slate-500 text-lg" value={item.value}>
{item.name}
</option>
))}
</>
</select>
<div className="field w-full grid md:grid-cols-2 gap-4">
<div className="field w-full">
<label
htmlFor="state"
className="job-label job-label-flex"
>
<span>State/Province</span>
{props.errors.state && props.touched.state && (
<span className="text-[12px] text-red-500">
{props.errors.state}
</span>
)}
</label>
<select
id="state"
name="state"
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}
>
{state.loading ?
<option className="text-slate-500 text-lg" value="">
Loading...
</option>
: Object.keys(state.data)?.length > 0 ?
<>
<option className="text-slate-500 text-lg" value="">
Select State
</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>
<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 className="modal-footer-wrapper grid grid-cols-1 xxs:grid-cols-3">
@@ -488,8 +523,8 @@ const date = new Date().getFullYear()
const year = new Array(100).fill(0).map((_,i) => (date-2) - i+1 )
const state = [
{value: 'abia', name: 'Abia'},
{value: 'imo', name: 'Imo'},
{value: 'anambra', name: 'Anambra'},
]
// const state = [
// {value: 'abia', name: 'Abia'},
// {value: 'imo', name: 'Imo'},
// {value: 'anambra', name: 'Anambra'},
// ]
+2
View File
@@ -78,6 +78,8 @@ export const apiConst = {
WRENCHBOARD_START_JOBLIST: 11028,
WRENCHBOARD_ACCOUNT_DASHDATA: 11029,
WRENCHBOARD_COUNTRY_STATE: 649,
WRENCHBOARD_SEND_CONTACTUS: 11030,
WRENCHBOARD_ACCOUNT_SENDREFER: 11032,
WRENCHBOARD_ACCOUNT_REFERLINK: 11033,
+12
View File
@@ -1536,6 +1536,18 @@ class usersService {
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);
}
/*
- 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(username)
- 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(password)