Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3432 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3697 stevensc 1
import React, { useMemo, useState } from 'react';
2
import { useDispatch } from 'react-redux';
3
import { useForm } from 'react-hook-form';
2781 stevensc 4
 
3697 stevensc 5
import { axios } from 'utils';
6
import { useFetch } from '@hooks';
7
import { addNotification } from '@app/redux/notification/notification.actions';
2781 stevensc 8
 
3697 stevensc 9
import Table from '@components/table/Table';
10
import Modal from '@components/UI/modal/Modal';
11
import Input from '@components/UI/inputs/Input';
12
import SelectField from '@components/UI/inputs/Select';
2781 stevensc 13
 
14
const TransactionTableColumns = [
15
  {
3697 stevensc 16
    field: 'type',
17
    headerName: 'Tipo'
2781 stevensc 18
  },
19
  {
3697 stevensc 20
    field: 'amount',
21
    headerName: 'Monto'
2781 stevensc 22
  },
23
  {
3697 stevensc 24
    field: 'status',
25
    headerName: 'Estado'
2781 stevensc 26
  },
27
  {
3697 stevensc 28
    field: 'description',
29
    headerName: 'Descripción'
2781 stevensc 30
  },
31
  {
3697 stevensc 32
    field: 'updated_on',
33
    headerName: 'Fecha'
2781 stevensc 34
  },
35
  {
3697 stevensc 36
    field: 'provider',
37
    headerName: 'Proveedor'
38
  }
3432 stevensc 39
];
2781 stevensc 40
 
41
const Transactions = () => {
3697 stevensc 42
  const { data: transactions } = useFetch('/account-settings/transactions');
2781 stevensc 43
  const {
3697 stevensc 44
    data: { balance, amounts }
45
  } = useFetch('/account-settings');
3432 stevensc 46
  const [showModal, setShowModal] = useState(false);
2781 stevensc 47
 
48
  return (
49
    <>
3697 stevensc 50
      <div className='acc-setting'>
2781 stevensc 51
        <h3>Transacciones</h3>
52
 
3697 stevensc 53
        <div className='cp-field'>
54
          <h5 id='location-formatted-address'>Balance (USD)</h5>
2781 stevensc 55
 
3697 stevensc 56
          <div className='cpp-fiel'>
57
            <input type='text' readOnly value={balance} />
2781 stevensc 58
          </div>
59
 
3697 stevensc 60
          <div className='cpp-fiel'>
2781 stevensc 61
            <input
3697 stevensc 62
              type='button'
63
              id='btn-add-fund'
64
              value='Agregar fondos'
2781 stevensc 65
              onClick={() => setShowModal(true)}
66
            />
67
          </div>
68
        </div>
69
 
3697 stevensc 70
        <div className='cp-field'>
2781 stevensc 71
          <Table columns={TransactionTableColumns} rows={transactions.items} />
72
        </div>
73
      </div>
3697 stevensc 74
      <TransactionModal show={showModal} amounts={amounts} onClose={() => setShowModal(false)} />
2781 stevensc 75
    </>
3432 stevensc 76
  );
77
};
2781 stevensc 78
 
79
const TransactionModal = ({ show, onClose, amounts = {} }) => {
3432 stevensc 80
  const [loading, setLoading] = useState(false);
81
  const dispatch = useDispatch();
2781 stevensc 82
 
2802 stevensc 83
  const {
84
    control,
85
    handleSubmit,
3697 stevensc 86
    formState: { errors }
3432 stevensc 87
  } = useForm();
2781 stevensc 88
 
89
  const amountsValues = useMemo(
90
    () =>
91
      Object.entries(amounts).map(([key, value]) => ({
3697 stevensc 92
        label: key,
93
        value
2781 stevensc 94
      })),
95
    [amounts]
3432 stevensc 96
  );
2781 stevensc 97
 
98
  const onSubmit = handleSubmit(async (sendData) => {
3432 stevensc 99
    setLoading(true);
100
    const formData = new FormData();
2781 stevensc 101
 
3697 stevensc 102
    Object.entries(sendData).forEach(([key, value]) => formData.append(key, value));
2781 stevensc 103
 
3697 stevensc 104
    const response = await axios.post('/account-settings/transactions/add-funds', formData);
3432 stevensc 105
    const { success, data } = response.data;
2781 stevensc 106
 
107
    if (!success) {
108
      const errorMessage =
3697 stevensc 109
        typeof data === 'string' ? data : 'Ha ocurrido un error, Por favor intente mas tarde';
2781 stevensc 110
      dispatch(
111
        addNotification({
3697 stevensc 112
          style: 'danger',
113
          msg: errorMessage
2781 stevensc 114
        })
3432 stevensc 115
      );
2781 stevensc 116
    }
3432 stevensc 117
    const paypalRoute = data;
118
    window.location.replace(paypalRoute);
119
    setLoading(false);
120
  });
2781 stevensc 121
 
122
  return (
123
    <Modal
124
      show={show}
3697 stevensc 125
      title='Agregar Fondos'
2781 stevensc 126
      onClose={onClose}
127
      onReject={onClose}
128
      onAccept={onSubmit}
129
      loading={loading}
130
    >
131
      <Input
132
        control={control}
3697 stevensc 133
        type='text'
134
        name='description'
135
        placeholder='Descripción'
2781 stevensc 136
        error={errors.description?.message}
137
        rules={{
3697 stevensc 138
          required: 'Por favor ingrese una descripción'
2781 stevensc 139
        }}
140
      />
141
 
142
      <SelectField
3697 stevensc 143
        name='amount'
144
        label='Monto'
2781 stevensc 145
        control={control}
146
        error={errors.amount?.message}
3697 stevensc 147
        rules={{ required: 'Por favor eliga un monto' }}
2781 stevensc 148
        options={amountsValues}
3697 stevensc 149
        defaultValue=''
2781 stevensc 150
      />
151
    </Modal>
3432 stevensc 152
  );
153
};
2781 stevensc 154
 
3432 stevensc 155
export default Transactions;