diff --git a/app/sites/[id]/page.tsx b/app/sites/[id]/page.tsx index 6ad7551..9b5e401 100644 --- a/app/sites/[id]/page.tsx +++ b/app/sites/[id]/page.tsx @@ -3,12 +3,10 @@ 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, getBrowsers, getOS, getDevices, getScreenResolutions, getEntryPages, getExitPages, getDashboard } from '@/lib/api/stats' +import { getStats, getRealtime, getDailyStats, getTopPages, getTopReferrers, getCountries, getCities, getRegions, getBrowsers, getOS, getDevices, getScreenResolutions, getEntryPages, getExitPages, getDashboard, type Stats, type DailyStat } from '@/lib/api/stats' import { formatNumber, formatDuration, 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 ContentStats from '@/components/dashboard/ContentStats' import TopReferrers from '@/components/dashboard/TopReferrers' import Locations from '@/components/dashboard/Locations' @@ -22,9 +20,11 @@ export default function SiteDashboardPage() { const [site, setSite] = useState(null) const [loading, setLoading] = useState(true) - const [stats, setStats] = useState({ pageviews: 0, visitors: 0, bounce_rate: 0, avg_duration: 0 }) + const [stats, setStats] = useState({ pageviews: 0, visitors: 0, bounce_rate: 0, avg_duration: 0 }) + const [prevStats, setPrevStats] = useState(undefined) const [realtime, setRealtime] = useState(0) - const [dailyStats, setDailyStats] = useState([]) + const [dailyStats, setDailyStats] = useState([]) + const [prevDailyStats, setPrevDailyStats] = useState(undefined) const [topPages, setTopPages] = useState([]) const [entryPages, setEntryPages] = useState([]) const [exitPages, setExitPages] = useState([]) @@ -46,15 +46,55 @@ export default function SiteDashboardPage() { return () => clearInterval(interval) }, [siteId, dateRange]) + const getPreviousDateRange = (start: string, end: string) => { + const startDate = new Date(start) + const endDate = new Date(end) + const duration = endDate.getTime() - startDate.getTime() + + // * If duration is 0 (Today), set previous range to yesterday + if (duration === 0) { + const prevEnd = new Date(startDate.getTime() - 24 * 60 * 60 * 1000) + const prevStart = prevEnd + return { + start: prevStart.toISOString().split('T')[0], + end: prevEnd.toISOString().split('T')[0] + } + } + + const prevEnd = new Date(startDate.getTime() - 24 * 60 * 60 * 1000) + const prevStart = new Date(prevEnd.getTime() - duration) + + return { + start: prevStart.toISOString().split('T')[0], + end: prevEnd.toISOString().split('T')[0] + } + } + const loadData = async () => { try { setLoading(true) - const data = await getDashboard(siteId, dateRange.start, dateRange.end, 10) + const interval = dateRange.start === dateRange.end ? 'hour' : 'day' + + const [data, prevStatsData, prevDailyStatsData] = await Promise.all([ + getDashboard(siteId, dateRange.start, dateRange.end, 10, interval), + (async () => { + const prevRange = getPreviousDateRange(dateRange.start, dateRange.end) + return getStats(siteId, prevRange.start, prevRange.end) + })(), + (async () => { + const prevRange = getPreviousDateRange(dateRange.start, dateRange.end) + return getDailyStats(siteId, prevRange.start, prevRange.end, interval) + })() + ]) setSite(data.site) setStats(data.stats || { pageviews: 0, visitors: 0, bounce_rate: 0, avg_duration: 0 }) setRealtime(data.realtime_visitors || 0) setDailyStats(Array.isArray(data.daily_stats) ? data.daily_stats : []) + + setPrevStats(prevStatsData) + setPrevDailyStats(prevDailyStatsData) + setTopPages(Array.isArray(data.top_pages) ? data.top_pages : []) setEntryPages(Array.isArray(data.entry_pages) ? data.entry_pages : []) setExitPages(Array.isArray(data.exit_pages) ? data.exit_pages : []) @@ -98,23 +138,50 @@ export default function SiteDashboardPage() {
-
-

- {site.name} -

-

- {site.domain} -

+
+
+

+ {site.name} +

+

+ {site.domain} +

+
+ + {/* Realtime Indicator */} +
+ + + + + + {realtime} current visitors + +
+