import React from 'react'; import { Link, useParams } from 'react-router-dom'; import { ArrowLeftIcon, ChevronLeftIcon, ClockIcon } from 'lucide-react'; import { renderToHTMLString } from '@tiptap/static-renderer'; import { Reveal } from '../components/Reveal'; import { ButtonLink } from '../components/Button'; import { ArticleCard } from '../components/ArticleCard'; import { Newsletter } from '../components/home/Newsletter'; import { useSite } from '../api'; import { ARTICLE_EXTENSIONS } from '../components/admin/ArticleEditor'; import type { Article } from '../data/site'; /** بدنه مقاله را به HTML تبدیل می‌کند — سند TipTap جدید یا پاراگراف‌های قدیمی */ function renderBody(article: Article): { html: string | null; legacy: string[] } { const body = article.body as unknown; if (Array.isArray(body)) return { html: null, legacy: body }; if (body && typeof body === 'object' && (body as { type?: string }).type === 'doc') { try { return { html: renderToHTMLString({ extensions: ARTICLE_EXTENSIONS, content: body as never }), legacy: [], }; } catch { return { html: null, legacy: [] }; } } return { html: null, legacy: [] }; } export function ArticleDetail() { const { slug } = useParams<{slug: string;}>(); const { articles } = useSite(); const article = articles.find((a) => a.slug === slug); if (!article) { return (

این مقاله پیدا نشد

فهرست کامل مقالات وبلاگ را ببینید.

بازگشت به وبلاگ
); } const { html, legacy } = renderBody(article); const related = articles.filter((a) => a.slug !== article.slug).slice(0, 3); return ( <>

{article.excerpt}

{html ? (
) : ( legacy.map((paragraph, i) =>

{paragraph}

) )}

مقالات مرتبط

{related.map((item, i) => )}
); }