ProductDetail.jsx 5.45 KB
import React, { useState } from 'react'
import { useParams } from 'react-router-dom'
import { useCart } from '../../context/CartContext'
import LoadingSpinner from '../common/LoadingSpinner'
import toast from 'react-hot-toast'

const ProductDetail = ({ product }) => {
  const { id } = useParams()
  const { addToCart } = useCart()
  const [selectedImage, setSelectedImage] = useState(0)
  const [quantity, setQuantity] = useState(1)
  const [loading, setLoading] = useState(false)

  if (!product) {
    return (
      <div className="product-detail">
        <div className="container">
          <div className="product-not-found">
            <h2>Product not found</h2>
          </div>
        </div>
      </div>
    )
  }

  const handleAddToCart = async () => {
    setLoading(true)
    try {
      await addToCart(product._id, quantity)
      toast.success('Product added to cart!')
    } catch (error) {
      toast.error('Failed to add product to cart')
    } finally {
      setLoading(false)
    }
  }

  const images = product.images && product.images.length > 0 
    ? product.images 
    : [product.image || '/placeholder-image.jpg']

  return (
    <div className="product-detail">
      <div className="container">
        <div className="product-detail-content">
          <div className="product-gallery">
            <div className="main-image">
              <img 
                src={images[selectedImage]} 
                alt={product.name}
                onError={(e) => {
                  e.target.src = '/placeholder-image.jpg'
                }}
              />
            </div>
            
            {images.length > 1 && (
              <div className="image-thumbnails">
                {images.map((image, index) => (
                  <button
                    key={index}
                    onClick={() => setSelectedImage(index)}
                    className={`thumbnail ${selectedImage === index ? 'active' : ''}`}
                  >
                    <img 
                      src={image} 
                      alt={`${product.name} ${index + 1}`}
                      onError={(e) => {
                        e.target.src = '/placeholder-image.jpg'
                      }}
                    />
                  </button>
                ))}
              </div>
            )}
          </div>

          <div className="product-info">
            <h1>{product.name}</h1>
            
            <div className="product-meta">
              <div className="product-rating">
                {Array.from({ length: 5 }).map((_, index) => (
                  <span 
                    key={index}
                    className={`star ${index < (product.rating || 0) ? 'filled' : ''}`}
                  >

                  </span>
                ))}
                <span className="rating-text">
                  ({product.reviewCount || 0} reviews)
                </span>
              </div>
              
              <div className="product-sku">
                SKU: {product.sku || 'N/A'}
              </div>
            </div>

            <div className="product-price">
              <span className="current-price">${product.price}</span>
              {product.originalPrice && product.originalPrice > product.price && (
                <span className="original-price">${product.originalPrice}</span>
              )}
            </div>

            <div className="product-description">
              <p>{product.description}</p>
            </div>

            <div className="product-features">
              <h3>Features</h3>
              <ul>
                {product.features && product.features.map((feature, index) => (
                  <li key={index}>{feature}</li>
                ))}
              </ul>
            </div>

            <div className="product-actions">
              <div className="quantity-selector">
                <label htmlFor="quantity">Quantity:</label>
                <select
                  id="quantity"
                  value={quantity}
                  onChange={(e) => setQuantity(parseInt(e.target.value))}
                >
                  {Array.from({ length: Math.min(10, product.stock || 10) }, (_, i) => (
                    <option key={i + 1} value={i + 1}>
                      {i + 1}
                    </option>
                  ))}
                </select>
              </div>

              <button
                onClick={handleAddToCart}
                disabled={!product.inStock || loading}
                className="add-to-cart-btn"
              >
                {loading ? 'Adding...' : product.inStock ? 'Add to Cart' : 'Out of Stock'}
              </button>

              <button className="buy-now-btn">
                Buy Now
              </button>
            </div>

            <div className="product-specs">
              <div className="spec-item">
                <strong>Category:</strong> {product.category}
              </div>
              <div className="spec-item">
                <strong>Brand:</strong> {product.brand || 'N/A'}
              </div>
              <div className="spec-item">
                <strong>Stock:</strong> {product.inStock ? `${product.stock} available` : 'Out of Stock'}
              </div>
              <div className="spec-item">
                <strong>Shipping:</strong> Free shipping on orders over $50
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  )
}

export default ProductDetail