'use client' import { useMemo } from 'react' import { useTheme } from '@ciphera-net/ui' import { Area, CartesianGrid, ComposedChart, Line, XAxis, YAxis } from 'recharts' import { ChartContainer, ChartTooltip, type ChartConfig } from '@/components/ui/line-charts-6' import { useGSCDailyTotals } from '@/lib/swr/dashboard' import { SkeletonLine } from '@/components/skeletons' import { formatDateShort } from '@/lib/utils/formatDate' // ─── Config ───────────────────────────────────────────────────── const chartConfig = { clicks: { label: 'Clicks', color: '#FD5E0F' }, impressions: { label: 'Impressions', color: '#9CA3AF' }, } satisfies ChartConfig // ─── Custom Tooltip ───────────────────────────────────────────── interface TooltipProps { active?: boolean payload?: Array<{ dataKey: string; value: number; color: string }> label?: string } function CustomTooltip({ active, payload, label }: TooltipProps) { if (!active || !payload?.length) return null const clicks = payload.find((p) => p.dataKey === 'clicks') const impressions = payload.find((p) => p.dataKey === 'impressions') return (
{label}
{clicks && (
Clicks: {clicks.value.toLocaleString()}
)} {impressions && (
Impressions: {impressions.value.toLocaleString()}
)}
) } // ─── Component ────────────────────────────────────────────────── interface ClicksImpressionsChartProps { siteId: string startDate: string endDate: string } export default function ClicksImpressionsChart({ siteId, startDate, endDate }: ClicksImpressionsChartProps) { const { resolvedTheme } = useTheme() const { data, isLoading } = useGSCDailyTotals(siteId, startDate, endDate) const chartData = useMemo(() => { if (!data?.daily_totals?.length) return [] return data.daily_totals.map((item) => ({ date: formatDateShort(new Date(item.date + 'T00:00:00')), clicks: item.clicks, impressions: item.impressions, })) }, [data]) // Loading skeleton if (isLoading) { return (
) } // No data — don't render anything if (!chartData.length) return null const gridStroke = resolvedTheme === 'dark' ? '#374151' : '#e5e7eb' return (

Clicks & Impressions

v.toLocaleString()} /> v.toLocaleString()} /> } cursor={{ strokeDasharray: '3 3', stroke: '#9ca3af' }} />
) }