diff --git a/components/behavior/FrustrationTrend.tsx b/components/behavior/FrustrationTrend.tsx index a93d51e..9247113 100644 --- a/components/behavior/FrustrationTrend.tsx +++ b/components/behavior/FrustrationTrend.tsx @@ -1,12 +1,10 @@ 'use client' import { TrendUp } from '@phosphor-icons/react' -import { Pie, PieChart } from 'recharts' +import { Pie, PieChart, Tooltip } from 'recharts' import { ChartContainer, - ChartTooltip, - ChartTooltipContent, type ChartConfig, } from '@/components/charts' import type { FrustrationSummary } from '@/lib/api/stats' @@ -30,6 +28,13 @@ function SkeletonCard() { ) } +const LABELS: Record = { + rage_clicks: 'Rage Clicks', + dead_clicks: 'Dead Clicks', + prev_rage_clicks: 'Prev Rage Clicks', + prev_dead_clicks: 'Prev Dead Clicks', +} + const COLORS = { rage_clicks: 'rgba(253, 94, 15, 0.7)', dead_clicks: 'rgba(180, 83, 9, 0.7)', @@ -38,27 +43,32 @@ const COLORS = { } as const const chartConfig = { - count: { - label: 'Count', - }, - rage_clicks: { - label: 'Rage Clicks', - color: COLORS.rage_clicks, - }, - dead_clicks: { - label: 'Dead Clicks', - color: COLORS.dead_clicks, - }, - prev_rage_clicks: { - label: 'Prev Rage Clicks', - color: COLORS.prev_rage_clicks, - }, - prev_dead_clicks: { - label: 'Prev Dead Clicks', - color: COLORS.prev_dead_clicks, - }, + count: { label: 'Count' }, + rage_clicks: { label: 'Rage Clicks', color: COLORS.rage_clicks }, + dead_clicks: { label: 'Dead Clicks', color: COLORS.dead_clicks }, + prev_rage_clicks: { label: 'Prev Rage Clicks', color: COLORS.prev_rage_clicks }, + prev_dead_clicks: { label: 'Prev Dead Clicks', color: COLORS.prev_dead_clicks }, } satisfies ChartConfig +function CustomTooltip({ active, payload }: { active?: boolean; payload?: Array<{ payload: { type: string; count: number; fill: string } }> }) { + if (!active || !payload?.length) return null + const item = payload[0].payload + return ( +
+
+ + {LABELS[item.type] ?? item.type} + + + {item.count.toLocaleString()} + +
+ ) +} + export default function FrustrationTrend({ summary, loading }: FrustrationTrendProps) { if (loading || !summary) return @@ -70,13 +80,14 @@ export default function FrustrationTrend({ summary, loading }: FrustrationTrendP const totalChange = totalPrevious > 0 ? Math.round(((totalCurrent - totalPrevious) / totalPrevious) * 100) : null + const hasPrevious = totalPrevious > 0 const chartData = [ { type: 'rage_clicks', count: summary.rage_clicks, fill: COLORS.rage_clicks }, { type: 'dead_clicks', count: summary.dead_clicks, fill: COLORS.dead_clicks }, { type: 'prev_rage_clicks', count: summary.prev_rage_clicks, fill: COLORS.prev_rage_clicks }, { type: 'prev_dead_clicks', count: summary.prev_dead_clicks, fill: COLORS.prev_dead_clicks }, - ] + ].filter(d => d.count > 0) if (!hasData) { return ( @@ -87,7 +98,7 @@ export default function FrustrationTrend({ summary, loading }: FrustrationTrendP

- Current vs. previous period comparison + Rage vs. dead click breakdown

@@ -97,7 +108,7 @@ export default function FrustrationTrend({ summary, loading }: FrustrationTrendP No trend data yet

- Frustration trend data will appear here once rage clicks or dead clicks are detected across periods. + Frustration trend data will appear here once rage clicks or dead clicks are detected on your site.

@@ -112,7 +123,9 @@ export default function FrustrationTrend({ summary, loading }: FrustrationTrendP

- Rage and dead clicks split across current and previous period + {hasPrevious + ? 'Rage and dead clicks split across current and previous period' + : 'Rage vs. dead click breakdown'}

@@ -121,9 +134,9 @@ export default function FrustrationTrend({ summary, loading }: FrustrationTrendP className="mx-auto aspect-square max-h-[250px]" > - } + content={} />