import React, { Component } from 'react'; import Link, { navigate } from 'gatsby-link'; import { Box, Flex, Text } from '@rebass/emotion'; import { inject, observer } from 'mobx-react'; import { injectStripe, StripeProvider, Elements } from 'react-stripe-elements'; import CheckoutStore from 'stores/checkout-store'; import { FluidContainer } from 'utils/styles/mixins'; import Divider from 'components/divider'; import CheckoutLayout from 'components/checkout-layout'; import { CheckoutFormContainer, CheckoutFlexContainer, CheckoutBasketContainer } from 'components/checkout-layout/checkout-layout.styles'; import PaymentBasket from './components/payment-basket'; import PaymentForm from './components/payment-form'; import PaymentLoading from './components/payment-loading'; import BasketStore from 'stores/basket-store'; const StripePaymentForm = injectStripe(PaymentForm); interface PaymentProps { checkoutStore?: CheckoutStore; basketStore?: BasketStore; } class Payment extends Component { componentDidMount = (): void => { this.generatePaymentIntent(); this.redirectToCheckout(); } redirectToCheckout = (): void => { if (this.isCheckoutInvalid()) { if (!this.hasBasketItems()) { navigate('/shop', { replace: true }); } else { navigate('/checkout', { replace: true }); } } } generatePaymentIntent = (): void => { if ( !this.isCheckoutInvalid() && this.hasBasketItems() && !this.hasExistingPaymentIntent() ) { this.props.checkoutStore!.generatePaymentIntent(); } } hasExistingPaymentIntent = (): boolean => { return this.props.checkoutStore!.paymentIntent; } hasBasketItems = (): boolean => { return !!this.props.basketStore!.basket.length; } isCheckoutInvalid = (): boolean => { return !this.props.checkoutStore!.form.meta.isValid || !this.props.basketStore!.selectedDeliveryConfig; } render(): JSX.Element | null { if (this.isCheckoutInvalid()) return null; return ( Information Edit { this.props.checkoutStore!.paymentIntent ? : } ); } } export default inject('checkoutStore', 'basketStore')(observer(Payment));