import React, { useEffect, useMemo, useState } from 'react' import { Header } from '../components/Header' import { Footer } from '../components/Footer' import { PostCard } from '../components/PostCard' import { PostCardSkeleton } from '../components/PostCardSkeleton' 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 } 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 stripHtml = (html: string): string => { const tmp = document.createElement('div') tmp.innerHTML = html return tmp.textContent || tmp.innerText || '' } 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 News: React.FC = () => { const { t } = useI18n() const [posts, setPosts] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { const fetchPosts = async () => { try { setLoading(true) setError(null) const response = (await Posts.listPosts({ client, query: { limit: 12, sort: '-createdAt', }, })) as ListPostsResult setPosts(response.data?.docs ?? []) } catch (err) { setError(err instanceof Error ? err.message : t('common.loadFailed')) console.error('Fetch posts failed:', err) } finally { setLoading(false) } } fetchPosts() }, [t]) const items = useMemo(() => posts, [posts]) return (

{t('news.title')}

{t('news.subtitle')}

{error ? (
{error}
) : null}
{loading ? Array.from({ length: 6 }).map((_, i) => ) : items.map((post) => ( ))}
{!loading && items.length === 0 && !error ? (
{t('news.empty')}
) : null}
) }