import { useEffect, useState } from 'react' import { Link, useParams } from 'react-router-dom' import { CalendarDays, User } from 'lucide-react' import { useLocale } from '@meshkee/dashboard-ui' import { Breadcrumbs } from '../components/Breadcrumbs' import { BlogCommentsSection } from '../components/BlogCommentsSection' import { useT } from '../i18n/useT' import { ApiError } from '../lib/api' import { formatBlogAuthor, formatBlogDate, getBlogDetail, } from '../services/blogService' import type { BlogDetail } from '../types/blog' import { BLOG_TYPE_OPTIONS } from '../types/blog' import { textLocaleAttrs } from '../utils/textLocale' import pageStyles from '../components/PageContent.module.css' import styles from './BlogDetailsPage.module.css' export function BlogDetailsPage() { const t = useT() const { locale } = useLocale() const { id } = useParams() const [blog, setBlog] = useState(null) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState('') useEffect(() => { if (!id) return const controller = new AbortController() async function loadBlog() { setIsLoading(true) setError('') try { const data = await getBlogDetail(id!, controller.signal) setBlog(data) } catch (err) { if (err instanceof DOMException && err.name === 'AbortError') return if (err instanceof ApiError) { setError(err.message) } else { setError(t('blog.details.errorLoad')) } setBlog(null) } finally { setIsLoading(false) } } void loadBlog() return () => controller.abort() }, [id]) if (isLoading) { return (

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

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

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

{t('blog.details.back')}
) } const displayDate = formatBlogDate( blog.publishedAt ?? blog.createdAt, locale === 'fa' ? 'fa' : 'en', ) const typeValue = BLOG_TYPE_OPTIONS.find((option) => option.value === blog.type)?.value const typeLabel = typeValue ? t( typeValue === 'news' ? 'blog.form.type.news' : typeValue === 'article' ? 'blog.form.type.article' : 'blog.form.type.blog', ) : blog.type const titleLocale = textLocaleAttrs(blog.title) const abstractLocale = textLocaleAttrs(blog.abstract) const contentLocale = textLocaleAttrs( blog.mainTextHtml?.replace(/<[^>]+>/g, ' ') ?? '', ) return (

{blog.title}

{blog.abstract ? (

{blog.abstract}

) : null}
{blog.titleImageUrl ? ( {blog.title} ) : (
{displayDate} {(typeLabel || blog.categoryName) && ( <> ยท
{typeLabel && {typeLabel}} {blog.categoryName && ( {blog.categoryName} )}
)}
{blog.mainTextHtml ? (
) : (

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

)}
{t('blog.details.author')} {formatBlogAuthor(blog.author)}
) }