From d1d7db55a06de124236d52b9f414be2ca8051e85 Mon Sep 17 00:00:00 2001 From: shafi54 <108669266+shafi-aviz@users.noreply.github.com> Date: Sun, 8 Feb 2026 00:50:03 +0530 Subject: [PATCH] enh --- apps/user-ui/components/ProductCard.tsx | 4 ++++ apps/user-ui/components/SlotSpecificView.tsx | 24 +++++++++++++++---- .../user-ui/hooks/useProductSlotIdentifier.ts | 22 +++++++++++++---- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/apps/user-ui/components/ProductCard.tsx b/apps/user-ui/components/ProductCard.tsx index 8cdf61d..179b4e2 100644 --- a/apps/user-ui/components/ProductCard.tsx +++ b/apps/user-ui/components/ProductCard.tsx @@ -88,6 +88,10 @@ const ProductCard: React.FC = ({ const slotId = getQuickestSlot(item.id); const displayIsOutOfStock = item.isOutOfStock || !slotId; + // if(item.name.startsWith('Mutton Curry Cut')) { + // console.log({slotId, displayIsOutOfStock}) + // } + // Return null if nullIfNotAvailable is true and the product is out of stock if (nullIfNotAvailable && displayIsOutOfStock) { return null; diff --git a/apps/user-ui/components/SlotSpecificView.tsx b/apps/user-ui/components/SlotSpecificView.tsx index 53128e2..02db3a7 100644 --- a/apps/user-ui/components/SlotSpecificView.tsx +++ b/apps/user-ui/components/SlotSpecificView.tsx @@ -397,7 +397,14 @@ export function SlotProducts({ slotId:slotIdParent, storeId:storeIdParent, baseU ); } - const filteredProducts: any[] = storeIdNum ? productsQuery?.data?.filter(p => p.store?.id === storeIdNum) || [] : slotQuery.data.products; + // Create a Set of product IDs from slot data for O(1) lookup + const slotProductIds = new Set(slotQuery.data.products?.map((p: any) => p.id) || []); + + const filteredProducts: any[] = storeIdNum + ? productsQuery?.data?.filter(p => + p.store?.id === storeIdNum && slotProductIds.has(p.id) + ) || [] + : slotQuery.data.products; return ( @@ -481,11 +488,18 @@ export function FlashDeliveryProducts({ storeId:storeIdParent, baseUrl, onProduc // Filter products to only include those eligible for flash delivery let flashProducts: any[] = []; if (storeIdNum) { - // Filter by store and flash availability - flashProducts = productsQuery?.data?.filter(p => p.store?.id === storeIdNum && p.isFlashAvailable) || []; + // Filter by store, flash availability, and stock status + flashProducts = productsQuery?.data?.filter(p => + p.store?.id === storeIdNum && + p.isFlashAvailable && + !p.isOutOfStock + ) || []; } else { - // Show all flash-available products (no slot filtering) - flashProducts = productsQuery?.data?.filter(p => p.isFlashAvailable) || []; + // Show all flash-available products that are in stock + flashProducts = productsQuery?.data?.filter(p => + p.isFlashAvailable && + !p.isOutOfStock + ) || []; } return ( diff --git a/apps/user-ui/hooks/useProductSlotIdentifier.ts b/apps/user-ui/hooks/useProductSlotIdentifier.ts index 6a781ac..bd55200 100644 --- a/apps/user-ui/hooks/useProductSlotIdentifier.ts +++ b/apps/user-ui/hooks/useProductSlotIdentifier.ts @@ -1,9 +1,21 @@ import { trpc } from '@/src/trpc-client'; import dayjs from 'dayjs'; +import { useEffect } from 'react'; +let isPrinted = false; export function useProductSlotIdentifier() { // Fetch all slots with products - const { data: slotsData } = trpc.user.slots.getSlotsWithProducts.useQuery(); + const { data: slotsData, isLoading: isProductsLoading } = trpc.user.slots.getSlotsWithProducts.useQuery(); + + useEffect(() => { + if(!isProductsLoading && !isPrinted) { + isPrinted = true; + const slotInfo = slotsData?.slots.map(slot => ({...slot, products: slot.products.map(item => ({id: item.id, name: item.name}))})) + console.log(JSON.stringify(slotInfo)) + } + + },[slotsData]) + const productSlotsMap = new Map(); @@ -24,16 +36,18 @@ export function useProductSlotIdentifier() { } const getQuickestSlot = (productId: number): number | null => { + if (!slotsData?.slots) return null; - + const now = dayjs(); - + // Find slots that contain this product and have future delivery time const availableSlots = slotsData.slots.filter(slot => slot.products.some(product => product.id === productId) && dayjs(slot.deliveryTime).isAfter(now) ); - + // if(productId === 98) + // console.log(JSON.stringify(slotsData)) if (availableSlots.length === 0) return null; // Return earliest slot ID (sorted by delivery time)