import React, { useEffect, useState } from 'react' import { Formik, ErrorMessage } from 'formik' import * as Yup from 'yup' import { useDispatch, useSelector } from 'react-redux' import { RootReducer } from '../../store' import { setSidebar } from '../../store/reducers/cart' import { usePurchaseMutation } from '../../services/api' import Button from '../Button' import { parseToBrl } from '../../utils' import ConfirmOrder from '../ConfirmOrder' import { ButtonContainer, FormCheckout, InputContent, InputField, Row } from './styles' const Checkout = () => { const [purchase, { data }] = usePurchaseMutation() const [orderId, setOrderId] = useState(undefined) const { items } = useSelector((state: RootReducer) => state.cart) const [checkoutData, setCheckoutData] = useState({ delivery: { receiver: '', address: { description: '', city: '', zipCode: '', number: 1, complement: '' } }, payment: { card: { name: '', number: '', code: 123, expires: { month: 7, year: 2034 } } }, products: items.map((item) => ({ id: item.id.toString(), price: item.preco })) }) const [currentStep, setCurrentStep] = useState(0) const makeRequest = (formData: CheckoutProps) => { purchase(formData) } useEffect(() => { if (data) { setOrderId(data.orderId) } }, [data]) const nextStep = (newData: CheckoutProps, final = false) => { setCheckoutData((prev) => ({ ...prev, ...newData })) if (final) { makeRequest(newData) setCurrentStep((prev) => prev + 1) return } setCurrentStep((prev) => prev + 1) } const pervStep = (newData: CheckoutProps) => { setCheckoutData((prev) => ({ ...prev, ...newData })) setCurrentStep((prev) => prev - 1) } const steps = [ , , orderId ? ( ) : (

Carregando...

) ] return <>{steps[currentStep]} } interface StepProps { next?: (values: CheckoutProps, final?: boolean) => void data: CheckoutProps prev?: (values: CheckoutProps) => void } const stepOneValidationSchema = Yup.object({ receiver: Yup.string() .min(5, 'O nome precisa de pelo menos 5 caracteres') .required('Obrigatório'), address: Yup.string().min(5, 'Endereço inválido').required('Obrigatório'), city: Yup.string().min(2, 'Cidade inválida').required('Obrigatório'), cep: Yup.string() .min(8, 'Cep inválido') .max(8, 'Inválido') .required('Obrigatório'), number: Yup.string().required('Obrigatório') }) export const StepOne = (props: StepProps) => { const handleSubmit = (values: CheckoutProps) => { props.next && props.next(values) } const dispatch = useDispatch() const handleCart = () => { dispatch(setSidebar('cart')) } return ( {() => (

Entrega

)}
) } const stepTwoValidationSchema = Yup.object({ cardName: Yup.string().min(5, 'Nome inválido').required('Obrigatório'), cardNumber: Yup.string() .min(16, 'Somente 16 números') .max(16, 'Somente 16 números') .required('Obrigatório'), cvv: Yup.string().min(3, '3 núm.').max(3, '3 núm.').required('Obrigatório'), monthlyValidity: Yup.string() .min(1, '2 números') .max(2, '2 números') .required('Obrigatório'), annualValidity: Yup.string() .min(4, 'Somente 4 números') .max(4, 'Somente 4 números') .required('Obrigatório') }) const StepTwo = (props: StepProps) => { const handleSubmit = (values: CheckoutProps) => { props.next && props.next(values, true) } const totalPrice = useSelector((state: RootReducer) => state.cart.totalPrice) return ( {({ values }) => (

Pagamento - Valor a pagar {parseToBrl(totalPrice)}

)}
) } const StepThree = ({ orderId }: { orderId: string }) => { return } export default Checkout