import React, { useEffect, useState } from 'react'; import { FlatList, TouchableOpacity, View, StyleSheet, KeyboardAvoidingView, Platform } from 'react-native'; import { Placeholder, PlaceholderLine, Fade } from "rn-placeholder"; import { PaymentOptions as PaymentOptionsController, useLanguage, ToastType, useToast, useSession } from 'ordering-components/native'; import { useTheme } from 'styled-components/native'; import { PaymentOptionCash } from '../PaymentOptionCash'; import { StripeElementsForm } from '../StripeElementsForm'; import { StripeCardsList } from '../StripeCardsList'; import { PaymentOptionCard } from '../PaymentOptionCard' // import { PaymentOptionStripe } from '../PaymentOptionStripe'; // import { StripeRedirectForm } from '../StripeRedirectForm'; // import { PaymentOptionPaypal } from '../PaymentOptionPaypal' // import { NotFoundSource } from '../NotFoundSource' import { OText, OIcon, OModal, OButton } from '../shared'; import { PMContainer, PMItem, PMCardSelected, PMCardItemContent } from './styles' import { getIconCard, flatArray } from '../../utils'; import { useApplePay } from '@stripe/stripe-react-native'; const stripeOptions: any = ['stripe_direct', 'stripe', 'stripe_connect'] const methodsPay = ['google_pay', 'apple_pay'] const stripeDirectMethods = ['stripe_direct'] // const stripeRedirectOptions = [ // { name: 'Bancontact', value: 'bancontact' }, // { name: 'Alipay', value: 'alipay' }, // { name: 'Giropay', value: 'giropay' }, // { name: 'iDEAL', value: 'ideal' } // ] const webViewPaymentGateway: any = ['paypal', 'square'] const multiCheckoutMethods = ['global_google_pay', 'global_apple_pay'] const cardsPaymethods = ['credomatic'] const guestNotSupportedMethods = ['stripe', 'stripe_connect', 'stripe_redirect'] const popupMethods = [...guestNotSupportedMethods, 'stripe_direct', 'paypal'] const PaymentOptionsUI = (props: any) => { const { cart, errorCash, isLoading, isDisabled, paymethodData, paymethodsList, setPaymethodData, onNavigationRedirect, handlePaymethodClick, handlePaymethodDataChange, isOpenMethod, handlePaymentMethodClickCustom, handlePlaceOrder, merchantId, urlscheme, setMethodPaySupported, placeByMethodPay, methodPaySupported, setPlaceByMethodPay, setCardList, onPaymentChange, requiredFields, openUserModal, paymethodClicked, setPaymethodClicked, androidAppId, setUserHasCards, guestDisabledError, handleOpenGuestSignup } = props const theme = useTheme(); const [, { showToast }] = useToast(); const [{ user }] = useSession() const { confirmApplePayPayment } = useApplePay() const getPayIcon = (method: string) => { switch (method) { case 'cash': return theme.images.general.cash case 'card_delivery': return theme.images.general.carddelivery case 'paypal': return theme.images.general.paypal case 'stripe': return theme.images.general.creditCard case 'stripe_direct': return theme.images.general.stripecc case 'stripe_connect': return theme.images.general.stripes case 'stripe_redirect': return theme.images.general.stripesb case 'apple_pay': return theme.images.general.applePayMark case 'google_pay': return theme.images.general.googlePayMark default: return theme.images.general.creditCard } } const [, t] = useLanguage(); const [addCardOpen, setAddCardOpen] = useState({ stripe: false, stripeConnect: false, card: false }); const paymethodSelected = props.paySelected || props.paymethodSelected || isOpenMethod?.paymethod // const [{ token }] = useSession() // const [card, setCard] = useState(null); // const stripeRedirectValues = [ // { name: t('SELECT_A_PAYMENT_METHOD', 'Select a payment method'), value: '-1' }, // ] const paymethodsFieldRequired = ['paypal', 'apple_pay', 'global_apple_pay'] const handlePaymentMethodClick = (paymethod: any) => { const _guestNotSupportedMethods = guestDisabledError ? popupMethods : guestNotSupportedMethods if (handleOpenGuestSignup && _guestNotSupportedMethods.includes(paymethod?.gateway) && !!user?.guest_id) { handleOpenGuestSignup() return } if (cart?.balance > 0 || !!user?.guest_id) { if (paymethodsFieldRequired.includes(paymethod?.gateway) && requiredFields.length > 0) { openUserModal && openUserModal(true) setPaymethodClicked({ confirmed: false, paymethod }) return } const isPopupMethod = ['stripe', 'stripe_direct', 'stripe_connect', 'stripe_redirect', 'paypal'].includes(paymethod?.gateway) if (webViewPaymentGateway.includes(paymethod?.gateway)) { handlePaymentMethodClickCustom(paymethod) } handlePaymethodClick(paymethod, isPopupMethod) return } showToast( ToastType.Error, t('CART_BALANCE_ZERO', 'Sorry, the amount to pay is equal to zero and it is not necessary to select a payment method')) ; } useEffect(() => { if (cart?.balance === 0) { handlePaymethodClick(null) } }, [cart?.balance]) useEffect(() => { if (paymethodsList.paymethods.length === 1) { handlePaymethodClick && handlePaymethodClick(paymethodsList.paymethods[0]) } }, [paymethodsList.paymethods]) useEffect(() => { if (paymethodSelected?.gateway !== 'cash' && errorCash) { props.setErrorCash(false) } }, [paymethodSelected]) useEffect(() => { if (props.paySelected && props.paySelected?.data) { requestAnimationFrame(() => { setPaymethodData && setPaymethodData(props.paySelected?.data) }) } }, [props.paySelected]) useEffect(() => { if (methodsPay.includes(paymethodSelected?.gateway) && paymethodData?.id && paymethodSelected?.data?.card) { handlePlaceOrder(confirmApplePayPayment) } }, [paymethodData, paymethodSelected]) useEffect(() => { if (paymethodClicked?.confirmed) { handlePaymentMethodClickCustom(paymethodClicked?.paymethod) } }, [paymethodClicked?.confirmed]) const renderPaymethods = ({ item }: any) => { return ( <> {methodsPay.includes(item?.gateway) ? ( handlePaymentMethodClick(item)} > ) : ( handlePaymentMethodClick(item)} > {t(item?.gateway?.toUpperCase(), item.name)} )} ) } const excludeIds: any = [32]; //exclude paypal & connect & redirect const filterMethodsPay = (gateway: string) => Platform.OS === 'ios' ? gateway !== 'google_pay' : gateway !== 'apple_pay' return ( {paymethodsList.paymethods.length > 0 && ( a.id - b.id)} data={paymethodsList.paymethods.sort((a: any, b: any) => a.id - b.id) .filter((p: any) => !multiCheckoutMethods.includes(p.gateway) && filterMethodsPay(p.gateway) && !excludeIds.includes(p.id))} renderItem={renderPaymethods} keyExtractor={(paymethod: any) => paymethod?.id?.toString?.()} /> )} {(paymethodsList.loading || isLoading) && ( {[...Array(3)].map((_, i) => ( ))} )} {paymethodsList.error && paymethodsList.error.length > 0 && ( {paymethodsList?.error[0]?.message || paymethodsList?.error[0]} )} {!(paymethodsList.loading || isLoading) && !paymethodsList.error && (!paymethodsList?.paymethods || paymethodsList.paymethods.length === 0) && ( {t('NO_PAYMENT_METHODS', 'No payment methods!')} )} {paymethodSelected?.gateway === 'cash' && ( )} {/* {stripeOptions.includes(paymethodSelected?.gateway) && (paymethodData?.brand || paymethodData?.card?.brand) && (paymethodData?.last4 || paymethodData?.card?.last4) && ( {getIconCard((paymethodData?.brand || paymethodData?.card?.brand), 20)} XXXX-XXXX-XXXX-{(paymethodData?.last4 || paymethodData?.card?.last4)} )} */} {/* Stripe */} {isOpenMethod?.paymethod?.gateway === 'stripe' && ( setAddCardOpen({ ...addCardOpen, stripe: true })} /> handlePaymethodClick(null)} setAddCardOpen={setAddCardOpen} addCardOpen={addCardOpen} isOpenMethod={isOpenMethod} handleSource={handlePaymethodDataChange} clientSecret={props.clientSecret} businessId={props.businessId} onPaymentChange={onPaymentChange} paySelected={props.paySelected} setUserHasCards={setUserHasCards} /> )} {/* Google pay, Apple pay */} {methodsPay.includes(isOpenMethod?.paymethod?.gateway) && ( handlePaymethodClick(null)} merchantId={merchantId} urlscheme={urlscheme} androidAppId={androidAppId} setMethodPaySupported={setMethodPaySupported} methodPaySupported={methodPaySupported} placeByMethodPay={placeByMethodPay} setPlaceByMethodPay={setPlaceByMethodPay} publicKeyAddCard={isOpenMethod?.paymethod?.credentials?.stripe?.publishable || isOpenMethod?.paymethod?.credentials?.publishable} /> )} {(cardsPaymethods.includes(isOpenMethod?.paymethod?.gateway) || cardsPaymethods.includes(paymethodSelected?.gateway)) && ( handlePaymethodClick(null)} paymethodSelected={paymethodSelected?.data?.id} handlePaymentMethodClick={handlePaymentMethodClick} /> )} {/* Stripe direct */} handlePaymethodClick(null)} > handlePaymethodClick(null)} merchantId={merchantId} urlscheme={urlscheme} androidAppId={androidAppId} publicKeyAddCard={isOpenMethod?.paymethod?.credentials?.stripe?.publishable || isOpenMethod?.paymethod?.credentials?.publishable} paySelected={props.paySelected} /> {/* Stripe Connect */} {isOpenMethod?.paymethod?.gateway === 'stripe_connect' && ( setAddCardOpen({ ...addCardOpen, stripeConnect: true })} /> handlePaymethodClick(null)} publicKey={isOpenMethod?.paymethod?.credentials.publishable} publicKeyAddCard={isOpenMethod?.paymethod?.credentials?.stripe?.publishable || isOpenMethod?.paymethod?.credentials?.publishable} paySelected={props.paySelected} setUserHasCards={setUserHasCards} /> )} {/** Stripe connect add cards */} setAddCardOpen({ ...addCardOpen, stripeConnect: false })} > setAddCardOpen({ ...addCardOpen, stripeConnect: false })} publicKeyAddCard={isOpenMethod?.paymethod?.credentials?.stripe?.publishable || isOpenMethod?.paymethod?.credentials?.publishable} /> {/* Stripe Add card */} setAddCardOpen({ ...addCardOpen, stripe: false })} style={{ backgroundColor: 'red' }} > setAddCardOpen({ ...addCardOpen, stripe: false })} publicKeyAddCard={isOpenMethod?.paymethod?.credentials?.stripe?.publishable || isOpenMethod?.paymethod?.credentials?.publishable} /> {/* Stripe Redirect */} {/* handlePaymethodClick(null)} > */} {/* Paypal */} {/* handlePaymethodClick(null)} title={t('PAY_WITH_PAYPAL', 'Pay with PayPal')} > {paymethodSelected?.gateway === 'paypal' && ( onNavigationRedirect && onNavigationRedirect('OrderDetails', { orderId: uuid })} /> )} */} ) } const styles = StyleSheet.create({ viewStyle: { marginRight: 10 }, cardsList: { borderWidth: 1, borderColor: 'red', flex: 1, height: 120 }, btnAddStyle: { marginVertical: 20, borderRadius: 7.6, shadowOpacity: 0, height: 44, borderWidth: 1 }, }) export const PaymentOptions = (props: any) => { const paymentOptions = { ...props, UIComponent: PaymentOptionsUI } return ( ) }