Instruction file imported from ejunior95/discordia-front (
.github/instructions/rap-battle.instructions.md). Copyright stays with the author.
Rap Battle (frontend)
Complementa copilot-instructions.md. Foco no hook useRapBattle e no fluxo de áudio.
Fluxo de um verso
- Chama
askGameAction('rap-battle', agent, payload, signal?)com payload contendobattleId,agent,opponent,theme,roundIndexe versos anteriores quando aplicável. - Resposta normaliza
{ response, audio: { musicTaskId?, musicStatus, musicError?, creditsCharged? } }. - Se
audio.musicTaskIdexistir, chamastartMusicPolling(roundIndex, agent, taskId)que usapollRapMusic(src/services/audio.service.ts). - UI mostra estado
loading | success | errordo verso epending | ready | failedda música independentemente.
Persistência
- Storage key única:
RAP_BATTLE_STORAGE_KEY = 'discordia-rap-battle'. - Ao restaurar do storage, sanitize estados: versos com
status: 'loading'devem virarerror(não retomar request abandonada). musicTaskIdsalvo deve dispararstartMusicPollingao montar — a tarefa Sunor continua viva no backend mesmo se o usuário recarregar.- Não salve áudios (URL/blob) localmente além do que já é retornado pelo backend.
Voto
- Voto usa
voteOnRound(roundId, agent)(mesmo endpoint do chat). Não existe endpoint específico de rap-battle. - O
roundIdvem da resposta deaskGameAction. Persista-o por verso para permitir voto após reload.
Aborto
- Sempre passe
AbortSignalparaaskGameActione abrte requests superados (troca de round, reset de batalha). - Polling deve ser parado via função retornada por
pollRapMusicquando o componente desmonta ou a batalha é resetada.
Limites e UX
TOTAL_ROUNDSemrap.constants.tscontrola rounds por batalha; não hard-code o número fora dessa constante.- Música é cobrada pelo backend (
MUSIC_GEN). Mostre erro de crédito (402 INSUFFICIENT_CREDITS) com o toast padrão do Axios — não duplique tratamento. FeatureGateda rota/rap-battleexige capabilitygames. Não relaxe localmente.
Erros comuns
- Recomeçar versos
loadingao montar a partir do storage. - Esquecer
battleIdno payload — quebra a contagem de batalhas em/stats/home. - Acoplar UI da música ao estado do verso (se música falhar, o verso continua válido para voto).
- Criar novo Axios para chamar
pollAndFinalize— useaudio.service.ts.