import React, { useState, useEffect } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { PieChart, Pie, Cell, ResponsiveContainer, Tooltip, Legend, } from "recharts"; import { Loader2 } from "lucide-react"; import { googleAnalyticsService } from "../../services/googleAnalyticsService"; export const UserBehaviorDashboard = () => { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [timeRange, setTimeRange] = useState("30"); useEffect(() => { const fetchData = async () => { setLoading(true); try { const result = await googleAnalyticsService.getUserBehavior(timeRange); if (result) { setData(result); } } catch (error) { console.error("Failed to fetch behavior data:", error); } finally { setLoading(false); } }; fetchData(); }, [timeRange]); if (loading) { return ( ); } const COLORS = { desktop: "#8b5cf6", // Purple mobile: "#10b981", // Green tablet: "#f59e0b", // Yellow }; const deviceData = data?.data?.pageData?.deviceData || []; const totalViews = deviceData.reduce((sum, item) => sum + item.pageViews, 0); const totalSessions = deviceData.reduce( (sum, item) => sum + item.sessions, 0 ); const CustomTooltip = ({ active, payload }) => { if (active && payload && payload.length) { const data = payload[0].payload; const percentage = ((data.pageViews / totalViews) * 100).toFixed(1); const sessionPercentage = ((data.sessions / totalSessions) * 100).toFixed( 1 ); return (

{data.device}

{data.pageViews.toLocaleString()} views ({percentage}%)

{data.sessions.toLocaleString()} sessions ({sessionPercentage}%)

); } return null; }; const formatDuration = (seconds) => { const minutes = Math.floor(seconds / 60); const remainingSeconds = Math.floor(seconds % 60); return `${minutes}m ${remainingSeconds}s`; }; return (
User Behavior Analysis
Top Pages Traffic Sources Device Usage Page Path Views Bounce Rate Avg. Duration {data?.data?.pageData?.pageData.map((page, index) => ( {page.path} {page.pageViews.toLocaleString()} {page.bounceRate.toFixed(1)}% {formatDuration(page.avgSessionDuration)} ))}
Source Sessions Conversions Conv. Rate {data?.data?.sourceData?.map((source, index) => ( {source.source} {source.sessions.toLocaleString()} {source.conversions.toLocaleString()} {((source.conversions / source.sessions) * 100).toFixed( 1 )} % ))}
`${name} ${(percent * 100).toFixed(1)}%` } > {deviceData.map((entry, index) => ( ))} } /> ( {value} )} />
{deviceData.map((device) => (
{device.device}
{device.pageViews.toLocaleString()}
{((device.pageViews / totalViews) * 100).toFixed(1)}% of views
{device.sessions.toLocaleString()}
{((device.sessions / totalSessions) * 100).toFixed(1)}% of sessions
))}
); };