import React, { useState, useMemo, useEffect } from 'react'; import { View, ScrollView } from 'react-native'; import { useRouter } from 'expo-router'; import { tw, BottomDialog, MyText, MyTouchableOpacity, Quantifier } from 'common-ui'; import MaterialIcons from '@expo/vector-icons/MaterialIcons'; import { useCartStore } from '@/src/store/cartStore'; import { useFlashCartStore } from '@/src/store/flashCartStore'; import { trpc } from '@/src/trpc-client'; import { useAddToCart, useGetCart, useUpdateCartItem, useRemoveFromCart } from '@/hooks/cart-query-hooks'; import { useGetEssentialConsts } from '@/src/hooks/prominent-api-hooks'; import dayjs from 'dayjs'; import { SafeAreaView } from 'react-native-safe-area-context'; const formatTimeRange = (deliveryTime: string) => { const time = dayjs(deliveryTime); const endTime = time.add(1, 'hour'); const startPeriod = time.format('A'); const endPeriod = endTime.format('A'); if (startPeriod === endPeriod) { return `${time.format('h')}-${endTime.format('h')} ${startPeriod}`; } else { return `${time.format('h:mm')} ${startPeriod} - ${endTime.format('h:mm')} ${endPeriod}`; } }; export default function AddToCartDialog() { const router = useRouter(); const { addedToCartProduct, clearAddedToCartProduct } = useCartStore(); const [quantity, setQuantity] = useState(1); const [selectedSlotId, setSelectedSlotId] = useState(null); const [selectedFlashDelivery, setSelectedFlashDelivery] = useState(false); const { data: slotsData } = trpc.user.slots.getSlotsWithProducts.useQuery(); const { data: cartData } = useGetCart(); const { data: constsData } = useGetEssentialConsts(); // const isFlashDeliveryEnabled = constsData?.isFlashDeliveryEnabled === true; const isFlashDeliveryEnabled = true; const addToCart = useAddToCart({ showSuccessAlert: false, showErrorAlert: false, refetchCart: true, }); const updateCartItem = useUpdateCartItem({ showSuccessAlert: false, showErrorAlert: false, refetchCart: true, }); const removeFromCart = useRemoveFromCart({ showSuccessAlert: false, showErrorAlert: false, refetchCart: true, }); const isOpen = !!addedToCartProduct; const product = addedToCartProduct?.product; // Pre-select cart's slotId and quantity if item is already in cart useEffect(() => { if (isOpen && product) { const cartItem = cartData?.items?.find((item: any) => item.productId === product.id); const cartQuantity = cartItem?.quantity || 0; // Set quantity: 0 → 1, >1 → keep as is setQuantity(cartQuantity === 0 ? 1 : cartQuantity); if (cartItem?.slotId) { setSelectedSlotId(cartItem.slotId); } else { setSelectedSlotId(null); } } }, [isOpen, cartData, product]); const { slotMap, productSlotIdsMap } = useMemo(() => { const slotMap: Record = {}; const productSlotIdsMap: Record = {}; if (slotsData?.slots) { slotsData.slots.forEach((slot: any) => { slotMap[slot.id] = slot; slot.products?.forEach((p: any) => { if (!productSlotIdsMap[p.id]) { productSlotIdsMap[p.id] = []; } productSlotIdsMap[p.id].push(slot.id); }); }); } return { slotMap, productSlotIdsMap }; }, [slotsData]); const availableSlotIds = productSlotIdsMap[product?.id] || []; const availableSlots = availableSlotIds .map((slotId) => slotMap[slotId]) .filter(Boolean); // Find cart item for this product const cartItem = cartData?.items?.find((item: any) => item.productId === product?.id); // Determine if updating existing item (quantity > 1 means it's an update) const isUpdate = (cartItem?.quantity || 0) >= 1; // Check if flash delivery option should be shown const showFlashOption = product?.isFlashAvailable === true && isFlashDeliveryEnabled; const handleAddToCart = () => { if (selectedFlashDelivery) { useFlashCartStore.getState().setAddedFlashProduct({ productId: product.id, product }); router.push('/(drawer)/(tabs)/flash-delivery/(products)'); clearAddedToCartProduct(); return; } if (isUpdate && cartItem?.id) { updateCartItem.mutate( { itemId: cartItem.id, quantity }, { onSuccess: () => clearAddedToCartProduct() } ); } else { const slotId = selectedSlotId ?? availableSlotIds[0] ?? 0; addToCart.mutate( { productId: product.id, quantity, slotId }, { onSuccess: () => clearAddedToCartProduct() } ); } }; if (!isOpen || !addedToCartProduct) return null; return ( Select Delivery Slot {product?.name && ( {product.name} ({product.productQuantity}{product.unitNotation ? ` ${product.unitNotation}` : ''}) )} {availableSlots.map((slot: any) => ( { setSelectedSlotId(slot.id); setSelectedFlashDelivery(false); }} activeOpacity={0.7} > {dayjs(slot.deliveryTime).format('ddd, DD MMM • ')}{formatTimeRange(slot.deliveryTime)} {selectedSlotId === slot.id ? ( ) : ( )} ))} {showFlashOption && ( { setSelectedFlashDelivery(true); setSelectedSlotId(null); }} activeOpacity={0.7} > 1 hr Delivery {selectedFlashDelivery ? ( ) : ( )} )} Quantity {isUpdate && ( { if (cartItem?.id) { removeFromCart.mutate( { itemId: cartItem.id }, { onSuccess: () => clearAddedToCartProduct() } ); } else { clearAddedToCartProduct(); } }} style={tw`p-2 ml-3 bg-red-50 rounded-lg border border-red-200`} > )} {addToCart.isLoading || updateCartItem.isLoading ? (isUpdate ? 'Updating...' : 'Adding...') : (isUpdate ? 'Update Item' : 'Add to Cart')} Cancel ); }