"use client"; import { useState, useEffect } from 'react'; interface UtmData { utm_value: string; clicks: number; visitors: number; avg_time_spent: number; bounces: number; conversions: number; } interface UtmAnalyticsProps { startTime?: string; endTime?: string; linkId?: string; teamIds?: string[]; projectIds?: string[]; tagIds?: string[]; subpath?: string; } export default function UtmAnalytics({ startTime, endTime, linkId, teamIds, projectIds, tagIds, subpath }: UtmAnalyticsProps) { const [activeTab, setActiveTab] = useState('source'); const [utmData, setUtmData] = useState([]); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); // 加载UTM数据 useEffect(() => { const fetchUtmData = async () => { setIsLoading(true); setError(null); try { // 构建URL参数 const params = new URLSearchParams(); if (startTime) params.append('startTime', startTime); if (endTime) params.append('endTime', endTime); if (linkId) params.append('linkId', linkId); if (subpath) params.append('subpath', subpath); params.append('utmType', activeTab); // 添加团队ID参数 if (teamIds && teamIds.length > 0) { teamIds.forEach(id => params.append('teamId', id)); } // 添加项目ID参数 if (projectIds && projectIds.length > 0) { projectIds.forEach(id => params.append('projectId', id)); } // 添加标签名称参数 if (tagIds && tagIds.length > 0) { tagIds.forEach(tagName => params.append('tagName', tagName)); } // 发送请求 const response = await fetch(`/api/events/utm?${params}`); if (!response.ok) { throw new Error('Failed to fetch UTM data'); } const result = await response.json(); if (result.success) { setUtmData(result.data || []); } else { throw new Error(result.error || 'Failed to fetch UTM data'); } } catch (err) { setError(err instanceof Error ? err.message : 'Unknown error occurred'); console.error('Error fetching UTM data:', err); } finally { setIsLoading(false); } }; fetchUtmData(); }, [activeTab, startTime, endTime, linkId, teamIds, projectIds, tagIds, subpath]); // 安全地格式化数字 const formatNumber = (value: number | undefined | null): string => { if (value === undefined || value === null) return '0'; return value.toLocaleString(); }; return (

UTM Parameters

{isLoading ? (
Loading...
) : error ? (
Error: {error}
) : utmData.length === 0 ? (
No data available
) : (
{utmData.map((item, index) => { const bounceRate = item.clicks > 0 ? (item.bounces / item.clicks) * 100 : 0; const conversionRate = item.clicks > 0 ? (item.conversions / item.clicks) * 100 : 0; return ( ); })}
{activeTab === 'source' ? 'Source' : activeTab === 'medium' ? 'Medium' : activeTab === 'campaign' ? 'Campaign' : activeTab === 'term' ? 'Term' : 'Content'} Clicks Visitors Avg. Time Bounce Rate Conversions
{item.utm_value || 'Unknown'} {formatNumber(item.clicks)} {formatNumber(item.visitors)} {item.avg_time_spent.toFixed(1)}s {bounceRate.toFixed(1)}% {formatNumber(item.conversions)} ({conversionRate.toFixed(1)}%)
)}
); }