import React, { useState, useMemo } from 'react'; import { View, Alert, Platform } from 'react-native'; import { useRouter } from 'expo-router'; import { tw, MyTextInput, LoadingDialog, MyText, MyTouchableOpacity } from 'common-ui'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; // import RazorpayCheckout from 'react-native-razorpay'; import { trpc } from '@/src/trpc-client'; import { clearLocalCart } from '@/hooks/cart-query-hooks'; import { useQueryClient } from '@tanstack/react-query'; import { FontAwesome5, FontAwesome6 } from '@expo/vector-icons'; interface PaymentAndOrderProps { selectedAddress: number | null; selectedSlots: Record; selectedCouponId: number | null; cartItems: any[]; totalPrice: number; discountAmount: number; finalTotal: number; finalTotalWithDelivery: number; deliveryCharge: number; constsData?: any; selectedCoupons: any[]; isFlashDelivery?: boolean; onCancel?: () => void; } const PaymentAndOrderComponent: React.FC = ({ selectedAddress, selectedSlots, selectedCouponId, cartItems, totalPrice, discountAmount, finalTotal, finalTotalWithDelivery, deliveryCharge, constsData, selectedCoupons, isFlashDelivery = false, onCancel, }) => { const router = useRouter(); const queryClient = useQueryClient(); const [userNotes, setUserNotes] = useState(''); const [isLoadingDialogOpen, setIsLoadingDialogOpen] = useState(false); const [paymentMethod, setPaymentMethod] = useState<'online' | 'cod'>('cod'); // Helper function to clear cart and invalidate queries const clearCartAndInvalidateQueries = async (cartType: 'regular' | 'flash' = 'regular') => { await clearLocalCart(cartType); queryClient.invalidateQueries({ queryKey: [`local-cart-${cartType}`] }); }; const { data: productsData } = trpc.user.product.getAllProductsSummary.useQuery(); // Memoized flash-eligible product IDs const flashEligibleProductIds = useMemo(() => { if (!productsData) return new Set(); return new Set( productsData .filter((product: any) => product.isFlashAvailable) .map((product: any) => product.id) ); }, [productsData]); const placeOrderMutation = trpc.user.order.placeOrder.useMutation({ onSuccess: (data) => { const orders = data.data; // Now an array of orders const firstOrder = orders[0]; // Use first order for payment flow if (!firstOrder.isCod) { // createRazorpayOrderMutation.mutate({ orderId: firstOrder.id.toString() }); } else { // Clear cart and navigate to success page clearCartAndInvalidateQueries(isFlashDelivery ? 'flash' : 'regular'); const successPath = isFlashDelivery ? '/(drawer)/(tabs)/flash-delivery/order-success' : './order-success'; router.replace(`${successPath}?orderId=${firstOrder.id}&totalAmount=${finalTotalWithDelivery}`); } }, onError: (error: any) => { Alert.alert('Error', error.message || 'Failed to place order'); }, onSettled: () => { setIsLoadingDialogOpen(false); }, }); // const createRazorpayOrderMutation = trpc.user.payment.createRazorpayOrder.useMutation({ // onSuccess: (paymentData) => { // initiateRazorpayPayment(paymentData.razorpayOrderId, paymentData.key, finalTotal); // }, // onError: (error: any) => { // Alert.alert('Error', error.message || 'Failed to create payment order'); // }, // }); const verifyPaymentMutation = trpc.user.payment.verifyPayment.useMutation({ onSuccess: () => { const orders = placeOrderMutation.data?.data || []; const firstOrder = orders[0]; // Clear cart and navigate to success page clearCartAndInvalidateQueries(isFlashDelivery ? 'flash' : 'regular'); const successPath = isFlashDelivery ? '/(drawer)/(tabs)/flash-delivery/order-success' : './order-success'; router.replace(`${successPath}?orderId=${firstOrder?.id}&totalAmount=${finalTotalWithDelivery}`); }, onError: (error: any) => { Alert.alert('Error', error.message || 'Payment verification failed'); }, }); const markPaymentFailedMutation = trpc.user.payment.markPaymentFailed.useMutation(); const handlePlaceOrder = () => { if (!selectedAddress) { Alert.alert('Error', 'Please select an address'); return; } const availableItems = cartItems .filter(item => { if (item.product?.isOutOfStock) return false; // For flash delivery, check if product supports flash delivery if (isFlashDelivery) { return flashEligibleProductIds.has(item.productId); } // For regular delivery, only include items with assigned slots return selectedSlots[item.id]; }) .map(item => item.id); if (availableItems.length === 0) { Alert.alert('Error', 'No valid items to order'); return; } setIsLoadingDialogOpen(true); const orderData = { selectedItems: availableItems.map(itemId => { const item = cartItems.find(cartItem => cartItem.id === itemId); return { productId: item.productId, quantity: item.quantity, slotId: isFlashDelivery ? null : selectedSlots[itemId] }; }), addressId: selectedAddress, paymentMethod: paymentMethod, couponId: selectedCouponId || undefined, userNotes: userNotes, isFlashDelivery: isFlashDelivery, }; console.log({orderData}) placeOrderMutation.mutate(orderData); }; // const initiateRazorpayPayment = (razorpayOrderId: string, key: string, amount: number) => { // const options = { // key, // amount: amount * 100, // currency: 'INR', // order_id: razorpayOrderId, // name: 'Meat Farmer', // description: 'Order Payment', // prefill: {}, // }; // RazorpayCheckout.open(options) // .then((data: any) => { // verifyPaymentMutation.mutate({ // razorpay_payment_id: data.razorpay_payment_id, // razorpay_order_id: data.razorpay_order_id, // razorpay_signature: data.razorpay_signature, // }); // }) // .catch((error: any) => { // markPaymentFailedMutation.mutate({ merchantOrderId: razorpayOrderId }); // Alert.alert( // 'Payment Failed', // 'Payment failed or was cancelled. What would you like to do?', // [ // { // text: 'Retry Now', // onPress: () => { // const orders = placeOrderMutation.data?.data || []; // const firstOrder = orders[0]; // const orderId = firstOrder?.id.toString(); // if (orderId) { // createRazorpayOrderMutation.mutate({ orderId }); // } // } // }, // { // text: 'Retry Later', // onPress: () => router.push('/(drawer)/(tabs)/me/my-orders') // } // ] // ); // }); // }; return ( <> {/* Back Button */} {onCancel && ( Back to Cart )} {/* Special Instructions */} Delivery Instructions {/* Payment Method */} Payment Method {/* No selection dot for disabled state */} Pay Online (Coming Soon) UPI, Cards, Netbanking setPaymentMethod('cod')} style={tw`flex-row items-center p-4 rounded-xl border ${paymentMethod === 'cod' ? 'border-brand500 bg-blue-50' : 'border-gray-200'}`} > {paymentMethod === 'cod' && } Cash on Delivery Pay when you receive UPI accepted during COD Cash payment {/* Bill Details */} Bill Details {/* Item Total */} Item Total ₹{totalPrice} {/* Discount */} {discountAmount > 0 && ( Product Discount -₹{discountAmount} )} {/* Delivery Fee */} Delivery Fee {deliveryCharge === 0 && ( isFlashDelivery ? (constsData?.flashDeliveryCharge > 0 && ( ₹{constsData?.flashDeliveryCharge} )) : (constsData?.deliveryCharge > 0 && ( ₹{constsData?.deliveryCharge} )) )} {deliveryCharge === 0 ? 'Free' : `₹${deliveryCharge}`} {/* Free Delivery Nudge */} {deliveryCharge > 0 && (() => { const threshold = isFlashDelivery ? constsData?.flashFreeDeliveryThreshold : constsData?.freeDeliveryThreshold; return threshold > 0 && finalTotal < threshold && ( Add products worth ₹{(threshold - finalTotal).toFixed(0)} for free delivery ); })()} {/* Divider */} {/* Grand Total */} To Pay ₹{finalTotalWithDelivery} {/* Savings Banner */} {(discountAmount > 0 || deliveryCharge === 0) && ( You saved ₹{discountAmount + (deliveryCharge === 0 ? ( isFlashDelivery ? constsData?.flashDeliveryCharge : constsData?.deliveryCharge ) : 0)} on this order )} {/* Bottom Action Bar */} Place Order ); }; export default PaymentAndOrderComponent;