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 { useT } from '../i18n/useT' import { ApiError } from '../lib/api' import { formatWorkshopDate, formatWorkshopDuration, getWorkshopDetail } from '../services/workshopService' import type { WorkshopDetail } from '../types/workshop' import pageStyles from '../components/PageContent.module.css' import styles from './PortfolioDetailsPage.module.css' export function WorkshopDetailsPage() { const t = useT() const { locale } = useLocale() const { id } = useParams() const [workshop, setWorkshop] = 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 loadWorkshop() { setIsLoading(true) setError('') try { const data = await getWorkshopDetail(id!, controller.signal) setWorkshop(data) } catch (err) { if (err instanceof DOMException && err.name === 'AbortError') return if (err instanceof ApiError) { setError(err.message) } else { setError(t('workshop.details.errorLoad')) } setWorkshop(null) } finally { setIsLoading(false) } } void loadWorkshop() return () => controller.abort() }, [id]) const galleryImages = useMemo( () => workshop?.gallery.map((item) => item.url).filter(Boolean) ?? [], [workshop], ) function openLightbox(index: number) { setLightboxIndex(index) setLightboxOpen(true) } if (isLoading) { return (

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

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

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

{t('workshop.details.back')}
) } const displayDate = formatWorkshopDate( workshop.publishedAt ?? workshop.createdAt, locale === 'fa' ? 'fa' : 'en', ) const dateLocale = locale === 'fa' ? 'fa' : 'en' const hasSchedule = Boolean(workshop.eventDate || workshop.eventTime || workshop.duration) return ( <>

{workshop.title}

{workshop.abstract && (

{workshop.abstract}

)}
{workshop.coverImageUrl ? ( {workshop.title} ) : (
{hasSchedule && ( <> {[ workshop.eventDate ? formatWorkshopDate(workshop.eventDate, dateLocale) : null, workshop.eventTime || null, workshop.duration ? formatWorkshopDuration(workshop.duration) : null, ] .filter(Boolean) .join(' · ')} · )} {displayDate} {(workshop.categoryName || workshop.tags.length > 0) && ( <> ·
{workshop.categoryName && ( {workshop.categoryName} )} {workshop.tags.map((tag) => ( {tag} ))}
)}
{workshop.descriptionHtml ? (
) : (

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

)}
{galleryImages.length > 0 && (

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

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