'use client' import { useEffect, useState } from 'react' import { useParams, useRouter } from 'next/navigation' import { getSite, type Site } from '@/lib/api/sites' import { getStats, getRealtime, getDailyStats, getTopPages, getTopReferrers, getCountries } from '@/lib/api/stats' import { formatNumber, getDateRange } from '@/lib/utils/format' import { toast } from 'sonner' import LoadingOverlay from '@/components/LoadingOverlay' import StatsCard from '@/components/dashboard/StatsCard' import RealtimeVisitors from '@/components/dashboard/RealtimeVisitors' import TopPages from '@/components/dashboard/TopPages' import TopReferrers from '@/components/dashboard/TopReferrers' import Countries from '@/components/dashboard/Countries' import Chart from '@/components/dashboard/Chart' export default function SiteDashboardPage() { const params = useParams() const router = useRouter() const siteId = params.id as string const [site, setSite] = useState(null) const [loading, setLoading] = useState(true) const [stats, setStats] = useState({ pageviews: 0, visitors: 0 }) const [realtime, setRealtime] = useState(0) const [dailyStats, setDailyStats] = useState([]) const [topPages, setTopPages] = useState([]) const [topReferrers, setTopReferrers] = useState([]) const [countries, setCountries] = useState([]) const [dateRange, setDateRange] = useState(getDateRange(30)) useEffect(() => { loadData() const interval = setInterval(() => { loadRealtime() }, 30000) // Update every 30 seconds return () => clearInterval(interval) }, [siteId, dateRange]) const loadData = async () => { try { setLoading(true) const [siteData, statsData, realtimeData, dailyData, pagesData, referrersData, countriesData] = await Promise.all([ getSite(siteId), getStats(siteId, dateRange.start, dateRange.end), getRealtime(siteId), getDailyStats(siteId, dateRange.start, dateRange.end), getTopPages(siteId, dateRange.start, dateRange.end, 10), getTopReferrers(siteId, dateRange.start, dateRange.end, 10), getCountries(siteId, dateRange.start, dateRange.end, 10), ]) setSite(siteData) setStats(statsData) setRealtime(realtimeData.visitors) setDailyStats(dailyData) setTopPages(pagesData) setTopReferrers(referrersData) setCountries(countriesData) } catch (error: any) { toast.error('Failed to load data: ' + (error.message || 'Unknown error')) } finally { setLoading(false) } } const loadRealtime = async () => { try { const data = await getRealtime(siteId) setRealtime(data.visitors) } catch (error) { // Silently fail for realtime updates } } if (loading) { return } if (!site) { return (

Site not found

) } return (

{site.name}

{site.domain}

) }