import { pb } from "@/lib/pb"; import Link from "next/link"; import { Badge } from "@/components/ui/badge"; import { getDictionary } from "@/lib/dictionaries"; interface PBPost { id: string; title: string; slug: string; excerpt: string; lang: string; created: string; published: boolean; } interface Props { params: Promise<{ lang: string }>; } export default async function BlogIndexPage({ params }: Props) { const { lang } = await params; const dict = await getDictionary(lang); // Подключаем словарь let records: PBPost[] = []; // CMS-контент переведён только для части языков — коллекция `posts_` // для новых языков ещё не заведена в PocketBase. Пока для них нет перевода, // показываем английские записи, а не пустой архив. for (const fallbackLang of Array.from(new Set([lang, "en"]))) { try { // Передаём кастомный fetch с next.revalidate, чтобы PocketBase SDK использовал // нативное ISR-кэширование Next.js (обновление раз в час) вместо запроса на // каждый рендер — иначе SDK делает обычный fetch без опций кэша Next.js. records = await pb.collection(`posts_${fallbackLang}`).getFullList({ filter: "published = true", sort: "-created", fetch: (url, config) => fetch(url, { ...config, next: { revalidate: 3600 } }), }); break; } catch (err) { console.error(`Failed to fetch blog posts (${fallbackLang}):`, err); } } return (
{dict.blog.archive}

{dict.blog.systemLogs}

{records.length === 0 ? (

{dict.blog.emptySector}

) : (
{records.map((post) => (
{new Date(post.created).toLocaleDateString(lang || "en")}

{post.title}

{post.excerpt}

{dict.blog.decrypt}
))}
)}
); }