'use client'; import React, { useState, useMemo, useEffect } from 'react'; import { useSearchParams, useRouter, usePathname } from 'next/navigation'; import Link from 'next/link'; import Image from 'next/image'; import { NEWS_CATEGORIES } from '@/lib/types'; import { motion, AnimatePresence } from 'framer-motion'; import { Search, Filter, Calendar, Eye, ArrowRight, TrendingUp, Star, ArrowLeft } from 'lucide-react'; import Header from '@/app/components/Header'; import Footer from '@/app/components/Footer'; const ITEMS_PER_PAGE = 6; type SortOption = 'newest' | 'oldest' | 'alphabetical' | 'featured'; export default function NewsPage() { // Устанавливаем заголовок страницы useEffect(() => { document.title = 'Новости и События - ЦКЭ'; }, []); const [selectedCity, setSelectedCity] = useState<'Москва' | 'Чебоксары'>('Москва'); // Загружаем город из localStorage useEffect(() => { const savedCity = localStorage.getItem('selectedCity'); if (savedCity) { setSelectedCity(savedCity as 'Москва' | 'Чебоксары'); } }, []); const handleCityChange = (city: 'Москва' | 'Чебоксары') => { setSelectedCity(city); localStorage.setItem('selectedCity', city); }; const searchParams = useSearchParams(); const router = useRouter(); const pathname = usePathname(); const [selectedCategory, setSelectedCategory] = useState(searchParams.get('category') || 'all'); const [searchQuery, setSearchQuery] = useState(searchParams.get('search') || ''); const [sortBy, setSortBy] = useState((searchParams.get('sort') as SortOption) || 'newest'); const [currentPage, setCurrentPage] = useState(parseInt(searchParams.get('page') || '1')); // Обновление URL при изменении параметров useEffect(() => { const params = new URLSearchParams(); if (selectedCategory !== 'all') params.set('category', selectedCategory); if (searchQuery.trim()) params.set('search', searchQuery); if (sortBy !== 'newest') params.set('sort', sortBy); if (currentPage !== 1) params.set('page', currentPage.toString()); const newUrl = params.toString() ? `${pathname}?${params.toString()}` : pathname; router.replace(newUrl, { scroll: false }); }, [selectedCategory, searchQuery, sortBy, currentPage, pathname, router]); const [news, setNews] = useState([]); const [loading, setLoading] = useState(true); const [totalNews, setTotalNews] = useState(0); // Загрузка новостей с API useEffect(() => { const loadNews = async () => { try { setLoading(true); const params = new URLSearchParams(); params.append('page', currentPage.toString()); params.append('limit', ITEMS_PER_PAGE.toString()); params.append('published', 'true'); if (selectedCategory !== 'all') { params.append('category', selectedCategory); } if (searchQuery.trim()) { params.append('search', searchQuery); } // Преобразуем сортировку в формат API let sortBy_api = 'publishedAt'; let sortOrder = 'desc'; switch (sortBy) { case 'newest': sortBy_api = 'publishedAt'; sortOrder = 'desc'; break; case 'oldest': sortBy_api = 'publishedAt'; sortOrder = 'asc'; break; case 'alphabetical': sortBy_api = 'title'; sortOrder = 'asc'; break; case 'featured': sortBy_api = 'featured'; sortOrder = 'desc'; break; } params.append('sortBy', sortBy_api); params.append('sortOrder', sortOrder); 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 getSortOptionName = (option: SortOption) => { switch (option) { case 'newest': return 'Сначала новые'; case 'oldest': return 'Сначала старые'; case 'alphabetical': return 'По алфавиту'; case 'featured': return 'Важные первыми'; default: return 'Сначала новые'; } }; 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, index) => { 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}
); }