From 8e42862d20929a2ed3fc187f6aa0349984374258 Mon Sep 17 00:00:00 2001 From: yohlo Date: Wed, 26 Aug 2026 23:19:24 -0700 Subject: [PATCH] fix(telemetry): review nits - dock h2h source corrected to match_dock; badge_viewed breakdown via value - stats filter guards unified, ref-based, double-tap safe - emoji picker reuses handleReactionClick; comment and import tidy --- src/app/routes/_authed/stats.tsx | 7 +++++-- src/features/badges/components/badge-stats-table.tsx | 2 +- src/features/bracket/components/match-dock.tsx | 2 +- src/features/players/components/profile/index.tsx | 6 ++++-- src/features/reactions/components/emoji-bar.tsx | 5 +---- src/features/telemetry/components/usage-screen.tsx | 2 +- src/hooks/use-server-events.ts | 2 -- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/app/routes/_authed/stats.tsx b/src/app/routes/_authed/stats.tsx index 61d0cdf..acbb806 100644 --- a/src/app/routes/_authed/stats.tsx +++ b/src/app/routes/_authed/stats.tsx @@ -1,7 +1,7 @@ import { createFileRoute } from "@tanstack/react-router"; import { playerQueries } from "@/features/players/queries"; import PlayerStatsTable from "@/features/players/components/player-stats-table"; -import { Suspense, useState, useDeferredValue, useEffect } from "react"; +import { Suspense, useState, useDeferredValue, useEffect, useRef } from "react"; import PlayerStatsTableSkeleton from "@/features/players/components/player-stats-table-skeleton"; import { prefetchServerQuery } from "@/lib/tanstack-query/utils/prefetch"; import LeagueHeadToHead from "@/features/players/components/league-head-to-head"; @@ -33,8 +33,11 @@ function Stats() { const isStale = viewType !== deferredViewType; const queryClient = useQueryClient(); + const viewTypeRef = useRef(viewType); const changeViewType = (next: typeof viewType) => { - if (viewType !== next) track("stats_filtered", { value: next }); + if (viewTypeRef.current === next) return; + viewTypeRef.current = next; + track("stats_filtered", { value: next }); setViewType(next); }; diff --git a/src/features/badges/components/badge-stats-table.tsx b/src/features/badges/components/badge-stats-table.tsx index c12a9cc..ea9a368 100644 --- a/src/features/badges/components/badge-stats-table.tsx +++ b/src/features/badges/components/badge-stats-table.tsx @@ -144,7 +144,7 @@ const BadgeStatRow: React.FC = ({ { - track("badge_viewed", { badge: badge.key }); + track("badge_viewed", { value: badge.key }); badgeSheet.open(); }} w='100%' diff --git a/src/features/bracket/components/match-dock.tsx b/src/features/bracket/components/match-dock.tsx index 94271fc..ac76f73 100644 --- a/src/features/bracket/components/match-dock.tsx +++ b/src/features/bracket/components/match-dock.tsx @@ -176,7 +176,7 @@ const MatchDock = ({ match, onClose }: MatchDockProps) => { variant="subtle" size="sm" onClick={() => { - track("h2h_viewed", { source: "match_card" }); + track("h2h_viewed", { source: "match_dock" }); h2hSheet.open(); }} aria-label={t`View head-to-head`} diff --git a/src/features/players/components/profile/index.tsx b/src/features/players/components/profile/index.tsx index b71633a..fe06e26 100644 --- a/src/features/players/components/profile/index.tsx +++ b/src/features/players/components/profile/index.tsx @@ -1,5 +1,5 @@ import { Box, Stack, Text, Divider, Group, Button } from "@mantine/core"; -import { Suspense, useState, useDeferredValue } from "react"; +import { Suspense, useState, useDeferredValue, useRef } from "react"; import { Trans, useLingui } from "@lingui/react/macro"; import { Link } from "@tanstack/react-router"; import Header from "./header"; @@ -21,8 +21,10 @@ const StatsWithFilter = ({ id }: { id: string }) => { const deferredViewType = useDeferredValue(viewType); const isStale = viewType !== deferredViewType; + const viewTypeRef = useRef(viewType); const changeViewType = (next: typeof viewType) => { - if (next === viewType) return; + if (viewTypeRef.current === next) return; + viewTypeRef.current = next; track("stats_filtered", { value: next, source: "profile" }); setViewType(next); }; diff --git a/src/features/reactions/components/emoji-bar.tsx b/src/features/reactions/components/emoji-bar.tsx index 8970b2e..d6f4a45 100644 --- a/src/features/reactions/components/emoji-bar.tsx +++ b/src/features/reactions/components/emoji-bar.tsx @@ -202,10 +202,7 @@ const EmojiBar = ({ { - if (!userReactions.includes(emoji)) track("reaction_sent", { emoji, source }); - toggleReaction.mutate({ data: { matchId, emoji } }); - })} + onSelect={handleReactionClick} userReactions={userReactions} /> diff --git a/src/features/telemetry/components/usage-screen.tsx b/src/features/telemetry/components/usage-screen.tsx index 7a141ba..64dc192 100644 --- a/src/features/telemetry/components/usage-screen.tsx +++ b/src/features/telemetry/components/usage-screen.tsx @@ -9,10 +9,10 @@ import { Text, Title, } from "@mantine/core"; +import { DatePickerInput } from "@mantine/dates"; import { ListSkeleton, StatTileSkeleton } from "@/components/skeletons"; import { useRollupRange } from "../queries"; import type { RollupRow } from "../types"; -import { DatePickerInput } from "@mantine/dates"; import { fillDailySeries, lastNDays, latestValue, listDays, sumByDim } from "../range"; import { BarList, Sparkline, StatTile } from "./charts"; import { DetailSheet } from "./shared"; diff --git a/src/hooks/use-server-events.ts b/src/hooks/use-server-events.ts index f71272d..576be9f 100644 --- a/src/hooks/use-server-events.ts +++ b/src/hooks/use-server-events.ts @@ -165,8 +165,6 @@ export function useServerEvents() { // an expired session rather than a network blip. Try to refresh; if the // session is genuinely gone, stop retrying so we don't hammer the // endpoint forever — a real re-login (or a wake event) will reconnect. - // Cooldown: a flaky stream (proxy idle timeouts) must not turn every - // reconnect into a refresh call. let sessionValid = true; if (Date.now() - lastRefreshAttemptAt > REFRESH_ATTEMPT_COOLDOWN_MS) { lastRefreshAttemptAt = Date.now();