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';
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 OrderItem {
productName: string;
quantity: number;
price: number;
amount: number;
image: string | null;
}
interface Order {
id: number;
orderId: string;
orderDate: string;
deliveryStatus: string;
deliveryDate?: string;
orderStatus: string;
cancelReason: string | null;
totalAmount: number;
deliveryCharge: number;
paymentMode: string;
paymentStatus: string;
refundStatus: string;
refundAmount: number | null;
userNotes: string | null;
items: OrderItem[];
discountAmount?: number;
isFlashDelivery: boolean;
createdAt: string;
}
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) => (
))}
)}
);
}