Skip to content

fix(ui): primeira sala nasce no Fácil e lembra a última dificuldade - #21

Merged
caioross merged 1 commit into
mainfrom
auto/issue-16-easy-default
Jul 12, 2026
Merged

fix(ui): primeira sala nasce no Fácil e lembra a última dificuldade#21
caioross merged 1 commit into
mainfrom
auto/issue-16-easy-default

Conversation

@caioross

Copy link
Copy Markdown
Owner

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/reduce logo na primeira partida — o oposto de "dificuldade fácil generosa" que docs/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:

  • Estado inicial → "easy" (SSR-safe e determinístico): a primeira criação de sala nasce no Fácil.
  • useEffect recupera a última dificuldade escolhida de localStorage ("coderacer:difficulty", validada por type guard isDifficulty): quem já criou salas mantém sua preferência (last-used) e não regride.
  • handleCreate persiste a dificuldade após criar a sala (mesmo padrão do PERSIST_NAME_KEY já existente; try/catch como 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

  • Primeira criação (sem histórico) → dificuldade pré-selecionada é Fácil.
  • Quem já criou salas mantém seu last-used.
  • Nenhuma mudança no pool de snippets nem na lógica da corrida.
  • pnpm typecheck + pnpm build verdes.

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 ✓
  • lint: N/A (repo sem config ESLint; CI não roda lint)

Riscos

Baixo. Mudança confinada ao estado inicial de um seletor + persistência local (localStorage, com type guard e try/catch). useEffect no 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

)

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
@vercel

vercel Bot commented Jul 10, 2026

Copy link
Copy Markdown

@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:

  • Make your repository public. Collaboration is free for open source and public repositories.
  • Upgrade to pro and add @caioross as a member. A Pro subscription is required to access Vercel's collaborative features.
    • If you're the owner of the team, click here to upgrade and add @caioross as a member.
    • If you're the user who initiated this build request, click here to request access.
    • If you're already a member of the caioross' projects team, make sure that your Vercel account is connected to your GitHub account.

To read more about collaboration on Vercel, click here.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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.

@caioross

Copy link
Copy Markdown
Owner Author

Parecer PR Doctor — APROVADO (normal §7.3) ✅

Revisei o diff inteiro. Mudança mínima e cirúrgica em HomeView.tsx, exatamente na fatia que a issue #16 pede:

  • Estado inicial → "easy": primeira sala nasce no Fácil (§0.3). SSR-safe — servidor e primeiro render do cliente renderizam "easy", então não há hydration mismatch; o useEffect só ajusta pós-mount.
  • last-used via localStorage com type guard isDifficulty + try/catch (mesmo padrão do PERSIST_NAME_KEY já no arquivo). Quem já criou salas mantém a preferência.
  • Zero mudança no pool de snippets ou na lógica da corrida; área sagrada (latência de input) intocada.

Gate: CI Install, typecheck & build ✅ verde no SHA 47acc38. O check da Vercel (vermelho) é a condição de infra pré-existente "Git author must have access to the project" — idêntica em todas as PRs, não é regressão de código (CI do repo = typecheck+build, HANDBOOK §11).

Closes #16 correto (resolve a issue inteira). Squash-merge.

@caioross
caioross merged commit 239b958 into main Jul 12, 2026
2 of 3 checks passed
@caioross
caioross deleted the auto/issue-16-easy-default branch July 12, 2026 12:07
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.

Onboarding: dificuldade nasce em "Médio" e atropela o Iniciante — primeira sala deveria nascer no Fácil (§0.3)

1 participant