import React from 'react'; import { notFound } from 'next/navigation'; import Link from 'next/link'; import Image from 'next/image'; import { NEWS_CATEGORIES } from '@/lib/types'; interface NewsDetailPageProps { params: Promise<{ slug: string; }>; } // Функция для получения новости по slug из API async function getNewsFromApi(slug: string) { try { const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3000'}/api/news?slug=${slug}`, { cache: 'no-store' }); if (!response.ok) { return null; } const data = await response.json(); if (data.success && data.data.news.length > 0) { return data.data.news[0]; } return null; } catch (error) { console.error('Error fetching news:', error); return null; } } // Функция для получения связанных новостей async function getRelatedNews(category: string, currentSlug: string) { try { const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3000'}/api/news?category=${category}&limit=4`, { cache: 'no-store' }); if (!response.ok) { return []; } const data = await response.json(); if (data.success) { return data.data.news.filter((item: any) => item.slug !== currentSlug); } return []; } catch (error) { console.error('Error fetching related news:', error); return []; } } export default async function NewsDetailPage({ params }: NewsDetailPageProps) { const { slug } = await params; const news = await getNewsFromApi(slug); if (!news) { notFound(); } const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('ru-RU', { year: 'numeric', month: 'long', day: 'numeric' }); }; const getCategoryInfo = (categoryId: string) => { return NEWS_CATEGORIES.find(cat => cat.id === categoryId); }; const categoryInfo = getCategoryInfo(news.category); // Получаем связанные новости (из той же категории, исключая текущую) const relatedNews = await getRelatedNews(news.category, news.slug); return (
{/* Fixed Navigation */} {/* Full Screen Hero */}
{/* Background Image */}
{news.title}
{/* Hero Content */}
{/* Badges */}
{news.featured && ( ВАЖНОЕ )} 5 МИН ЧТЕНИЯ
{/* Title */}

{news.title}

{/* Summary */}

{news.summary}

{/* Scroll Indicator */}
Прокрутите вниз
{/* Main Content */}
{/* Article Content */}
{/* Share Section */}

Поделиться статьей

Расскажите об этой новости в социальных сетях

{/* Related News - Full Width */} {relatedNews.length > 0 && (

Похожие новости

Другие материалы из категории "{categoryInfo?.name}"

{relatedNews.map((relatedNewsItem: any, index: number) => (
{relatedNewsItem.title}
{formatDate(relatedNewsItem.publishedAt)}

{relatedNewsItem.title}

{relatedNewsItem.summary}

))}
)} {/* Full Width CTA */}

Не пропустите важные новости

Подписывайтесь на обновления и будьте в курсе всех событий и достижений нашей компании

Все новости Главная страница
); } // Генерация статических параметров для всех новостей export async function generateStaticParams() { // Для динамического рендеринга возвращаем пустой массив return []; } // Метаданные для SEO export async function generateMetadata({ params }: NewsDetailPageProps) { const { slug } = await params; const news = await getNewsFromApi(slug); if (!news) { return { title: 'Новость не найдена', }; } return { title: `${news.title} | CKE Project`, description: news.summary, openGraph: { title: news.title, description: news.summary, images: news.imageUrl ? [news.imageUrl] : [], }, }; }