import { useEffect, useMemo, useState } from 'react' import { Link, useParams } from 'react-router-dom' import { CalendarDays } from 'lucide-react' import { useLocale } from '@meshkee/dashboard-ui' import { Breadcrumbs } from '../components/Breadcrumbs' import { ImageLightbox } from '../components/ImageLightbox' import { PortfolioCommentsSection } from '../components/PortfolioCommentsSection' import { useT } from '../i18n/useT' import { ApiError } from '../lib/api' import { formatPortfolioDate, getPortfolioDetail } from '../services/portfolioService' import type { PortfolioDetail } from '../types/portfolio' import pageStyles from '../components/PageContent.module.css' import styles from './PortfolioDetailsPage.module.css' export function PortfolioDetailsPage() { const t = useT() const { locale } = useLocale() const { id } = useParams() const [portfolio, setPortfolio] = useState(null) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState('') const [lightboxOpen, setLightboxOpen] = useState(false) const [lightboxIndex, setLightboxIndex] = useState(0) useEffect(() => { if (!id) return const controller = new AbortController() async function loadPortfolio() { setIsLoading(true) setError('') try { const data = await getPortfolioDetail(id!, controller.signal) setPortfolio(data) } catch (err) { if (err instanceof DOMException && err.name === 'AbortError') return if (err instanceof ApiError) { setError(err.message) } else { setError(t('portfolio.details.errorLoad')) } setPortfolio(null) } finally { setIsLoading(false) } } void loadPortfolio() return () => controller.abort() }, [id]) const galleryImages = useMemo( () => portfolio?.gallery.map((item) => item.url).filter(Boolean) ?? [], [portfolio], ) function openLightbox(index: number) { setLightboxIndex(index) setLightboxOpen(true) } if (isLoading) { return (

{t('portfolio.details.loading')}

) } if (error || !portfolio || !id) { return (

{error || t('portfolio.details.notFound')}

{t('portfolio.details.back')}
) } const displayDate = formatPortfolioDate( portfolio.publishedAt ?? portfolio.createdAt, locale === 'fa' ? 'fa' : 'en', ) return ( <>

{portfolio.title}

{portfolio.abstract && (

{portfolio.abstract}

)}
{portfolio.titleImageUrl ? ( {portfolio.title} ) : (
{displayDate} {(portfolio.categoryName || portfolio.tags.length > 0) && ( <> ยท
{portfolio.categoryName && ( {portfolio.categoryName} )} {portfolio.tags.map((tag) => ( {tag} ))}
)}
{portfolio.mainTextHtml ? (
) : (

{t('portfolio.details.noContent')}

)}
{galleryImages.length > 0 && (

{t('portfolio.details.gallery')}

{galleryImages.map((src, index) => ( ))}
)}
{galleryImages.length > 0 && ( setLightboxOpen(false)} /> )} ) }