'use client'; import React, { useState, useEffect } from 'react'; import Link from 'next/link'; import Image from 'next/image'; import { NEWS_CATEGORIES } from '@/lib/types'; interface NewsBlockProps { maxNews?: number; showFeatured?: boolean; title?: string; subtitle?: string; } export default function NewsBlock({ maxNews = 4, showFeatured = true, title = "Последние новости", subtitle = "Следите за нашими новостями, акциями и обновлениями" }: NewsBlockProps) { const [news, setNews] = useState([]); const [loading, setLoading] = useState(true); const [totalNews, setTotalNews] = useState(0); const [error, setError] = useState(null); useEffect(() => { const loadNews = async () => { try { setLoading(true); setError(null); const params = new URLSearchParams(); params.append('page', '1'); params.append('limit', maxNews.toString()); params.append('published', 'true'); if (showFeatured) { params.append('sortBy', 'featured'); params.append('sortOrder', 'desc'); } else { params.append('sortBy', 'publishedAt'); params.append('sortOrder', 'desc'); } const response = await fetch(`/api/news?${params}`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); if (data.success) { setNews(data.data.news); setTotalNews(data.data.pagination.total); } else { throw new Error(data.error || 'Failed to load news'); } } catch (error) { console.error('Error loading news:', error); setError(error instanceof Error ? error.message : 'Failed to load news'); } finally { setLoading(false); } }; loadNews(); }, [maxNews, showFeatured]); const displayNews = news; 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); }; if (loading) { return (

Загрузка новостей...

); } if (error) { return (

Ошибка при загрузке новостей

{error}

); } if (displayNews.length === 0) { return (

Новости не найдены

); } return (

{title}

{subtitle}

{/* Главная новость (если есть важная) */} {showFeatured && displayNews[0]?.featured && (
{displayNews[0].title}
{getCategoryInfo(displayNews[0].category) && (
{getCategoryInfo(displayNews[0].category)?.name}
)}
Важное
{formatDate(displayNews[0].publishedAt)}

{displayNews[0].title}

{displayNews[0].summary}

Читать полностью
)} {/* Сетка новостей */}
{displayNews .filter((news, index) => !(showFeatured && index === 0 && news.featured)) .map((news, index) => { const categoryInfo = getCategoryInfo(news.category); return (
{news.title}
{categoryInfo && (
{categoryInfo.name}
)} {news.featured && (
Важное
)}
{formatDate(news.publishedAt)}

{news.title}

{news.summary}

Читать далее
); })}
{/* Кнопка "Все новости" */}
Все новости
{/* Статистика */}
Показано {displayNews.length} из {totalNews} новостей
); }