import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, } from "recharts"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { toast } from "@/hooks/use-toast"; import { useState, useEffect } from "react"; import { getLinkClickStats, getLinkSourceStats } from "../api/client"; import { ClickStats, SourceStats } from "../types/api"; interface StatisticsModalProps { isOpen: boolean; onClose: () => void; linkId: number; } interface EnhancedClickStats extends ClickStats { sources?: { source: string; count: number }[]; } const CustomTooltip = ({ active, payload, label, }: { active?: boolean; payload?: any[]; label?: string; }) => { if (active && payload && payload.length > 0) { const data = payload[0].payload; return (

{label}

Clicks: {data.clicks}

{data.sources && data.sources.length > 0 && (

Sources:

)}
); } return null; }; export function StatisticsModal({ isOpen, onClose, linkId }: StatisticsModalProps) { const [clicksOverTime, setClicksOverTime] = useState([]); const [sourcesData, setSourcesData] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { if (isOpen && linkId) { const fetchData = async () => { try { setLoading(true); const [clicksData, sourcesData] = await Promise.all([ getLinkClickStats(linkId), getLinkSourceStats(linkId), ]); // Enhance clicks data with source information const enhancedClicksData = clicksData.map((clickData) => ({ ...clickData, sources: sourcesData.filter((source) => source.date === clickData.date), })); setClicksOverTime(enhancedClicksData); setSourcesData(sourcesData); } catch (error: any) { console.error("Failed to fetch statistics:", error); toast({ variant: "destructive", title: "Error", description: error.response?.data || "Failed to load statistics", }); } finally { setLoading(false); } }; fetchData(); } }, [isOpen, linkId]); return ( Link Statistics {loading ? (
Loading...
) : (
Clicks Over Time
} />
Top Sources
    {sourcesData.map((source, index) => (
  • {index + 1}. {source.source} {source.count} clicks
  • ))}
)}
); }