import React, { useEffect, useMemo, useState } from 'react' import { Link, useParams } from 'react-router-dom' import { Header } from '../components/Header' import { Footer } from '../components/Footer' import { Posts } from '../clientsdk/sdk.gen' import { createClient } from '../clientsdk/client' import { customQuerySerializer } from '../clientsdk/querySerializer' import type { Post } from '../clientsdk/types.gen' import { TENANT_API_KEY, TENANT_SLUG, API_URL } from '../config' import { isCategory, isMedia } from '../utils/payload' import { useI18n } from '../i18n/useI18n' type ListResponse = { docs: T[] } type ListPostsResult = { data?: ListResponse } const client = createClient({ baseUrl: API_URL, querySerializer: customQuerySerializer, headers: { 'X-Tenant-Slug': TENANT_SLUG, 'X-API-Key': TENANT_API_KEY, }, }) const formatDate = (dateString: string): string => { const date = new Date(dateString) return date.toLocaleDateString('th-TH', { year: 'numeric', month: 'long', day: 'numeric', }) } const getCategoryTitle = (post: Post): string | undefined => { const first = post.categories?.[0] return isCategory(first) ? first.title : undefined } export const PostDetail: React.FC = () => { const { t } = useI18n() const { slug } = useParams<{ slug: string }>() const [post, setPost] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { if (!slug) return const fetchPost = async () => { try { setLoading(true) setError(null) const response = (await Posts.listPosts({ client, query: { where: { slug: { equals: slug, }, }, limit: 1, }, })) as ListPostsResult setPost(response.data?.docs?.[0] ?? null) } catch (err) { setError(err instanceof Error ? err.message : t('common.loadFailed')) console.error('Fetch post failed:', err) } finally { setLoading(false) } } fetchPost() }, [slug, t]) const hero = useMemo(() => { if (!post) return undefined return isMedia(post.heroImage) ? post.heroImage : undefined }, [post]) if (loading) { return (
) } if (error || !post) { return (

{error || 'ไม่พบข้อมูลข่าวสาร'}

{t('post.back')}
) } return (
{getCategoryTitle(post) ? (

{getCategoryTitle(post)}

) : null}

{post.title}

{formatDate(post.createdAt)}

{hero?.url ? ( {hero.alt ) : null}
{t('post.back')}
) }