import { useQuery } from '@tanstack/react-query'; import { CartesianGrid, ComposedChart, Line, ResponsiveContainer, XAxis, YAxis, } from 'recharts'; import { ChartTooltipHeader, ChartTooltipItem, createChartTooltip, } from '@/components/charts/chart-tooltip'; import { useOverviewOptions } from '@/components/overview/useOverviewOptions'; import { useYAxisProps, X_AXIS_STYLE_PROPS, } from '@/components/report-chart/common/axis'; import { Skeleton } from '@/components/skeleton'; import { useFormatDateInterval } from '@/hooks/use-format-date-interval'; import { useTRPC } from '@/integrations/trpc/react'; import { getChartColor } from '@/utils/theme'; interface ChartData { date: string; clicks: number; impressions: number; } const { TooltipProvider, Tooltip } = createChartTooltip< ChartData, { formatDate: (date: Date | string) => string } >(({ data, context }) => { const item = data[0]; if (!item) { return null; } return ( <>
{context.formatDate(item.date)}
Clicks {item.clicks.toLocaleString()}
Impressions {item.impressions.toLocaleString()}
); }); interface GscClicksChartProps { projectId: string; value: string; type: 'page' | 'query'; } export function GscClicksChart({ projectId, value, type, }: GscClicksChartProps) { const { range, startDate, endDate, interval } = useOverviewOptions(); const trpc = useTRPC(); const yAxisProps = useYAxisProps(); const formatDateShort = useFormatDateInterval({ interval, short: true }); const formatDateLong = useFormatDateInterval({ interval, short: false }); const dateInput = { range, startDate: startDate ?? undefined, endDate: endDate ?? undefined, }; const pageQuery = useQuery( trpc.gsc.getPageDetails.queryOptions( { projectId, page: value, ...dateInput }, { enabled: type === 'page' } ) ); const queryQuery = useQuery( trpc.gsc.getQueryDetails.queryOptions( { projectId, query: value, ...dateInput }, { enabled: type === 'query' } ) ); const isLoading = type === 'page' ? pageQuery.isLoading : queryQuery.isLoading; const timeseries = (type === 'page' ? pageQuery.data?.timeseries : queryQuery.data?.timeseries) ?? []; const data: ChartData[] = timeseries.map((r) => ({ date: r.date, clicks: r.clicks, impressions: r.impressions, })); return (

Clicks & Impressions

Clicks Impressions
{isLoading ? ( ) : ( formatDateShort(v)} type="category" /> )}
); }