import { createFileRoute, useNavigate, useParams } from '@tanstack/react-router' import { useStoreWithProducts, useAllProducts } from '../hooks/prominent-api-hooks' import { useState, useMemo } from 'react' import { p } from 'web-components' import { AppLayout } from '../components/AppLayout' import AddToCartDialog from '../components/AddToCartDialog' import { ProductCard } from '../components/ProductCard' import { usePopulateCentralStores } from '../hooks/usePopulateCentralStores' import { ArrowLeft, Store, X, Grid3X3 } from 'lucide-react' export const Route = createFileRoute('/stores/$storeId')({ component: StoreDetailPage, }) interface Tag { id: number tagName: string productIds?: number[] } function StoreDetailPage() { const { storeId } = useParams({ from: '/stores/$storeId' }) const navigate = useNavigate() const storeIdNum = Number(storeId) const [selectedTagId, setSelectedTagId] = useState(null) // Populate central stores with slots and product data for out-of-stock checking usePopulateCentralStores() const { data: storeData, isLoading, error, refetch } = useStoreWithProducts(storeIdNum) const { data: productsData, isLoading: isProductsLoading } = useAllProducts() const productById = useMemo(() => { const map = new Map() productsData?.products?.forEach((product) => { map.set(product.id, product) }) return map }, [productsData]) const storeProducts = useMemo(() => { if (!storeData?.products) return [] return storeData.products .map((product: any) => productById.get(product.id)) .filter(Boolean) }, [storeData, productById]) // Filter products based on selected tag const filteredProducts = selectedTagId ? storeProducts.filter((product: any) => { const selectedTag = storeData?.tags.find((t: Tag) => t.id === selectedTagId) return selectedTag?.productIds?.includes(product.id) ?? false }) : storeProducts const isMeatStore = storeData?.store?.name?.toLowerCase().includes('meat') if (isLoading || isProductsLoading) { return (

{isLoading ? 'Loading store...' : 'Loading products...'}

) } if (error || !storeData) { return (

Oops!

Store not found or error loading

) } return (
{/* Back Button */}
navigate({ to: '/stores' })} className="p-2">

{storeData?.store?.name || 'Store'}

{/* Store Info Card */}

{storeData?.store?.name}

{storeData?.store?.description && (

{storeData?.store?.description}

)}
{/* Tags Section */} {storeData?.tags && storeData.tags.length > 0 && (
{storeData.tags.map((tag: Tag) => ( setSelectedTagId(selectedTagId === tag.id ? null : tag.id)} /> ))}
)} {/* Products Count & Clear Filter */}

{selectedTagId ? `${storeData?.tags.find((t: Tag) => t.id === selectedTagId)?.tagName} items` : `${filteredProducts.length} products`}

{selectedTagId && (
setSelectedTagId(null)} className="flex items-center" >

Clear

)}
{/* Products Grid */}
{filteredProducts.map((product: any) => ( navigate({ to: '/stores/$storeId/product/$productId', params: { storeId, productId: String(product.id) }, }) } showDeliveryInfo={false} miniView={true} useAddToCartDialog={true} /> ))}
{filteredProducts.length === 0 && (

{selectedTagId ? 'No products in this category' : 'No products available'}

)}
) } interface TagChipProps { tag: Tag isSelected: boolean onPress: () => void } function TagChip({ tag, isSelected, onPress }: TagChipProps) { const productCount = tag.productIds?.length || 0 return ( ) }