fix(ui): primeira sala nasce no Fácil e lembra a última dificuldade - #21
Conversation
) O seletor de dificuldade da criação de sala nascia em "medium", empurrando o Iniciante para um snippet complexo logo na primeira partida — o oposto do que docs/UI-AAA-OVERHAUL.md §0.3 promete para a persona. - Estado inicial passa a ser "easy" (SSR-safe, determinístico): a primeira sala do jogador nasce no Fácil. - useEffect recupera a última dificuldade escolhida de localStorage ("coderacer:difficulty", validada por type guard): quem já criou salas mantém sua preferência (last-used). - handleCreate persiste a dificuldade após criar a sala. Sem mudança no pool de snippets nem na lógica da corrida — só o estado do seletor. Mesmo padrão do PERSIST_NAME_KEY já existente. Closes #16
|
@caioross is attempting to deploy a commit to the caioross' projects team on Vercel, but is not a member of this team. To resolve this issue, you can:
To read more about collaboration on Vercel, click here. |
There was a problem hiding this comment.
Code Review
This pull request introduces persistence for the last selected game difficulty in the HomeView component. It updates the default difficulty state to 'easy', retrieves the previously saved difficulty from localStorage on component mount using a type guard for validation, and saves the chosen difficulty to localStorage upon successful room creation. There are no review comments, and the implementation looks solid, so I have no additional feedback to provide.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
Parecer PR Doctor — APROVADO (normal §7.3) ✅Revisei o diff inteiro. Mudança mínima e cirúrgica em
Gate: CI
|
Contexto
Feedback da persona O Iniciante (Discussion #14): jogou a produção e caiu no Médio sem querer. O seletor de dificuldade da criação de sala nascia em
useState<Difficulty>("medium"), empurrando quem está começando para um snippet de ~10 linhas com recursão/reducelogo na primeira partida — o oposto de "dificuldade fácil generosa" quedocs/UI-AAA-OVERHAUL.md§0.3 lista como o que conquista essa persona.O que mudou (escopo mínimo — só o estado do seletor)
src/components/HomeView.tsx:"easy"(SSR-safe e determinístico): a primeira criação de sala nasce no Fácil.localStorage("coderacer:difficulty", validada por type guardisDifficulty): quem já criou salas mantém sua preferência (last-used) e não regride.handleCreatepersiste a dificuldade após criar a sala (mesmo padrão doPERSIST_NAME_KEYjá existente;try/catchcomo o resto do arquivo).Sem alteração no pool de snippets nem na lógica da corrida. Os descritivos do modal (que a persona elogiou) ficam intactos.
Acceptance criteria
pnpm typecheck+pnpm buildverdes.Validação (gate §6, resultado real)
pnpm typecheck✓pnpm build✓node scripts/validate-persistence.mjs→ 33/33 ✓node .claude/skills/cr-typing-engine/scripts/validate-metrics.mjs→ 24/24 ✓Riscos
Baixo. Mudança confinada ao estado inicial de um seletor + persistência local (
localStorage, com type guard etry/catch).useEffectno cliente não altera a marcação renderizada no servidor → sem risco de hydration mismatch. Área sagrada (latência de input na corrida) intocada.Classificação HANDBOOK §7.3 (normal). Sem parecer do Conselho nesta issue — segui os acceptance criteria e a dica de abordagem do Curador.
Closes #16