import React, { useState, useCallback, useRef } from 'react'; import { View, TouchableOpacity, ActivityIndicator, Linking, ScrollView, Dimensions, NativeSyntheticEvent, NativeScrollEvent } from 'react-native'; import { useRouter } from 'expo-router'; import { tw, MyText } from 'common-ui'; import { useNavigationTarget } from 'common-ui/hooks/useNavigationTarget'; import { MaterialIcons, Ionicons } from '@expo/vector-icons'; import dayjs from 'dayjs'; import { trpc } from '@/src/trpc-client'; import { Image } from 'expo-image'; import { orderStatusManipulator } from '@/src/lib/string-manipulators'; import { useGetEssentialConsts } from '@/src/hooks/prominent-api-hooks'; import { useUserDetails } from '@/src/contexts/AuthContext'; import type { Order, OrderItem } from '@/src/types/orders'; const { width: screenWidth } = Dimensions.get('window'); const CARD_WIDTH = (screenWidth - 48) * 0.95; // card width (24px padding each side), reduced 5% const SNAP_INTERVAL = CARD_WIDTH + 24; // card + right margin = page width interface OrderCardProps { order: Order; onPress: () => void; supportMobile?: string | null; } function OrderCard({ order, onPress, supportMobile }: OrderCardProps) { return ( Upcoming Order {order.isFlashDelivery && ( FLASH )} #{order.orderId} {order.items.length} {order.items.length === 1 ? 'item' : 'items'} • ₹{order.totalAmount} {orderStatusManipulator(order.deliveryStatus)} {order.isFlashDelivery ? "30-Min Delivery" : (() => { const startTime = dayjs(order.deliveryDate); const endTime = startTime.add(1, 'hour'); return `${startTime.format("DD MMM, hh:mm A")} - ${endTime.format("hh:mm A")}`; })() } {order.items.length > 0 && ( {order.items.slice(0, 3).map((item, idx) => ( 0 ? -8 : 0 } ]} > ))} {order.items.length > 3 && ( +{order.items.length - 3} )} Track Order )} {/* Support Mobile Number */} {supportMobile && ( Linking.openURL(`tel:${supportMobile}`)} > Need help? Call {supportMobile} )} ); } export default function NextOrderGlimpse() { const router = useRouter(); const { setNavigationTarget } = useNavigationTarget(); const userDetails = useUserDetails(); const [currentIndex, setCurrentIndex] = useState(0); const scrollViewRef = useRef(null); const { data: ordersData, isLoading: ordersLoading } = trpc.user.order.getOrders.useQuery({ page: 1, pageSize: 50, }, { enabled: !!userDetails, }); const { data: essentialConsts } = useGetEssentialConsts(); const allOrders: Order[] = ordersData?.data || []; const upcomingOrders = allOrders.filter(order => { if (order.orderStatus.toLowerCase() === 'cancelled') return false; if (order.deliveryStatus.toLowerCase() === 'success') return false; return true; }); upcomingOrders.sort((a, b) => { if (a.isFlashDelivery && !b.isFlashDelivery) return -1; if (!a.isFlashDelivery && b.isFlashDelivery) return 1; if (a.isFlashDelivery && b.isFlashDelivery) { return dayjs(b.createdAt).diff(dayjs(a.createdAt)); } if (a.deliveryDate && b.deliveryDate) { return dayjs(a.deliveryDate).diff(dayjs(b.deliveryDate)); } return 0; }); const handleScroll = useCallback((event: NativeSyntheticEvent) => { const index = Math.round(event.nativeEvent.contentOffset.x / SNAP_INTERVAL); setCurrentIndex(Math.min(Math.max(index, 0), upcomingOrders.length - 1)); }, [upcomingOrders.length]); const handleOrderPress = useCallback((order: Order) => { setNavigationTarget(`/(drawer)/(tabs)/me/my-orders/${order.id}`); router.replace('/(drawer)/(tabs)/me'); }, [router, setNavigationTarget]); if (!userDetails) { return null; } if (ordersLoading) { return ( ); } if (upcomingOrders.length === 0) { return null; } return ( {upcomingOrders.map((order) => ( handleOrderPress(order)} supportMobile={essentialConsts?.supportMobile} /> ))} {/* Pagination Dots */} {upcomingOrders.length > 1 && ( {upcomingOrders.map((_, index) => ( ))} )} ); }