import { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { api, resolveMediaUrl } from '../../api'; import { Clock, MapPin, Minus, Plus, ShoppingBag, Sparkles, Store, X } from 'lucide-react'; interface MenuItem { id: string; restaurant_id: string; name: string; description?: string; category?: string; ingredients?: string; price: number; image_url?: string; is_available: number | boolean; } interface Restaurant { id: string; name: string; description?: string; address: string; image_url?: string; status: string; } interface StoreDetailModalProps { restaurantId: string | null; onClose: () => void; cartItems: { item: MenuItem; quantity: number }[]; onAddToCart: (item: MenuItem, quantity: number) => void; onOpenCart?: () => void; } export default function StoreDetailModal({ restaurantId, onClose, cartItems, onAddToCart, onOpenCart, }: StoreDetailModalProps) { const [activeCategory, setActiveCategory] = useState('all'); const { data: restaurantRes, isLoading: isRestLoading } = useQuery({ queryKey: ['restaurant', restaurantId], queryFn: () => api.get(`/api/restaurants/${restaurantId}`), enabled: Boolean(restaurantId), }); const { data: menuRes, isLoading: isMenuLoading } = useQuery({ queryKey: ['menu-items', restaurantId], queryFn: () => api.get(`/api/restaurants/${restaurantId}/menu-items`), enabled: Boolean(restaurantId), }); if (!restaurantId) return null; const restaurant: Restaurant | null = restaurantRes?.data?.restaurant ?? null; const menuItems: MenuItem[] = Array.isArray(menuRes?.data?.menu_items) ? menuRes.data.menu_items : []; const categories = ['all', ...Array.from(new Set(menuItems.map((i) => i.category || 'General').filter(Boolean)))]; const filteredItems = activeCategory === 'all' ? menuItems : menuItems.filter((i) => (i.category || 'General') === activeCategory); const totalCartCount = cartItems.reduce((acc, i) => acc + i.quantity, 0); return (
{isRestLoading ? (
Loading store details...
) : ( <>
{restaurant?.image_url ? ( {restaurant.name} ) : (
)}
{restaurant?.status === 'active' ? 'Open for Orders' : 'Currently Closed'}

{restaurant?.name}

{restaurant?.address}

{categories.length > 1 && (
{categories.map((cat) => ( ))}
)}
{isMenuLoading ? (
Loading menu items...
) : filteredItems.length === 0 ? (
No dishes found in this category.
) : (
{filteredItems.map((dish) => { const cartItem = cartItems.find((ci) => ci.item.id === dish.id); const qty = cartItem ? cartItem.quantity : 0; const isAvailable = Boolean(dish.is_available); return (
{dish.image_url && ( {dish.name} )}

{dish.name}

${Number(dish.price).toFixed(2)}
{dish.description && (

{dish.description}

)} {dish.ingredients && (

{dish.ingredients}

)}
{isAvailable ? 'Available' : 'Sold Out'} {isAvailable && (
{qty > 0 ? (
{qty}
) : ( )}
)}
); })}
)}
{totalCartCount > 0 && onOpenCart && (

Items in Cart

{totalCartCount} item(s) selected

)} )}
); }