import { useState, useEffect } from "react"; import { useParams, Link } from "react-router-dom"; import { Heart, ArrowLeft, Tag, User, Calendar } from "lucide-react"; const ProductDetail = () => { const { id } = useParams(); const [product, setProduct] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [isFavorite, setIsFavorite] = useState(false); const [showContactForm, setShowContactForm] = useState(false); const [message, setMessage] = useState(""); const [currentImage, setCurrentImage] = useState(0); // Fetch product details useEffect(() => { const fetchProduct = async () => { try { setLoading(true); const response = await fetch(`http://localhost:3030/api/product/${id}`); if (!response.ok) { throw new Error("Failed to fetch product"); } const result = await response.json(); console.log(result); if (result.success) { setProduct(result.data); setError(null); } else { throw new Error(result.message || "Error fetching product"); } } catch (error) { console.error("Error fetching product:", error); setError(error.message); setProduct(null); } finally { setLoading(false); } }; fetchProduct(); }, [id]); // Handle favorite toggle const toggleFavorite = async () => { try { const response = await fetch( "http://localhost:3030/api/product/add_to_favorite", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ userID: 1, // Replace with actual user ID productsID: id, }), }, ); const result = await response.json(); if (result.success) { setIsFavorite(!isFavorite); } } catch (error) { console.error("Error toggling favorite:", error); } }; // Handle message submission const handleSendMessage = (e) => { e.preventDefault(); // TODO: Implement actual message sending logic console.log("Message sent:", message); setMessage(""); setShowContactForm(false); alert("Message sent to seller!"); }; // Image navigation const nextImage = () => { if (product && product.images) { setCurrentImage((prev) => prev === product.images.length - 1 ? 0 : prev + 1, ); } }; const prevImage = () => { if (product && product.images) { setCurrentImage((prev) => prev === 0 ? product.images.length - 1 : prev - 1, ); } }; const selectImage = (index) => { setCurrentImage(index); }; // Render loading state if (loading) { return (
); } // Render error state if (error) { return (

Error Loading Product

{error}

Back to Listings
); } // Render product details return (
Back
{product.images && product.images.length > 0 ? ( {product.Name} ) : (
No Image Available
)}
{product.images && product.images.length > 1 && (
{product.images.map((image, index) => (
selectImage(index)} > {`${product.Name}
))}
)}

{product.Name}

${product.Price}
{product.Category}
Posted on {product.Date}

{product.Description}

{showContactForm && (

Contact Seller

setMessage(e.target.value)} className="w-full p-3 border border-gray-300 focus:outline-none focus:border-green-500" required />
setMessage(e.target.value)} placeholder="Hi, is this item still available?" className="w-full p-3 border border-gray-300 focus:outline-none focus:border-green-500" />
)}

{product.SellerName || "Unknown Seller"}

Member since {product.SellerName}

Rating:{" "} {product.seller ? `${product.seller.rating}/5` : "N/A"}
{/*

Description

{product.Description}
*/}
); }; export default ProductDetail;