import { useEffect, useState } from "react"; import { Card } from "@/components/ui/card"; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from "recharts"; import { Users, Loader2 } from "lucide-react"; interface VisitorData { timestamp: number; count: number; } export function VisitorChart() { const [data, setData] = useState([]); const [loading, setLoading] = useState(true); const [days, setDays] = useState(7); useEffect(() => { fetchVisitorData(); const interval = setInterval(fetchVisitorData, 5 * 60 * 1000); return () => clearInterval(interval); }, [days]); const fetchVisitorData = async () => { try { const res = await fetch(`/api/stats/visitors?days=${days}`); const json = await res.json(); if (json.success) { setData(json.data); } } catch (error) { console.error("Failed to fetch visitor data:", error); } finally { setLoading(false); } }; const formatXAxis = (timestamp: number) => { const date = new Date(timestamp); if (days <= 7) { return date.toLocaleDateString('id-ID', { month: 'short', day: 'numeric' }); } else if (days <= 30) { return date.toLocaleDateString('id-ID', { month: 'short', day: 'numeric' }); } else { return date.toLocaleDateString('id-ID', { month: 'short', day: 'numeric' }); } }; const CustomTooltip = ({ active, payload }: any) => { if (active && payload && payload.length) { const data = payload[0].payload; const date = new Date(data.timestamp); const dateStr = date.toLocaleDateString('id-ID', { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric', }); return (

{dateStr}

{data.count} visitor{data.count !== 1 ? 's' : ''}

); } return null; }; const totalVisitors = data.reduce((sum, d) => sum + d.count, 0); return (

Visitor Activity

{totalVisitors}

Total visitors in last {days} days

{loading ? (
) : ( } /> )}
); }