Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
1 www 1
import {axios} from "../../../utils";
2
import React, { useEffect, useRef, useState } from "react";
3
import { useForm } from "react-hook-form";
4
import { useDispatch } from "react-redux";
5
import { addNotification } from "../../../redux/notification/notification.actions";
6
import BootstrapModal from "../../../shared/bootstrapModal/BootstrapModal";
7
import FormErrorFeedback from "../../../shared/form-error-feedback/FormErrorFeedback";
8
import Spinner from "../../../shared/loading-spinner/Spinner";
9
import MaterialTable from "../../../shared/materialTable/MaterialTable";
10
 
11
const TransactionTableColumns = [
12
  {
13
    field: "type",
14
    headerName: "Tipo",
15
  },
16
  {
17
    field: "amount",
18
    headerName: "Monto",
19
  },
20
  {
21
    field: "status",
22
    headerName: "Estado",
23
  },
24
  {
25
    field: "description",
26
    headerName: "Descripción",
27
  },
28
  {
29
    field: "updated_on",
30
    headerName: "Fecha",
31
  },
32
  {
33
    field: "provider",
34
    headerName: "Proveedor",
35
  },
36
];
37
 
38
const Transactions = (props) => {
39
  // props destructuring
40
  const { routeTransactions, amounts, balance, routeAddFunds } = props;
41
  const dispatch = useDispatch();
42
 
43
  // react hook form
44
  const { register, handleSubmit, errors } = useForm();
45
 
46
  const formEl = useRef();
47
 
48
  const [transactionData, setTransactionData] = useState({});
49
  const [transactionModalOpen, setTransactionModalOpen] = useState(false);
50
  const [modalLoading, setModalLoading] = useState(false);
51
 
52
  useEffect(async () => {
53
    const resData = (await axios.get(routeTransactions)).data;
54
    if (!resData.success) {
55
      return dispatch(
56
        addNotification({
57
          style: "danger",
58
          msg: "Ha ocurrido un error, por favor recargue la pagina",
59
        })
60
      );
61
    }
62
    setTransactionData(resData.data);
63
  }, []);
64
 
65
  const onSubmit = async (data) => {
66
    setModalLoading(true);
67
    const formData = new FormData();
68
    Object.entries(data).map(([key, value]) => {
69
      formData.append(key, value);
70
    });
71
    const resData = (await axios.post(routeAddFunds, formData)).data;
72
    if (!resData.success) {
73
      const errorMessage =
74
        typeof resData.data === "string"
75
          ? resData.data
76
          : "Ha ocurrido un error, Por favor intente mas tarde";
77
      dispatch(
78
        addNotification({
79
          style: "danger",
80
          msg: errorMessage,
81
        })
82
      );
83
    }
84
    const paypalRoute = resData.data;
85
    window.location.replace(paypalRoute);
86
    setModalLoading(false);
87
  };
88
 
89
  return (
90
    <React.Fragment>
91
      <div className="acc-setting">
92
        <h3>Transacciones</h3>
3590 stevensc 93
        <div className="cp-field mb-3">
1 www 94
          <h5 id="location-formatted-address">Balance (USD)</h5>
95
          <div className="cpp-fiel">
96
            <input type="text" readOnly value={balance} />
97
          </div>
98
          <div className="cpp-fiel">
99
            <input
100
              type="button"
101
              id="btn-add-fund"
102
              value="Agregar fondos"
103
              onClick={() => setTransactionModalOpen(true)}
104
            />
105
          </div>
106
        </div>
107
        <div className="cp-field" style={{ marginBottom: "1rem" }}>
108
          <MaterialTable
109
            columns={TransactionTableColumns}
110
            rows={transactionData.items}
111
            count={transactionData.total}
112
          />
113
        </div>
114
      </div>
115
      <BootstrapModal
116
        show={transactionModalOpen}
117
        title="Agregar Fondos"
118
        onClose={() => setTransactionModalOpen(false)}
119
        onAccept={() => {
120
          formEl.current.dispatchEvent(
121
            new Event("submit", { cancelable: true, bubbles: true })
122
          );
123
        }}
124
      >
125
        <React.Fragment>
126
          <form onSubmit={handleSubmit(onSubmit)} ref={formEl}>
127
            <div className="form-group">
128
              <input
129
                type="text"
130
                name="description"
131
                id="description"
132
                placeholder="Descripción"
133
                ref={register({
134
                  required: "Por favor ingrese una descripción",
135
                  maxLength: {
136
                    value: 50,
137
                    message: "Máximo 50 caracteres",
138
                  },
139
                })}
140
              ></input>
141
              <FormErrorFeedback>
142
                {errors?.description?.message}
143
              </FormErrorFeedback>
144
              <select
145
                name="amount"
146
                id="amount"
147
                ref={register({
148
                  required: "Por favor eliga un monto",
149
                })}
150
                defaultValue=""
151
              >
152
                <option value="">Monto</option>
153
                {Object.entries(amounts).map(([key, value]) => (
154
                  <option value={key} key={key}>
155
                    {value}
156
                  </option>
157
                ))}
158
                <FormErrorFeedback>{errors?.amount?.message}</FormErrorFeedback>
159
              </select>
160
            </div>
161
          </form>
162
        </React.Fragment>
163
      </BootstrapModal>
164
      {modalLoading && (
165
        <div className="spinner-container">
166
          <Spinner />
167
        </div>
168
      )}
169
    </React.Fragment>
170
  );
171
};
172
 
173
export default Transactions;