"use client"; import { useState, useEffect } from 'react'; import { DeviceAnalytics } from '../../api/types'; export default function DeviceAnalyticsPage() { const [deviceData, setDeviceData] = useState(null); 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 fetchDeviceData = async () => { try { setIsLoading(true); setError(null); const response = await fetch(`/api/events/devices?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 device data'); const data = await response.json(); setDeviceData(data.data); } catch (err) { setError(err instanceof Error ? err.message : 'An error occurred'); } finally { setIsLoading(false); } }; fetchDeviceData(); }, [dateRange]); return (
{/* 页面标题 */}

Device Analytics

Analyze visitor distribution by devices, browsers, and operating systems

{/* 时间范围选择器 */}
setDateRange(prev => ({ ...prev, from: new Date(e.target.value) }))} />
setDateRange(prev => ({ ...prev, to: new Date(e.target.value) }))} />
{/* 设备类型分析 */}
{/* 设备类型 */}

Device Types

{deviceData?.deviceTypes.map(item => (
{item.type} {item.count} ({item.percentage.toFixed(1)}%)
))}
{/* 浏览器 */}

Browsers

{deviceData?.browsers.map(item => (
{item.name} {item.count} ({item.percentage.toFixed(1)}%)
))}
{/* 操作系统 */}

Operating Systems

{deviceData?.operatingSystems.map(item => (
{item.name} {item.count} ({item.percentage.toFixed(1)}%)
))}
{/* 加载状态 */} {isLoading && (
)} {/* 错误状态 */} {error && (

{error}

)} {/* 无数据状态 */} {!isLoading && !error && !deviceData && (

No device data available

)}
); }