'use client'; import React, { useState, useEffect } from 'react'; import { useSearchParams, useRouter, usePathname } from 'next/navigation'; import Link from 'next/link'; import Image from 'next/image'; import { NEWS_CATEGORIES, NewsItem } from '@/lib/types'; import { Search, Eye, ArrowRight } from 'lucide-react'; import Header from '@/app/components/Header'; import Footer from '@/app/components/Footer'; const ITEMS_PER_PAGE = 9; type SortOption = 'newest' | 'oldest' | 'alphabetical' | 'featured'; export default function NewsPageComponent() { // Устанавливаем заголовок страницы useEffect(() => { document.title = 'Новости | CKE Project'; }, []); const searchParams = useSearchParams(); const router = useRouter(); const pathname = usePathname(); const [selectedCity, setSelectedCity] = useState<'Москва' | 'Чебоксары'>('Москва'); const [selectedCategory, setSelectedCategory] = useState('all'); const [searchQuery, setSearchQuery] = useState(''); const [sortBy, setSortBy] = useState('newest'); const [currentPage, setCurrentPage] = useState(1); const handleCityChange = (city: 'Москва' | 'Чебоксары') => { setSelectedCity(city); }; // Синхронизация с URL параметрами useEffect(() => { const category = searchParams.get('category') || 'all'; const search = searchParams.get('search') || ''; const sort = (searchParams.get('sort') as SortOption) || 'newest'; const page = parseInt(searchParams.get('page') || '1'); setSelectedCategory(category); setSearchQuery(search); setSortBy(sort); setCurrentPage(page); }, [searchParams]); useEffect(() => { const params = new URLSearchParams(); if (selectedCategory !== 'all') params.set('category', selectedCategory); if (searchQuery) params.set('search', searchQuery); if (sortBy !== 'newest') params.set('sort', sortBy); if (currentPage !== 1) params.set('page', currentPage.toString()); const newUrl = `${pathname}?${params.toString()}`; router.replace(newUrl); }, [selectedCategory, searchQuery, sortBy, currentPage, pathname, router]); const [news, setNews] = useState([]); const [loading, setLoading] = useState(true); const [totalNews, setTotalNews] = useState(0); useEffect(() => { const loadNews = async () => { try { setLoading(true); const params = new URLSearchParams(); params.append('page', currentPage.toString()); params.append('limit', ITEMS_PER_PAGE.toString()); if (selectedCategory !== 'all') { params.append('category', selectedCategory); } if (searchQuery.trim()) { params.append('search', searchQuery); } // Конвертируем sortBy в параметры API switch (sortBy) { case 'newest': params.append('sortBy', 'publishedAt'); params.append('sortOrder', 'desc'); break; case 'oldest': params.append('sortBy', 'publishedAt'); params.append('sortOrder', 'asc'); break; case 'alphabetical': params.append('sortBy', 'title'); params.append('sortOrder', 'asc'); break; case 'featured': params.append('featured', 'true'); params.append('sortBy', 'publishedAt'); params.append('sortOrder', 'desc'); break; } const response = await fetch(`/api/news?${params}`); const data = await response.json(); if (data.success) { setNews(data.data.news); setTotalNews(data.data.pagination.total); } else { console.error('Error loading news:', data.error); } } catch (error) { console.error('Error loading news:', error); } finally { setLoading(false); } }; loadNews(); }, [selectedCategory, searchQuery, sortBy, currentPage]); 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 handleCategoryChange = (category: string) => { setSelectedCategory(category); setCurrentPage(1); }; const handleSearchChange = (query: string) => { setSearchQuery(query); setCurrentPage(1); }; const handleSortChange = (sort: SortOption) => { setSortBy(sort); setCurrentPage(1); }; const handlePageChange = (page: number) => { setCurrentPage(page); window.scrollTo({ top: 0, behavior: 'smooth' }); }; const featuredNews = news.find(item => item.featured) || news[0]; const otherNews = news.filter(item => item.id !== featuredNews?.id); const totalPages = Math.ceil(totalNews / ITEMS_PER_PAGE); if (loading) { return (

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

); } return (
{/* Хлебные крошки */}
Главная / Новости
{/* Заголовок страницы */}

Новости и События

Следите за последними событиями, достижениями и обновлениями нашей компании

{/* Панель фильтров */}
{/* Поиск */}
handleSearchChange(e.target.value)} className="w-full pl-12 pr-4 py-3 border border-gray-200 rounded-xl focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-gray-900 placeholder-gray-500 transition-all duration-200" />
{/* Фильтры */}
{/* Категории */}
{NEWS_CATEGORIES.map((category) => ( ))}
{/* Сортировка */}
{/* Статистика */}
{totalNews}
найдено
{/* Главная новость */} {currentPage === 1 && featuredNews && (

Главная новость

{featuredNews.title}
Важное
{formatDate(featuredNews.publishedAt)}

{featuredNews.title}

{featuredNews.summary}

Читать полностью
)} {/* Сетка новостей */}
{news.length > 0 ? ( <>

{currentPage === 1 && featuredNews ? 'Другие новости' : 'Все новости'}

{(currentPage === 1 && featuredNews ? otherNews : news).map((newsItem) => { const categoryInfo = getCategoryInfo(newsItem.category); return (
{newsItem.title}
{/* Категория */} {categoryInfo && (
{categoryInfo.name}
)} {/* Дата */}
{formatDate(newsItem.publishedAt)}

{newsItem.title}

{newsItem.summary}

Читать далее
); })}
) : (

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

Попробуйте изменить фильтры или поисковый запрос

)} {/* Пагинация */} {totalPages > 1 && (
{[...Array(totalPages)].map((_, index) => { const pageNum = index + 1; return ( ); })}
)} {/* Информация о странице */}
Страница {currentPage} из {totalPages} • Всего новостей: {totalNews}
); }