This commit is contained in:
shafi54 2026-02-08 00:50:03 +05:30
parent 78e90fd398
commit d1d7db55a0
3 changed files with 41 additions and 9 deletions

View file

@ -88,6 +88,10 @@ const ProductCard: React.FC<ProductCardProps> = ({
const slotId = getQuickestSlot(item.id); const slotId = getQuickestSlot(item.id);
const displayIsOutOfStock = item.isOutOfStock || !slotId; 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 // Return null if nullIfNotAvailable is true and the product is out of stock
if (nullIfNotAvailable && displayIsOutOfStock) { if (nullIfNotAvailable && displayIsOutOfStock) {
return null; return null;

View file

@ -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 ( return (
<View style={tw`flex-1`}> <View style={tw`flex-1`}>
@ -481,11 +488,18 @@ export function FlashDeliveryProducts({ storeId:storeIdParent, baseUrl, onProduc
// Filter products to only include those eligible for flash delivery // Filter products to only include those eligible for flash delivery
let flashProducts: any[] = []; let flashProducts: any[] = [];
if (storeIdNum) { if (storeIdNum) {
// Filter by store and flash availability // Filter by store, flash availability, and stock status
flashProducts = productsQuery?.data?.filter(p => p.store?.id === storeIdNum && p.isFlashAvailable) || []; flashProducts = productsQuery?.data?.filter(p =>
p.store?.id === storeIdNum &&
p.isFlashAvailable &&
!p.isOutOfStock
) || [];
} else { } else {
// Show all flash-available products (no slot filtering) // Show all flash-available products that are in stock
flashProducts = productsQuery?.data?.filter(p => p.isFlashAvailable) || []; flashProducts = productsQuery?.data?.filter(p =>
p.isFlashAvailable &&
!p.isOutOfStock
) || [];
} }
return ( return (

View file

@ -1,9 +1,21 @@
import { trpc } from '@/src/trpc-client'; import { trpc } from '@/src/trpc-client';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { useEffect } from 'react';
let isPrinted = false;
export function useProductSlotIdentifier() { export function useProductSlotIdentifier() {
// Fetch all slots with products // 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<number, number[]>(); const productSlotsMap = new Map<number, number[]>();
@ -24,16 +36,18 @@ export function useProductSlotIdentifier() {
} }
const getQuickestSlot = (productId: number): number | null => { const getQuickestSlot = (productId: number): number | null => {
if (!slotsData?.slots) return null; if (!slotsData?.slots) return null;
const now = dayjs(); const now = dayjs();
// Find slots that contain this product and have future delivery time // Find slots that contain this product and have future delivery time
const availableSlots = slotsData.slots.filter(slot => const availableSlots = slotsData.slots.filter(slot =>
slot.products.some(product => product.id === productId) && slot.products.some(product => product.id === productId) &&
dayjs(slot.deliveryTime).isAfter(now) dayjs(slot.deliveryTime).isAfter(now)
); );
// if(productId === 98)
// console.log(JSON.stringify(slotsData))
if (availableSlots.length === 0) return null; if (availableSlots.length === 0) return null;
// Return earliest slot ID (sorted by delivery time) // Return earliest slot ID (sorted by delivery time)