import { useEffect, useMemo, useState } from 'react' import { Link, useParams } from 'react-router-dom' import { Breadcrumbs } from '../components/Breadcrumbs' import { ImageLightbox } from '../components/ImageLightbox' import { ProductDetailsTabs } from '../components/ProductDetailsTabs' import { ApiError } from '../lib/api' import { getProduct, mapProductApiToUi, } from '../services/productService' import type { Product } from '../types/product' import { textLocaleAttrs } from '../utils/textLocale' import pageStyles from '../components/PageContent.module.css' import styles from './ProductDetailsPage.module.css' export function ProductDetailsPage() { const { id } = useParams() const [product, setProduct] = useState(null) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState('') const [activeIndex, setActiveIndex] = useState(0) const [lightboxOpen, setLightboxOpen] = useState(false) const [lightboxIndex, setLightboxIndex] = useState(0) useEffect(() => { if (!id) return const controller = new AbortController() async function loadProduct() { setIsLoading(true) setError('') try { const data = await getProduct(id!, controller.signal) setProduct(mapProductApiToUi(data)) setActiveIndex(0) } catch (err) { if (err instanceof DOMException && err.name === 'AbortError') return if (err instanceof ApiError) { setError(err.message) } else { setError('Unable to load product.') } setProduct(null) } finally { setIsLoading(false) } } void loadProduct() return () => controller.abort() }, [id]) const galleryImages = useMemo(() => product?.images ?? [], [product]) const currentImage = galleryImages[activeIndex] ?? galleryImages[0] ?? '' function openLightbox(index: number) { setLightboxIndex(index) setLightboxOpen(true) } if (isLoading) { return (

Loading product...

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

{error || 'Product not found.'}

Back to My Products
) } const nameEnLocale = textLocaleAttrs(product.nameEn) const nameFaLocale = textLocaleAttrs(product.nameFa) const summaryLocale = textLocaleAttrs(product.summary) const descriptionLocale = textLocaleAttrs( product.description?.replace(/<[^>]+>/g, ' ') ?? '', ) const categoryLocale = textLocaleAttrs(product.category) return (
{galleryImages.length > 1 && (
{galleryImages.map((src, index) => ( ))}
)}
{product.category && ( {product.category} )}

{product.nameEn}

{product.nameFa && (

{product.nameFa}

)} {product.summary && (

{product.summary}

)} {product.description && (
)} {product.tags.length > 0 && (
{product.tags.map((tag) => { const tagLocale = textLocaleAttrs(tag) return ( {tag} ) })}
)}
setLightboxOpen(false)} />
) }