'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, getCities, getRegions } 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 Cities from '@/components/dashboard/Cities' import Regions from '@/components/dashboard/Regions' 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 [cities, setCities] = useState([]) const [regions, setRegions] = 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, citiesData, regionsData] = 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), getCities(siteId, dateRange.start, dateRange.end, 10), getRegions(siteId, dateRange.start, dateRange.end, 10), ]) setSite(siteData) setStats(statsData || { pageviews: 0, visitors: 0 }) setRealtime(realtimeData?.visitors || 0) setDailyStats(Array.isArray(dailyData) ? dailyData : []) setTopPages(Array.isArray(pagesData) ? pagesData : []) setTopReferrers(Array.isArray(referrersData) ? referrersData : []) setCountries(Array.isArray(countriesData) ? countriesData : []) setCities(Array.isArray(citiesData) ? citiesData : []) setRegions(Array.isArray(regionsData) ? regionsData : []) } 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}

) }