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) => (
|
))}
} />
{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
))}
);
};