'use client'; import React, { useState, useEffect, useCallback } from 'react'; import { Mail, Settings, TrendingUp, Plus, Shield, Users, Activity, Database, Home, LogOut, Menu, X } from 'lucide-react'; import Link from 'next/link'; import dynamic from 'next/dynamic'; const EmailManager = dynamic( () => import('./EmailManager').then((m) => m.EmailManager), { ssr: false, loading: () =>
Loading emails…
} ); const AnalyticsDashboard = dynamic( () => import('./AnalyticsDashboard').then((m) => m.default), { ssr: false, loading: () =>
Loading analytics…
} ); const ImportExport = dynamic( () => import('./ImportExport').then((m) => m.default), { ssr: false, loading: () =>
Loading tools…
} ); const ProjectManager = dynamic( () => import('./ProjectManager').then((m) => m.ProjectManager), { ssr: false, loading: () =>
Loading projects…
} ); const ContentManager = dynamic( () => import('./ContentManager').then((m) => m.default), { ssr: false, loading: () =>
Loading content…
} ); interface Project { id: string; title: string; description: string; content?: string; category: string; difficulty?: string; tags?: string[]; featured: boolean; published: boolean; github?: string; live?: string; image?: string; createdAt: string; updatedAt: string; analytics?: { views: number; likes: number; shares: number; }; performance?: { lighthouse: number; }; } interface ModernAdminDashboardProps { isAuthenticated?: boolean; } type TabId = 'overview' | 'projects' | 'emails' | 'analytics' | 'content' | 'settings'; const ModernAdminDashboard: React.FC = ({ isAuthenticated = true }) => { const [activeTab, setActiveTab] = useState('overview'); const [projects, setProjects] = useState([]); // eslint-disable-next-line @typescript-eslint/no-unused-vars const [isLoading, setIsLoading] = useState(false); const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const [analytics, setAnalytics] = useState | null>(null); const [emails, setEmails] = useState[]>([]); const [systemStats, setSystemStats] = useState | null>(null); const loadProjects = useCallback(async () => { try { setIsLoading(true); const sessionToken = sessionStorage.getItem('admin_session_token'); const response = await fetch('/api/projects', { headers: { 'x-admin-request': 'true', 'x-session-token': sessionToken || '' } }); if (!response.ok) { if (process.env.NODE_ENV === 'development') { console.warn('Failed to load projects:', response.status); } setProjects([]); return; } const data = await response.json(); setProjects(data.projects || []); } catch { setProjects([]); } finally { setIsLoading(false); } }, []); const loadAnalytics = useCallback(async () => { try { const sessionToken = sessionStorage.getItem('admin_session_token'); const response = await fetch('/api/analytics/dashboard', { headers: { 'x-admin-request': 'true', 'x-session-token': sessionToken || '' } }); if (response.ok) { const data = await response.json(); setAnalytics(data); } } catch (error) { console.error('Error loading analytics:', error); } }, []); const loadEmails = useCallback(async () => { try { const sessionToken = sessionStorage.getItem('admin_session_token'); const response = await fetch('/api/contacts', { headers: { 'x-admin-request': 'true', 'x-session-token': sessionToken || '' } }); if (response.ok) { const data = await response.json(); setEmails(data.contacts || []); } } catch (error) { console.error('Error loading emails:', error); } }, []); const loadSystemStats = useCallback(async () => { try { const sessionToken = sessionStorage.getItem('admin_session_token'); const response = await fetch('/api/health', { headers: { 'x-admin-request': 'true', 'x-session-token': sessionToken || '' } }); if (response.ok) { const data = await response.json(); setSystemStats(data); } } catch (error) { console.error('Error loading system stats:', error); } }, []); const loadAllData = useCallback(async () => { await Promise.all([ loadProjects(), loadAnalytics(), loadEmails(), loadSystemStats() ]); }, [loadProjects, loadAnalytics, loadEmails, loadSystemStats]); // Real stats from API data const stats = { totalProjects: projects.length, publishedProjects: projects.filter(p => p.published).length, totalViews: ((analytics?.overview as Record)?.totalViews as number) || (analytics?.totalViews as number) || projects.reduce((sum, p) => sum + (p.analytics?.views || 0), 0), unreadEmails: emails.filter(e => !(e.read as boolean)).length, avgPerformance: (() => { const projectsWithPerf = projects.filter(p => { const perf = p.performance as Record || {}; return (perf.lighthouse as number || 0) > 0; }); if (projectsWithPerf.length === 0) return 0; return Math.round(projectsWithPerf.reduce((sum, p) => { const perf = p.performance as Record || {}; return sum + (perf.lighthouse as number || 0); }, 0) / projectsWithPerf.length); })(), systemHealth: (systemStats?.status as string) || 'unknown', totalUsers: ((analytics?.metrics as Record)?.totalUsers as number) || (analytics?.totalUsers as number) || 0, bounceRate: ((analytics?.metrics as Record)?.bounceRate as number) || (analytics?.bounceRate as number) || 0, avgSessionDuration: ((analytics?.metrics as Record)?.avgSessionDuration as number) || (analytics?.avgSessionDuration as number) || 0 }; useEffect(() => { void (async () => { await Promise.all([loadProjects(), loadSystemStats()]); const idle = (cb: () => void) => { if (typeof window !== 'undefined' && 'requestIdleCallback' in window) { (window as unknown as { requestIdleCallback: (fn: () => void) => void }).requestIdleCallback(cb); } else { setTimeout(cb, 300); } }; idle(() => { void loadAnalytics(); void loadEmails(); }); })(); }, [loadProjects, loadSystemStats, loadAnalytics, loadEmails]); const navigation = [ { id: 'overview' as TabId, label: 'Dashboard', icon: Home, description: 'Overview & Statistics' }, { id: 'projects' as TabId, label: 'Projects', icon: Database, description: 'Manage Projects' }, { id: 'emails' as TabId, label: 'Emails', icon: Mail, description: 'Email Management' }, { id: 'analytics' as TabId, label: 'Analytics', icon: Activity, description: 'Site Analytics' }, { id: 'content' as TabId, label: 'Content', icon: Shield, description: 'Texts, pages & localization' }, { id: 'settings' as TabId, label: 'Settings', icon: Settings, description: 'System Settings' } ]; const statCards = [ { label: 'Projects', value: stats.totalProjects, sub: `${stats.publishedProjects} published`, icon: Database, tab: 'projects' as TabId, gradient: 'from-emerald-400/20 to-emerald-400/5', border: 'border-emerald-400/20 dark:border-emerald-400/10', iconColor: 'text-emerald-500', tooltip: 'REAL DATA: Total projects in your portfolio from the database. Shows published vs unpublished count.', }, { label: 'Page Views', value: stats.totalViews.toLocaleString(), sub: `${stats.totalUsers} users`, icon: Activity, tab: 'analytics' as TabId, gradient: 'from-sky-400/20 to-sky-400/5', border: 'border-sky-400/20 dark:border-sky-400/10', iconColor: 'text-sky-500', tooltip: 'REAL DATA: Total page views from PageView table (last 30 days). Users = unique IP addresses.', }, { label: 'Messages', value: emails.length, sub: stats.unreadEmails > 0 ? `${stats.unreadEmails} unread` : 'all read', subColor: stats.unreadEmails > 0 ? 'text-red-500' : 'text-emerald-500', icon: Mail, tab: 'emails' as TabId, gradient: 'from-purple-400/20 to-purple-400/5', border: 'border-purple-400/20 dark:border-purple-400/10', iconColor: 'text-purple-500', }, { label: 'Performance', value: stats.avgPerformance || 'N/A', sub: 'Lighthouse score', icon: TrendingUp, tab: 'analytics' as TabId, gradient: 'from-amber-400/20 to-amber-400/5', border: 'border-amber-400/20 dark:border-amber-400/10', iconColor: 'text-amber-500', tooltip: stats.avgPerformance > 0 ? 'REAL DATA: Average Lighthouse score from real Web Vitals collected from page visits.' : 'No performance data yet. Scores appear after visitors load pages.', }, { label: 'Bounce Rate', value: `${stats.bounceRate}%`, sub: 'Exit rate', icon: Users, tab: 'analytics' as TabId, gradient: 'from-pink-400/20 to-pink-400/5', border: 'border-pink-400/20 dark:border-pink-400/10', iconColor: 'text-pink-500', tooltip: 'REAL DATA: Percentage of sessions with only 1 pageview. Lower is better.', }, { label: 'System', value: 'Online', sub: 'Operational', icon: Shield, tab: 'settings' as TabId, gradient: 'from-teal-400/20 to-teal-400/5', border: 'border-teal-400/20 dark:border-teal-400/10', iconColor: 'text-teal-500', pulse: true, }, ]; return (
{/* Navbar */}
{/* Gradient accent bar */}
{/* Left: branding */}
dk0.dev
Admin
{/* Center: desktop tabs */}
{navigation.map((item) => ( ))}
{/* Right: user + logout + mobile toggle */}
Dennis
{/* Mobile menu */} {mobileMenuOpen && (
{navigation.map((item) => ( ))}
)}
{/* Main content */}
{/* Overview tab */} {activeTab === 'overview' && (

Dashboard.

Manage your portfolio and monitor performance

{/* Stats grid */}
{statCards.map((card) => (
setActiveTab(card.tab)} >

{card.label}

{card.pulse ? ( {card.value} ) : card.value}

{card.sub}

{card.tooltip && (
{card.tooltip}
)}
))}
{/* Recent Activity + Quick Actions */}
{/* Recent Activity */}

Recent Activity

Projects

{projects.slice(0, 3).map((project) => (
setActiveTab('projects')} >

{project.title}

{project.analytics?.views || 0} views

{project.published ? 'Live' : 'Draft'} {project.featured && ( Featured )}
))} {projects.length === 0 && (

No projects yet

)}

Messages

{emails.slice(0, 3).map((email, index) => (
setActiveTab('emails')} >

{email.name as string}

{(email.subject as string) || 'No subject'}

{!(email.read as boolean) && (
)}
))} {emails.length === 0 && (

No messages yet

)}
{/* Quick Actions */}

