'use client'; import React, { useState, useEffect } from 'react'; import Link from 'next/link'; import { FileText, Eye, Calendar, TrendingUp, Plus, Users, Database, Activity } from 'lucide-react'; interface DashboardStats { totalNews: number; publishedNews: number; featuredNews: number; recentNews: number; totalUsers: number; } interface NewsItem { id: string; title: string; slug: string; category: string; featured: boolean; published: boolean; publishedAt: string; views: number; likes: number; } export default function AdminDashboard() { const [stats, setStats] = useState(null); const [latestNews, setLatestNews] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { loadDashboardData(); }, []); const loadDashboardData = async () => { try { setLoading(true); // Загружаем статистику const healthResponse = await fetch('/api/health'); const healthData = await healthResponse.json(); // Загружаем все новости для статистики const newsResponse = await fetch('/api/news?limit=100&published=all'); const newsData = await newsResponse.json(); if (newsData.success) { const allNews = newsData.data.news; const publishedNews = allNews.filter((news: NewsItem) => news.published); const featuredNews = allNews.filter((news: NewsItem) => news.featured); const weekAgo = new Date(); weekAgo.setDate(weekAgo.getDate() - 7); const recentNews = allNews.filter((news: NewsItem) => { const publishDate = new Date(news.publishedAt); return publishDate >= weekAgo; }); setStats({ totalNews: allNews.length, publishedNews: publishedNews.length, featuredNews: featuredNews.length, recentNews: recentNews.length, totalUsers: healthData.data?.userCount || 0 }); // Берем последние 5 новостей setLatestNews(allNews.slice(0, 5)); } } catch (error) { console.error('Error loading dashboard data:', error); } finally { setLoading(false); } }; const statsCards = stats ? [ { name: 'Всего новостей', value: stats.totalNews, icon: FileText, color: 'bg-gradient-to-r from-blue-500 to-blue-600', textColor: 'text-blue-600', bgColor: 'bg-blue-50' }, { name: 'Опубликовано', value: stats.publishedNews, icon: Eye, color: 'bg-gradient-to-r from-green-500 to-green-600', textColor: 'text-green-600', bgColor: 'bg-green-50' }, { name: 'Рекомендуемые', value: stats.featuredNews, icon: TrendingUp, color: 'bg-gradient-to-r from-yellow-500 to-yellow-600', textColor: 'text-yellow-600', bgColor: 'bg-yellow-50' }, { name: 'За неделю', value: stats.recentNews, icon: Calendar, color: 'bg-gradient-to-r from-purple-500 to-purple-600', textColor: 'text-purple-600', bgColor: 'bg-purple-50' }, { name: 'Пользователи', value: stats.totalUsers, icon: Users, color: 'bg-gradient-to-r from-indigo-500 to-indigo-600', textColor: 'text-indigo-600', bgColor: 'bg-indigo-50' } ] : []; if (loading) { return (

Загрузка данных...

); } return (
{/* Header */}

Панель управления

Обзор системы управления новостями

Создать новость
{/* Stats Grid */}
{statsCards.map((stat) => (

{stat.name}

{stat.value}

))}
{/* Recent News */}

Последние новости

Показать все
{latestNews.map((news) => (

{news.title}

{news.featured && ( ★ Рекомендуемое )} {news.published ? '✓ Опубликовано' : '📝 Черновик'}

📅 {new Date(news.publishedAt).toLocaleDateString('ru-RU')}

👁 {news.views} просмотров

❤️ {news.likes} лайков

Редактировать Просмотр
))} {latestNews.length === 0 && (

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

Создать первую новость
)}
{/* Enhanced Quick Actions & Analytics */}

Быстрые действия

Создать новость
Управление новостями
Настройки

Статистика по категориям

{[ { id: 'Общие новости', name: 'Общие новости', color: 'bg-blue-500' }, { id: 'Обследование канализации', name: 'Канализация', color: 'bg-green-500' }, { id: 'Тепловизионная экспертиза', name: 'Тепловизор', color: 'bg-purple-500' }, { id: 'Экспертиза при заливе', name: 'Залив', color: 'bg-red-500' }, { id: 'Строительная экспертиза', name: 'Строительство', color: 'bg-yellow-500' } ].map((category) => { const count = latestNews.filter(news => news.category === category.id).length; return (
{category.name}
{count}
); })}

Система

База данных
Подключена
S3 хранилище
Активно
Версия v1.0.0
); }