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:
{data.sources.map((source: { source: string; count: number }) => (
-
{source.source}: {source.count}
))}
)}
);
}
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 (
);
}