Quick Actions

{[ { label: 'Ghost Editor', sub: 'Professional writing tool', icon: Plus, action: () => window.location.href = '/editor', color: 'from-emerald-400/20 to-emerald-400/5 border-emerald-400/20' }, { label: 'View Messages', sub: `${stats.unreadEmails} unread`, icon: Mail, action: () => setActiveTab('emails'), color: 'from-purple-400/20 to-purple-400/5 border-purple-400/20' }, { label: 'Analytics', sub: 'View detailed stats', icon: TrendingUp, action: () => setActiveTab('analytics'), color: 'from-sky-400/20 to-sky-400/5 border-sky-400/20' }, { label: 'Settings', sub: 'System configuration', icon: Settings, action: () => setActiveTab('settings'), color: 'from-stone-400/20 to-stone-400/5 border-stone-400/20' }, ].map((item) => ( ))}
)} {activeTab === 'projects' && (

Projects.

Manage your portfolio projects

)} {activeTab === 'emails' && ( )} {activeTab === 'analytics' && ( )} {activeTab === 'content' && ( )} {activeTab === 'settings' && (

Settings.

Manage system configuration and preferences

Import / Export

Backup and restore your portfolio data

System Status

{[ { label: 'Database', color: 'bg-emerald-400/20 border-emerald-400/20', dot: 'bg-emerald-500', text: 'text-emerald-600 dark:text-emerald-400' }, { label: 'Redis Cache', color: 'bg-emerald-400/20 border-emerald-400/20', dot: 'bg-emerald-500', text: 'text-emerald-600 dark:text-emerald-400' }, { label: 'API Services', color: 'bg-emerald-400/20 border-emerald-400/20', dot: 'bg-emerald-500', text: 'text-emerald-600 dark:text-emerald-400' }, ].map((item) => (
{item.label}
Online
))}
)}
); }; export default ModernAdminDashboard;