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 (
)
}