Skip to content

fix(frontend): resolve set-state-in-effect in useAnalytics (#1063)#1071

Open
ericsocrat wants to merge 1 commit intomainfrom
chore/react-compiler-use-analytics
Open

fix(frontend): resolve set-state-in-effect in useAnalytics (#1063)#1071
ericsocrat wants to merge 1 commit intomainfrom
chore/react-compiler-use-analytics

Conversation

@ericsocrat
Copy link
Copy Markdown
Owner

Phase 2 of #1063 — third of 19 react-hooks/set-state-in-effect violations.

Change

In useAnalytics, deviceType was held in state but only read inside the fire-and-forget track() callback — it was never rendered. Switched to a useRef so the mount-only initialization no longer triggers react-hooks/set-state-in-effect. Side benefit: the returned track callback is now stable across renders.

Behaviour is unchanged: device type is still detected on mount via detectDeviceType() and passed on every event.

Verification

  • eslint src/hooks/use-analytics.ts — clean
  • vitest run src/hooks/use-analytics.test.tsx — 10/10 pass
  • tsc --noEmit — clean

Progress

deviceType is read only inside the fire-and-forget track() callback and never rendered, so it is more naturally a ref than state. Switching to a ref also makes the returned track() callback stable across renders.
Copilot AI review requested due to automatic review settings May 1, 2026 10:16
@ericsocrat ericsocrat enabled auto-merge (squash) May 1, 2026 10:16
@vercel
Copy link
Copy Markdown

vercel Bot commented May 1, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
tryvit Ready Ready Preview, Comment May 1, 2026 10:18am

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 1, 2026

Bundle Size Report

Metric Value
Main baseline 0 KB
This PR 0 KB
Delta +0 KB (+0%)
JS chunks 0
Hard limit 4000 KB

✅ Bundle size is within acceptable limits.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Removes a react-hooks/set-state-in-effect lint violation in useAnalytics by avoiding state updates for values that are never rendered, keeping analytics tracking behavior the same while improving hook stability.

Changes:

  • Replace deviceType state with a deviceTypeRef, updating it on mount without setState.
  • Make the returned track callback stable across renders by removing the deviceType dependency.
  • Clean up React imports by dropping useState.

ericsocrat added a commit that referenced this pull request May 1, 2026
…) (#1077)

Phase 2 of #1063 -- resolves 2 of 19 violations (running total: 12/19 across 9 PRs).

Two react-hooks/set-state-in-effect warnings in SearchAutocomplete.tsx resolved by adjusting state during render:

1. Refresh recent-searches list on dropdown open: replaced the show-dep useEffect with a prevShow render-phase tracker. Added a lazy initial-state initializer so the list is hydrated on mount when show is already true (preserves existing test contract).

2. Reset activeIndex when suggestions/query change: replaced the multi-dep useEffect with a composite resetKey + prevResetKey render-phase tracker.

Pattern: https://react.dev/learn/you-might-not-need-an-effect#adjusting-some-state-when-a-prop-changes

Behaviour unchanged. 32/32 vitest pass, eslint and tsc clean.

Cross-references: #1067, #1069, #1070, #1071, #1072, #1073, #1074, #1075, #1076.

Co-authored-by: ericsocrat <ericsocrat@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants