import * as React from 'react'; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, BarChart, Bar, PieChart, Pie, Cell, Sector } from 'recharts'; import { subDays, format } from 'date-fns'; import { AnalyticsData } from '../types'; import { useTranslation } from '../hooks/useI18n'; const generateAllTimeData = () => { const data = []; for (let i = 60; i >= 0; i--) { const date = subDays(new Date(), i); data.push({ date: format(date, 'MMM d'), views: 1000 + Math.floor(Math.random() * 800) + (60 - i) * 15, clicks: 600 + Math.floor(Math.random() * 500) + (60 - i) * 10, uniqueVisitors: 700 + Math.floor(Math.random() * 400) + (60 - i) * 12, }); } return data; }; const allTimeData = generateAllTimeData(); const allTimeReferrers = [ { source: 'Instagram', visits: 12450 }, { source: 'Twitter / X', visits: 9870 }, { source: 'Direct', visits: 8320 }, { source: 'LinkedIn', visits: 6400 }, { source: 'Facebook', visits: 4100 }, ]; const allTimeLocations = [ { country: 'USA', visits: 22500 }, { country: 'India', visits: 15300 }, { country: 'UK', visits: 11800 }, { country: 'Canada', visits: 8900 }, { country: 'Germany', visits: 7200 }, ]; const allTimeDevices = [ { name: 'Mobile', value: 38400 }, { name: 'Desktop', value: 16600 }, ]; const COLORS = ['#10b981', '#4b5563']; interface PageAnalyticsProps { analyticsData: AnalyticsData; } const PageAnalytics: React.FC = ({ analyticsData }) => { const { t } = useTranslation(); const [timeRange, setTimeRange] = React.useState<'7' | '28' | 'all'>('7'); const [isDarkMode, setIsDarkMode] = React.useState(document.documentElement.classList.contains('dark')); React.useEffect(() => { const observer = new MutationObserver(() => { setIsDarkMode(document.documentElement.classList.contains('dark')); }); observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] }); return () => observer.disconnect(); }, []); const chartColors = { grid: isDarkMode ? '#374151' : '#e5e7eb', text: isDarkMode ? '#9CA3AF' : '#6b7280', tooltipBg: isDarkMode ? '#1F2937' : '#FFFFFF', tooltipBorder: isDarkMode ? '#4B5563' : '#d1d5db', }; const processedAnalytics = React.useMemo(() => { const range = timeRange === 'all' ? allTimeData.length : parseInt(timeRange); const chartData = allTimeData.slice(-range); const summary = chartData.reduce((acc, day) => { acc.views += day.views; acc.clicks += day.clicks; acc.uniqueVisitors += day.uniqueVisitors; return acc; }, { views: 0, clicks: 0, uniqueVisitors: 0 }); const ctr = summary.views > 0 ? `${((summary.clicks / summary.views) * 100).toFixed(1)}%` : '0%'; const multiplier = range / allTimeData.length; const topReferrers = allTimeReferrers.map(r => ({ ...r, visits: Math.round(r.visits * multiplier) })).sort((a,b) => b.visits - a.visits); const topLocations = allTimeLocations.map(l => ({ ...l, visits: Math.round(l.visits * multiplier) })).sort((a,b) => b.visits - a.visits); const deviceData = allTimeDevices.map(d => ({ ...d, value: Math.round(d.value * multiplier) })); return { chartData, summary, ctr, topReferrers, topLocations, deviceData }; }, [timeRange]); const renderActiveShape = (props: any) => { const RADIAN = Math.PI / 180; const { cx, cy, midAngle, innerRadius, outerRadius, startAngle, endAngle, fill, payload, percent, value } = props; const sin = Math.sin(-RADIAN * midAngle); const cos = Math.cos(-RADIAN * midAngle); const sx = cx + (outerRadius + 10) * cos; const sy = cy + (outerRadius + 10) * sin; const mx = cx + (outerRadius + 30) * cos; const my = cy + (outerRadius + 30) * sin; const ex = mx + (cos >= 0 ? 1 : -1) * 22; const ey = my; const textAnchor = cos >= 0 ? 'start' : 'end'; return ( {payload.name} = 0 ? 1 : -1) * 12} y={ey} textAnchor={textAnchor} fill={isDarkMode ? '#fff' : '#000'}>{`${value.toLocaleString()}`} = 0 ? 1 : -1) * 12} y={ey} dy={18} textAnchor={textAnchor} fill="#9ca3af">{`(Rate ${(percent * 100).toFixed(2)}%)`} ); }; const [activeIndex, setActiveIndex] = React.useState(0); const onPieEnter = (_: any, index: number) => setActiveIndex(index); return (

{t('analytics.page.title')}

{(['7', '28', 'all'] as const).map(range => ( ))}

{t('analytics.page.views')}

{processedAnalytics.summary.views.toLocaleString()}

{t('analytics.page.clicks')}

{processedAnalytics.summary.clicks.toLocaleString()}

{t('analytics.page.ctr')}

{processedAnalytics.ctr}

{t('analytics.page.unique_visitors')}

{processedAnalytics.summary.uniqueVisitors.toLocaleString()}

{t('analytics.page.performance')}

{t('analytics.page.device_breakdown')}

{processedAnalytics.deviceData.map((entry, index) => ( ))}

{t('analytics.page.top_locations')}

{t('analytics.page.top_referrers')}

); }; export default PageAnalytics;