import React, { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { ArrowLeft, Clock, Info } from 'lucide-react'; import ItemCard from '../components/ItemCard'; import CartTab from '../components/CartTab'; import BottomNav from '../components/BottomNav'; import type { Stall } from '../types'; import './StallDetailScreen.css'; import { getApiBaseUrl } from '../utils/api'; const StallDetailScreen: React.FC = () => { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const [stall, setStall] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchStallDetails = async () => { setLoading(true); try { const response = await fetch(`${getApiBaseUrl()}/api/stalls/${id}`); if (!response.ok) throw new Error('Stall not found'); const data = await response.json(); // Map backend stall to frontend Stall type const mappedStall: Stall = { id: data.id.toString(), name: data.name, description: data.description || 'Quality food prepared with care', imageData: data.imageData?.trim() ? (data.imageData.trim().startsWith('data:') ? data.imageData.trim() : `data:image/png;base64,${data.imageData.trim()}`) : '', active: data.active, temporarilyClosed: data.temporarilyClosed, products: data.products.map((p: any) => { const rawImg = p.imageData?.trim(); const finalImage = rawImg ? (rawImg.startsWith('data:') ? rawImg : `data:image/png;base64,${rawImg}`) : ''; return { id: p.id.toString(), name: p.name, description: p.description || 'Delicious meal item', price: p.price || p.basePrice || 0, category: p.category, image: finalImage, isVeg: p.veg, isPopular: p.active, stock: p.stock, stallId: data.id.toString(), stallName: data.name }; }) }; setStall(mappedStall); } catch (err: any) { setError(err.message); } finally { setLoading(false); } }; fetchStallDetails(); // SSE Real-time stock updates const eventSource = new EventSource(`${getApiBaseUrl()}/api/stock/stream`); eventSource.addEventListener('stockUpdate', (event: any) => { try { const update = JSON.parse(event.data); setStall(prevStall => { if (!prevStall) return prevStall; return { ...prevStall, products: prevStall.products ? prevStall.products.map(p => p.id === update.productId.toString() ? { ...p, stock: update.stock } : p ) : [] }; }); } catch (err) { console.error('Error processing stock update:', err); } }); return () => { eventSource.close(); }; }, [id]); if (loading) { return (
Loading Stall Details...
); } if (error || !stall) { return (

Stall Not Found

{error || "We couldn't find the stall you're looking for."}

); } return (
{stall.imageData ? ( {stall.name} ) : (
)}

{stall.name}

{stall.temporarilyClosed && ( Closed Now )}

{stall.description}

Fast Preparation
Clean & Hygienic

Available Products

{stall.products && stall.products.length > 0 ? ( stall.products.map((item, index) => ( )) ) : (

No products available from this stall at the moment.

)}
); }; export default StallDetailScreen;