"use client"; import { useState, useEffect } from 'react'; import { GeoData } from '../../api/types'; export default function GeoAnalyticsPage() { const [geoData, setGeoData] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [dateRange, setDateRange] = useState({ from: new Date('2024-02-01'), to: new Date('2025-03-05') }); useEffect(() => { const fetchGeoData = async () => { try { setIsLoading(true); setError(null); const response = await fetch(`/api/events/geo?startTime=${dateRange.from.toISOString().split('T')[0]}T00:00:00Z&endTime=${dateRange.to.toISOString().split('T')[0]}T23:59:59Z`); if (!response.ok) throw new Error('Failed to fetch geographic data'); const data = await response.json(); setGeoData(data.data); } catch (err) { setError(err instanceof Error ? err.message : 'An error occurred'); } finally { setIsLoading(false); } }; fetchGeoData(); }, [dateRange]); return (
{/* 页面标题 */}

Geographic Analysis

Analyze visitor distribution by location

{/* 时间范围选择器 */}
setDateRange(prev => ({ ...prev, from: new Date(e.target.value) }))} />
setDateRange(prev => ({ ...prev, to: new Date(e.target.value) }))} />
{/* 地理数据表格 */}
{geoData.map(item => ( ))}
Location Visits Unique Visitors Percentage
{item.location} {item.visits} {item.visitors}
{item.percentage.toFixed(1)}%
{/* 加载状态 */} {isLoading && (
)} {/* 错误状态 */} {error && (

{error}

)} {/* 无数据状态 */} {!isLoading && !error && geoData.length === 0 && (

No geographic data available

)}
{/* 提示信息 */}

Note: Geographic data is based on IP addresses and may not be 100% accurate.

); }