"use client"; import { useState, useEffect } from 'react'; import { format } from 'date-fns'; import { DateRangePicker } from '@/app/components/ui/DateRangePicker'; import TimeSeriesChart from '@/app/components/charts/TimeSeriesChart'; import GeoAnalytics from '@/app/components/analytics/GeoAnalytics'; import DeviceAnalytics from '@/app/components/analytics/DeviceAnalytics'; import { EventsSummary, TimeSeriesData, GeoData, DeviceAnalytics as DeviceAnalyticsType } from '@/app/api/types'; export default function DashboardPage() { const [dateRange, setDateRange] = useState({ from: new Date('2024-02-01'), to: new Date('2025-03-05') }); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [summary, setSummary] = useState(null); const [timeSeriesData, setTimeSeriesData] = useState([]); const [geoData, setGeoData] = useState([]); const [deviceData, setDeviceData] = useState(null); useEffect(() => { const fetchData = async () => { setLoading(true); setError(null); try { const startTime = format(dateRange.from, "yyyy-MM-dd'T'HH:mm:ss'Z'"); const endTime = format(dateRange.to, "yyyy-MM-dd'T'HH:mm:ss'Z'"); // 并行获取所有数据 const [summaryRes, timeSeriesRes, geoRes, deviceRes] = await Promise.all([ fetch(`/api/events/summary?startTime=${startTime}&endTime=${endTime}`), fetch(`/api/events/time-series?startTime=${startTime}&endTime=${endTime}`), fetch(`/api/events/geo?startTime=${startTime}&endTime=${endTime}`), fetch(`/api/events/devices?startTime=${startTime}&endTime=${endTime}`) ]); const [summaryData, timeSeriesData, geoData, deviceData] = await Promise.all([ summaryRes.json(), timeSeriesRes.json(), geoRes.json(), deviceRes.json() ]); if (!summaryRes.ok) throw new Error(summaryData.error || 'Failed to fetch summary data'); if (!timeSeriesRes.ok) throw new Error(timeSeriesData.error || 'Failed to fetch time series data'); if (!geoRes.ok) throw new Error(geoData.error || 'Failed to fetch geo data'); if (!deviceRes.ok) throw new Error(deviceData.error || 'Failed to fetch device data'); setSummary(summaryData.data); setTimeSeriesData(timeSeriesData.data); setGeoData(geoData.data); setDeviceData(deviceData.data); } catch (err) { setError(err instanceof Error ? err.message : 'An error occurred while fetching data'); } finally { setLoading(false); } }; fetchData(); }, [dateRange]); if (loading) { return (
); } if (error) { return (
{error}
); } return (

Analytics Dashboard

{summary && (

Total Events

{typeof summary.totalEvents === 'number' ? summary.totalEvents.toLocaleString() : summary.totalEvents}

Unique Visitors

{typeof summary.uniqueVisitors === 'number' ? summary.uniqueVisitors.toLocaleString() : summary.uniqueVisitors}

Total Conversions

{typeof summary.totalConversions === 'number' ? summary.totalConversions.toLocaleString() : summary.totalConversions}

Avg. Time Spent

{summary.averageTimeSpent?.toFixed(1) || '0'}s

)}

Event Trends

Device Analytics

{deviceData && }

Geographic Distribution

); }