Source

components/_organisms/PaymentForm/index.js

import React, { useContext, useEffect, useState } from "react"
import { useTranslation } from "react-i18next"
// chakra-ui
import { Button, Divider, Flex, Text } from "@chakra-ui/react"
import { InputEmail, InputTextNumber } from "components/_molecules/Inputs"
// context
import { CartContext, CheckoutContext } from "context"
// hooks
import useUser from "hooks/useUser"
// utils
import { handleTotalPrice, handleMapArrayProducts } from "utils"

/**
 * PaymentForm Component
 * @component
 * @author Braian D. Vaylet
 * @description Componente con formulario para la compra
 */
const PaymentForm = () => {
  const { setActivePayment, setPurchase } = useContext(CheckoutContext)
  const { cartItems } = useContext(CartContext)
  const user = useUser()
  const [t] = useTranslation("global")
  const [emailValue, setEmailValue] = useState(null)
  const [nameValue, setNameValue] = useState(null)
  const [dniValue, setDniValue] = useState(null)
  const [phoneValue, setPhoneValue] = useState(null)
  const [streetNameValue, setStreetNameValue] = useState(null)
  const [streetNumberValue, setStreetNumberValue] = useState(null)
  const [deptoValue, setDeptoValue] = useState(null)
  const [isDisabled, setIsDisabled] = useState(false)

  useEffect(() => {
    if (user) {
      setEmailValue(user?.email)
      setNameValue(user?.username)
    }
  }, [user])

  useEffect(() => setActivePayment(isDisabled), [isDisabled])

  /**
   * handleSubmit
   * @function
   * @description habilita el btn de pago
   */
  const handleSubmit = (e) => {
    e.preventDefault()
    if (
      cartItems &&
      emailValue &&
      nameValue &&
      dniValue &&
      phoneValue &&
      streetNameValue &&
      streetNumberValue
    ) {
      setIsDisabled(true)
      setPurchase({
        email: emailValue,
        fullname: nameValue,
        dni: dniValue,
        phone: phoneValue,
        address: streetNameValue,
        addressNum: streetNumberValue,
        addressInfo: deptoValue || "",
        products: handleMapArrayProducts(cartItems),
        total: handleTotalPrice(cartItems),
      })
    } else {
      setIsDisabled(false)
    }
  }

  /**
   * handleClick
   * @function
   * @description permite editar el form
   * @returns {boolean}
   */
  const handleClick = () => setIsDisabled(false)

  return (
    <form onSubmit={handleSubmit}>
      <Flex direction="column" justify="space-between" align="flex-start">
        <Text fontWeight="bold" fontSize="1.25rem">
          {t("PaymentForm.completeForm")}
        </Text>
        <Divider m="10px 0" />
        <Flex direction="row" align="center" justify="space-between">
          <InputEmail
            disabled={emailValue !== null || isDisabled}
            value={emailValue}
            onChange={(value) => setEmailValue(value)}
          />
        </Flex>
        <Flex direction="row" align="center" justify="space-between">
          <InputTextNumber
            disabled={nameValue !== null || isDisabled}
            name="name"
            value={nameValue}
            label={t("PaymentForm.enterName")}
            onChange={(value) => setNameValue(value)}
          />
          <InputTextNumber
            disabled={isDisabled}
            name="dni"
            type="number"
            label={t("PaymentForm.enterDni")}
            onChange={(value) => setDniValue(value)}
          />
          <InputTextNumber
            disabled={isDisabled}
            name="phone"
            label={t("PaymentForm.enterPhone")}
            type="number"
            onChange={(value) => setPhoneValue(value)}
          />
        </Flex>
        <Flex direction="row" align="center" justify="space-between">
          <InputTextNumber
            disabled={isDisabled}
            name="streetName"
            label={t("PaymentForm.enterStreetName")}
            onChange={(value) => setStreetNameValue(value)}
          />
          <InputTextNumber
            disabled={isDisabled}
            name="streetNumber"
            label={t("PaymentForm.enterStreetNumber")}
            onChange={(value) => setStreetNumberValue(value)}
          />
          <InputTextNumber
            disabled={isDisabled}
            name="depto"
            label={t("PaymentForm.enterDepto")}
            isRequired={false}
            onChange={(value) => setDeptoValue(value)}
          />
        </Flex>

        <Flex w="100%" align="center" justify="flex-start" mt={4} p={4}>
          <Button disabled={isDisabled} type="submit">
            {t("PaymentForm.confirm")}
          </Button>
          {isDisabled && (
            <Button variant="outline" ml={4} onClick={handleClick}>
              {t("PaymentForm.edit")}
            </Button>
          )}
        </Flex>
      </Flex>
    </form>
  )
}

export default PaymentForm