import React, { useState, useMemo, useEffect } from 'react' import { useNavigate } from '@tanstack/react-router' import { BottomDialog, p, div, Quantifier } from 'web-components' import { useSlots } from '../hooks/prominent-api-hooks' import { useAddToCart, useUpdateCartItem, useRemoveFromCart, useGetCart } from '../hooks/cart-query-hooks' import { useCartStore } from '../lib/stores/cart-store' import { useCentralSlotStore } from '../lib/stores/central-slot-store' import { ShoppingCart, Truck, Zap, X } from 'lucide-react' import dayjs from 'dayjs' 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 navigate = useNavigate() const { addedToCartProduct, clearAddedToCartProduct } = useCartStore() const [quantity, setQuantity] = useState(1) const [selectedSlotId, setSelectedSlotId] = useState(null) const [selectedFlashDelivery, setSelectedFlashDelivery] = useState(false) const { data: slotsData } = useSlots() const { data: cartData } = useGetCart() const productSlotsMap = useCentralSlotStore((state) => state.productSlotsMap) const isFlashDeliveryEnabled = true const addToCart = useAddToCart('regular') const updateItem = useUpdateCartItem('regular') const removeItem = useRemoveFromCart('regular') const isOpen = !!addedToCartProduct const product = addedToCartProduct?.product useEffect(() => { if (isOpen && product) { const cartItem = cartData?.items?.find((item: any) => item.productId === product.id) const cartQuantity = cartItem?.quantity || 0 setQuantity(cartQuantity === 0 ? 1 : cartQuantity) setSelectedSlotId(cartItem?.slotId || 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) .filter((slot) => dayjs(slot.deliveryTime).isAfter(dayjs())) const cartItem = cartData?.items?.find((item: any) => item.productId === product?.id) const isUpdate = (cartItem?.quantity || 0) >= 1 const productAvailability = productSlotsMap[product?.id] const showFlashOption = productAvailability?.isFlashAvailable === true && isFlashDeliveryEnabled const handleAddToCart = () => { if (selectedFlashDelivery) { navigate({ to: '/flash' }) clearAddedToCartProduct() return } if (isUpdate && cartItem) { updateItem.mutate( { productId: product.id, quantity, slotId: selectedSlotId, deliveryDate: selectedSlotId ? slotMap[selectedSlotId]?.deliveryTime : null }, { onSuccess: () => clearAddedToCartProduct() } ) } else { const slotId = selectedSlotId ?? availableSlotIds[0] ?? 0 addToCart.mutate( { productId: product.id, quantity, storeId: product.storeId || 1, slotId, deliveryDate: slotMap[slotId]?.deliveryTime || null, }, { onSuccess: () => clearAddedToCartProduct() } ) } } const handleRemove = () => { if (cartItem) { removeItem.mutate(product.id, { onSuccess: () => clearAddedToCartProduct() }) } else { 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) }} className={`flex items-start gap-3 rounded-xl border bg-gray-50 p-4 ${ selectedSlotId === slot.id ? 'border-brand-500' : 'border-gray-100' }`} >

{dayjs(slot.deliveryTime).format('ddd, DD MMM • ')}{formatTimeRange(slot.deliveryTime)}

{selectedSlotId === slot.id ? ( ) : ( )}
))}
{showFlashOption && (
{ setSelectedFlashDelivery(true) setSelectedSlotId(null) }} className={`flex items-center gap-3 rounded-xl border p-4 mb-4 ${ selectedFlashDelivery ? 'border-pink-500 bg-pink-50' : 'border-pink-200 bg-pink-50' }`} >

1 hr Delivery

{selectedFlashDelivery ? ( ) : ( )}
)}

Quantity

{isUpdate && (
)}
) }