Rev 3697 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import React, { useMemo, useState } from 'react';
import { useDispatch } from 'react-redux';
import { useForm } from 'react-hook-form';
import { axios } from '@utils';
import { useFetch } from '@hooks';
import { addNotification } from '@app/redux/notification/notification.actions';
import Table from '@components/table/Table';
import Modal from '@components/UI/modal/Modal';
import Input from '@components/UI/inputs/Input';
import SelectField from '@components/UI/inputs/Select';
const TransactionTableColumns = [
{
field: 'type',
headerName: 'Tipo'
},
{
field: 'amount',
headerName: 'Monto'
},
{
field: 'status',
headerName: 'Estado'
},
{
field: 'description',
headerName: 'Descripción'
},
{
field: 'updated_on',
headerName: 'Fecha'
},
{
field: 'provider',
headerName: 'Proveedor'
}
];
const Transactions = () => {
const { data: transactions } = useFetch('/account-settings/transactions');
const {
data: { balance, amounts }
} = useFetch('/account-settings');
const [showModal, setShowModal] = useState(false);
return (
<>
<div className='acc-setting'>
<h3>Transacciones</h3>
<div className='cp-field'>
<h5 id='location-formatted-address'>Balance (USD)</h5>
<div className='cpp-fiel'>
<input type='text' readOnly value={balance} />
</div>
<div className='cpp-fiel'>
<input
type='button'
id='btn-add-fund'
value='Agregar fondos'
onClick={() => setShowModal(true)}
/>
</div>
</div>
<div className='cp-field'>
<Table columns={TransactionTableColumns} rows={transactions.items} />
</div>
</div>
<TransactionModal show={showModal} amounts={amounts} onClose={() => setShowModal(false)} />
</>
);
};
const TransactionModal = ({ show, onClose, amounts = {} }) => {
const [loading, setLoading] = useState(false);
const dispatch = useDispatch();
const {
control,
handleSubmit,
formState: { errors }
} = useForm();
const amountsValues = useMemo(
() =>
Object.entries(amounts).map(([key, value]) => ({
label: key,
value
})),
[amounts]
);
const onSubmit = handleSubmit(async (sendData) => {
setLoading(true);
const formData = new FormData();
Object.entries(sendData).forEach(([key, value]) => formData.append(key, value));
const response = await axios.post('/account-settings/transactions/add-funds', formData);
const { success, data } = response.data;
if (!success) {
const errorMessage =
typeof data === 'string' ? data : 'Ha ocurrido un error, Por favor intente mas tarde';
dispatch(
addNotification({
style: 'danger',
msg: errorMessage
})
);
}
const paypalRoute = data;
window.location.replace(paypalRoute);
setLoading(false);
});
return (
<Modal
show={show}
title='Agregar Fondos'
onClose={onClose}
onReject={onClose}
onAccept={onSubmit}
loading={loading}
>
<Input
control={control}
type='text'
name='description'
placeholder='Descripción'
error={errors.description?.message}
rules={{
required: 'Por favor ingrese una descripción'
}}
/>
<SelectField
name='amount'
label='Monto'
control={control}
error={errors.amount?.message}
rules={{ required: 'Por favor eliga un monto' }}
options={amountsValues}
defaultValue=''
/>
</Modal>
);
};
export default Transactions;