Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 2802 | Rev 3432 | Ir a la última revisión | 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]) => ({
        name: 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 { data: response } = await axios.post(
      '/account-settings/transactions/add-funds',
      formData
    )
    const { success, data } = response

    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