import React, { useState, useEffect } from 'react';
import { _retrieveStoreData } from '../../../../../src/providers/StoreUtil';
import {
Checkout as CheckoutController,
useOrder,
useSession,
useApi,
ToastType,
useToast
} from 'ordering-components/native';
import { PaymentOptions } from '../PaymentOptions';
const manageErrorsToShow = (array = []) => {
let stringError = ''
const list = Array.isArray(array) ? array : Object.values(array)
list.map((item: any, i: number) => {
stringError += (i + 1) === array.length ? `- ${item?.message || item}` : `- ${item?.message || item}\n`
})
return stringError;
}
const CheckoutUI = (props: any) => {
const {
navigation,
cart,
errors,
placing,
cartState,
businessDetails,
paymethodSelected,
handlePaymethodChange,
handlerClickPlaceOrder,
onNavigationRedirect
} = props
const [errorCash, setErrorCash] = useState(false);
const [customerName, setCustomerName] = useState(null);
const getCustomerName = async () => {
const data = await _retrieveStoreData('customer_name');
setCustomerName(data?.customerName)
}
useEffect(() => {
if (!cartState.loading && cart && !cart?.valid && cart?.status === 2) {
navigation?.canGoBack() && navigation.goBack()
} else {
getCustomerName()
}
}, [cart])
useEffect(() => {
if (!cartState.loading && cart && !cart?.valid && cart?.status === 2) {
navigation?.canGoBack() && navigation.goBack()
}
}, [cart])
return (
<>
>
)
}
export const Checkout = (props: any) => {
const {
errors,
clearErrors,
cartUuid,
onNavigationRedirect,
} = props
const [, { showToast }] = useToast();
const [{ token }] = useSession();
const [ordering] = useApi();
const [,{ confirmCart }] = useOrder();
const [cartState, setCartState] = useState({ loading: true, error: [], cart: null });
const getOrder = async (cartId: any) => {
try {
setCartState({ ...cartState, loading: true })
const url = `${ordering.root}/carts/${cartId}`
const response = await fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`
}
})
const { result } = await response.json();
if (result.status === 1 && result.order?.uuid) {
onNavigationRedirect('OrderDetails', { orderId: result.order.uuid })
setCartState({ ...cartState, loading: false })
} else if (result.status === 2 && result.paymethod_data?.gateway === 'stripe_redirect') {
try {
const confirmCartRes = await confirmCart(cartUuid)
if (confirmCartRes.error) {
showToast(ToastType.Error, confirmCartRes.error.message)
}getOrder
getOrder
if (confirmCartRes.result.order?.uuid) {
onNavigationRedirect('OrderDetails', { orderId: confirmCartRes.result.order.uuid, isFromCheckout: true })
}
setCartState({
...cartState,
loading: false,
cart: result
})
} catch (error: any) {
showToast(ToastType.Error, error?.toString() || error.message)
}
} else {
const cart = Array.isArray(result) ? null : result
setCartState({
...cartState,
loading: false,
cart,
error: cart ? null : result
})
}
} catch (e: any) {
setCartState({
...cartState,
loading: false,
error: [e.toString()]
})
}
}
useEffect(() => {
if (errors) {
const errorText = manageErrorsToShow(errors)
showToast(ToastType.Error, errorText)
clearErrors && clearErrors()
}
}, [errors])
useEffect(() => {
if (token && cartUuid) {
getOrder(cartUuid)
}
}, [token, cartUuid])
const checkoutProps = {
...props,
UIComponent: CheckoutUI,
cartState,
businessId: cartState.cart?.business_id
}
return (
<>
>
)
}