Compare commits

...

2 Commits

Author SHA1 Message Date
victorAnumudu 39b3218545 merged master to branch 2023-04-27 13:52:21 +01:00
victorAnumudu e26330af9a handling adding recipient done 2023-04-27 13:49:19 +01:00
4 changed files with 110 additions and 58 deletions
@@ -15,6 +15,8 @@ export default function InputCom({
onClick, onClick,
disable, disable,
blurHandler, blurHandler,
onMouseEnter,
onMouseLeave
}) { }) {
const inputRef = useRef(null) const inputRef = useRef(null)
// Entry Validation // Entry Validation
@@ -90,6 +92,8 @@ export default function InputCom({
ref={inputRef} ref={inputRef}
readOnly={disable} readOnly={disable}
onBlur={blurHandler} onBlur={blurHandler}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
/> />
{iconName && ( {iconName && (
<div className="absolute right-6 bottom-[10px] z-10"> <div className="absolute right-6 bottom-[10px] z-10">
+45 -10
View File
@@ -1,9 +1,12 @@
import React, {useEffect, useState} from 'react' import React, {useEffect, useState} from 'react'
import { Link } from 'react-router-dom' import { Link, useNavigate } from 'react-router-dom'
import Icons from '../Helpers/Icons' import Icons from '../Helpers/Icons'
import usersService from '../../services/UsersService' import usersService from '../../services/UsersService'
import InputCom from '../Helpers/Inputs/InputCom' import InputCom from '../Helpers/Inputs/InputCom'
import LoadingSpinner from '../Spinners/LoadingSpinner'
import {toast} from 'react-toastify'
import {Formik, Form} from 'formik' import {Formik, Form} from 'formik'
import * as Yup from 'yup' import * as Yup from 'yup'
@@ -34,7 +37,7 @@ const validationSchema = Yup.object().shape({
.required('Repeat Account Number is required') .required('Repeat Account Number is required')
.oneOf([Yup.ref('accountNumber'), null], 'Must match Account Number'), .oneOf([Yup.ref('accountNumber'), null], 'Must match Account Number'),
accountType: Yup.string() accountType: Yup.string()
.min(3, 'Minimum 3 characters') .min(1, 'Minimum 3 characters')
.max(25, 'Maximum 25 characters') .max(25, 'Maximum 25 characters')
.required('Account Type is required'), .required('Account Type is required'),
city: Yup.string() city: Yup.string()
@@ -63,6 +66,10 @@ function AddRecipient() {
const apiURL = new usersService() const apiURL = new usersService()
const navigate = useNavigate()
let [requestStatus, setRequestStatus] = useState({message: '', loading: false, status: false})
let [allCountries, setAllCountries] = useState({ // STATE TO HOLD LIST OF COUNTRIES let [allCountries, setAllCountries] = useState({ // STATE TO HOLD LIST OF COUNTRIES
loading: true, loading: true,
data: [] data: []
@@ -78,14 +85,36 @@ function AddRecipient() {
data: [] data: []
}) })
//FUNCTION TO HANDLE SUBMIT //FUNCTION TO HANDLE ADD RECIPIENT SUBMIT
const handleSubmit = (values, helpers) => { const handleSubmit = (values, helpers) => {
// setRequestState({message: '', loading: true, status: false}) setRequestStatus({message: '', loading: true, status: false})
console.log('working')
//valid inputs before submitting. Just for texting remove later let reqData = { //REQUEST DATA FOR API CALL
firstname: values.firstname,
lastname: values.lastname,
bank_code: values.bank,
account_no: values.accountNumber,
account_type: values.accountType,
country: values.country,
state: values.state,
city: values.city
}
//CALL TO ADD RECIPIENT API
apiURL.addRecipient(reqData).then((res)=>{
if(res.data.internal_return < 0){
setRequestStatus({message: 'could not add recipient, try again!', loading: false, status: true})
return
}
// setRequestStatus({message: 'Recipient Added Successfully!', loading: false, status: true})
toast.success("Recipient Added Successfully!");
setTimeout(()=>{navigate('../transfer-fund',{replace:true})},1000)
}).catch((error)=>{
setRequestStatus({message: 'Opps! an error occured! Try again later', loading: false, status: false})
})
} }
// FUNCTION TO GET COUNTRIES // FUNCTION TO GET COUNTRIES
const getCountry = ()=> { const getCountry = ()=> {
apiURL.getSignupCountryData().then((res)=>{ apiURL.getSignupCountryData().then((res)=>{
@@ -205,7 +234,7 @@ function AddRecipient() {
<div className='add-recipient w-full'> <div className='add-recipient w-full'>
<label className='input-label text-[#181c32] dark:text-white text-base font-semibold block mb-2.5'>Bank Name <span className='text-red-500'>*</span></label> <label className='input-label text-[#181c32] dark:text-white text-base font-semibold block mb-2.5'>Bank Name <span className='text-red-500'>*</span></label>
<select className='w-full text-base p-2 text-dark-gray dark:text-white rounded-md border border-slate-300 outline-0' name='bank' <select className='w-full text-base p-2 text-dark-gray dark:text-white rounded-md border border-slate-300 outline-0' name='bank'
ovalue={props.values.bank} value={props.values.bank}
onChange={props.handleChange} onChange={props.handleChange}
onBlur={props.handleBlur} onBlur={props.handleBlur}
> >
@@ -216,7 +245,7 @@ function AddRecipient() {
<> <>
<option className='text-slate-500 text-lg' value="">Select...</option> <option className='text-slate-500 text-lg' value="">Select...</option>
{bankName.data.map((item, index)=>( {bankName.data.map((item, index)=>(
<option key={index} className='text-slate-500 text-lg' value={item.name}>{item.name}</option> <option key={index} className='text-slate-500 text-lg' value={item.code}>{item.name}</option>
))} ))}
</> </>
: :
@@ -273,7 +302,7 @@ function AddRecipient() {
<> <>
<option className='text-slate-500 text-lg' value="">Select...</option> <option className='text-slate-500 text-lg' value="">Select...</option>
{accType.data.map((item, index)=>( {accType.data.map((item, index)=>(
<option key={index} className='text-slate-500 text-lg' value={item.name}>{item.name}</option> <option key={index} className='text-slate-500 text-lg' value={item.value}>{item.name}</option>
))} ))}
</> </>
: :
@@ -313,14 +342,20 @@ function AddRecipient() {
{(props.errors.city && props.touched.city) && <p className="text-sm text-red-500">{props.errors.city}</p>} {(props.errors.city && props.touched.city) && <p className="text-sm text-red-500">{props.errors.city}</p>}
</div> </div>
</div> </div>
{/* end of inputs starts here */} {/* end of inputs starts here */}
{/* REQUEST ERROR DISPLAY */}
{requestStatus.message && <p className='text-sm text-red-500'>{requestStatus.message}</p>}
<div className='add-recipient-btn flex justify-end items-center py-4'> <div className='add-recipient-btn flex justify-end items-center py-4'>
{requestStatus.loading ?
<LoadingSpinner size={6} color='sky-blue' />
:
<button type='submit' className='text-lg text-white bg-sky-blue px-4 py-2 hover:opacity-90 rounded-md flex items-center space-x-1'> <button type='submit' className='text-lg text-white bg-sky-blue px-4 py-2 hover:opacity-90 rounded-md flex items-center space-x-1'>
<span className='pr-2'>ADD RECIPIENT</span> <span className='pr-2'>ADD RECIPIENT</span>
<Icons name="arrows" /> <Icons name="arrows" />
</button> </button>
}
</div> </div>
</Form> </Form>
)} )}
+47 -45
View File
@@ -2,6 +2,7 @@ import React, {useEffect, useState} from 'react'
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
import RecentActivityTable from './WalletComponent/RecentActivityTable' import RecentActivityTable from './WalletComponent/RecentActivityTable'
import LoadingSpinner from '../Spinners/LoadingSpinner' import LoadingSpinner from '../Spinners/LoadingSpinner'
import InputCom from '../Helpers/Inputs/InputCom'
import usersService from '../../services/UsersService' import usersService from '../../services/UsersService'
@@ -97,57 +98,53 @@ function TransferFund({payment, wallet}) {
: :
<h2 className='my-4 py-2 text-slate-900 dark:text-white text-xl lg:text-2xl font-medium'>No Wallet Information Found!</h2> <h2 className='my-4 py-2 text-slate-900 dark:text-white text-xl lg:text-2xl font-medium'>No Wallet Information Found!</h2>
} }
<div className='my-3 md:flex items-center justify-between space-x-2'> <div className="xl:flex xl:space-x-7 mb-6">
<div className='transfer-input w-full md:w-1/2'>
<label className='w-full text-slate-600 text-lg'>Amount <span className='text-red-500'>*</span></label> <div className="field w-full mb-6 xl:mb-0">
<input className='w-full p-3 text-lg text-right bg-slate-100 rounded-md outline-0 placeholder:text-slate-500 placeholder:text-lg' <InputCom
value={inputs.amount} label="Amount"
name='amount'
type="text" type="text"
placeholder='Amount' name="amount"
required value={inputs.amount}
onChange={handleChange} inputHandler={handleChange}
onMouseEnter={()=>{setNewFee(false)}} onMouseEnter={()=>{setNewFee(false)}}
onMouseLeave={()=>{setNewFee(true)}} onMouseLeave={()=>{setNewFee(true)}}
/> />
</div> </div>
<div className='transfer-input w-full md:w-1/2'>
<label className='w-full text-slate-600 text-lg'>Fee <span className='text-red-500'>*</span></label> <div className="field w-full">
<input className='w-full p-3 text-lg text-right bg-slate-100 opacity-50 rounded-md outline-0 placeholder:text-slate-500 placeholder:text-lg' <InputCom
value={sendMoneyFee.fee} label="Fee"
name='fee'
type="text" type="text"
placeholder='Fee' name="fee"
required value={sendMoneyFee.fee}
disabled disable={true}
/> />
</div> </div>
</div> </div>
<div className='my-3 md:flex items-center justify-end space-x-2'> <div className='md:flex items-center justify-end'>
<div className='transfer-input w-full md:w-1/2'> <div className="field w-full lg:w-1/2 mb-6">
<label className='w-full text-slate-600 text-lg'>Total <span className='text-red-500'>*</span></label> <InputCom
<input className='w-full p-3 text-lg text-right bg-slate-100 opacity-50 rounded-md outline-0 placeholder:text-slate-500 placeholder:text-lg' label="Total"
value={sendMoneyFee.total}
name='total'
type="text" type="text"
placeholder='Total' name="total"
required value={sendMoneyFee.total}
disabled disable={true}
/> />
</div> </div>
</div> </div>
<div className='relative my-3 md:flex items-center'> <div className='relative my-3 md:flex items-center'>
<div className='transfer-input w-full'> <div className='transfer-input w-full'>
<div className='flex items-center justify-start'> <div className='flex items-center justify-start py-2'>
<label className='text-slate-600 text-lg'>Recipient <label className='text-[#181c32] dark:text-white text-base font-semibold block mb-2.5'>Recipient
<span className='text-red-500 mx-2'>*</span> <span className='text-red-500 mx-2'>*</span>
<span title='Transfer Recipient' className={`text-white text-sm bg-slate-500 w-1 h-1 rounded-full px-3 py-1 cursor-pointer`}>!</span> <span title='Transfer Recipient' className={`text-white text-sm bg-slate-500 w-1 h-1 rounded-full px-3 py-1 cursor-pointer`}>!</span>
</label> </label>
<Link to='add-recipient' className='mx-1 text-base text-white p-3 bg-[orange] rounded-md hover:opacity-80'>Add New</Link> <Link to='add-recipient' className='mx-1 text-base text-white p-2 bg-[orange] rounded-md hover:opacity-80'>Add New</Link>
</div> </div>
<select className='mt-2 w-full p-3 text-lg bg-white rounded-md border border-slate-300 outline-0' value={inputs.recipient} name='recipient' onChange={handleChange}> <select className='w-full text-base p-2 text-dark-gray dark:text-white rounded-md border border-slate-300 outline-0' value={inputs.recipient} name='recipient' onChange={handleChange}>
{recepients.loading ? {recepients.loading ?
<option className='text-slate-500 text-lg' value="">Loading...</option> <option className='text-slate-500 text-lg' value="">Loading...</option>
: :
@@ -168,18 +165,23 @@ function TransferFund({payment, wallet}) {
</div> </div>
</div> </div>
<div className='my-3 md:flex items-center'> <div className="field w-full mb-6">
<div className='transfer-input w-full'> {/* <InputCom
<label className='w-full text-slate-600 text-lg'>Comment <span className='text-red-500'>*</span></label> label="Comment"
<input className='w-full p-3 text-lg bg-slate-100 rounded-md outline-0 placeholder:text-slate-500 placeholder:text-lg' type="text"
value={inputs.comment} name="comment"
name='comment' value={inputs.comment}
type="text" inputHandler={handleChange}
placeholder='Comment' /> */}
required <label className='text-[#181c32] dark:text-white text-base font-semibold block mb-2.5'>Comment</label>
onChange={handleChange} <textarea style={{resize: 'none'}}
/> className='text-base px-6 text-dark-gray dark:text-white w-full bg-slate-100 dark:bg-[#11131F] focus:ring-0 focus:outline-none'
</div> name="comment"
value={inputs.comment}
onChange={handleChange}
cols="30"
rows="2"
/>
</div> </div>
<div className='transfer-fund-btn flex justify-end items-center py-4'> <div className='transfer-fund-btn flex justify-end items-center py-4'>
+11
View File
@@ -165,6 +165,17 @@ class usersService {
return this.postAuxEnd("/recipients", postData); return this.postAuxEnd("/recipients", postData);
} }
//END POINT CALL FOR UPDATE PROFILE
addRecipient(data){
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
...data
};
return this.postAuxEnd("/addrecipient", postData);
}
// API FUNCTION TO GET SEND MONEY FEE // API FUNCTION TO GET SEND MONEY FEE
getSendMoneyFee(amount){ getSendMoneyFee(amount){
var postData = { var postData = {