Skip to content

Visualizar Música — Design Técnico

Gerado pelo Writer (Reversa) em 2026-05-11

Interface

Símbolo Assinatura Retorno
MusicasRepository.findById (id_musica: number) Promise<InformacoesDetalhadasMusica>
carregarMusica (thunk) (id_musica: number) ThunkAction
marcarMusicaComoVisualizada (id_musica: number) ThunkAction (fire-and-forget)

Tipos

InformacoesDetalhadasMusica extends InformacoesBasicasMusica {
  indices: IndiceMusica[]
}

IndiceMusica {
  id_musica: number
  id_edicao_livro: number
  indice: string
  titulo_livro: string
  edicao: string
  editora: string
}

Midias {
  YouTube?: string        // deprecated
  YouTubes?: string[]     // fonte de verdade
  CifraClub?: string
  Partitura?: string
}

Fluxo Principal

  1. Tela recebe id_musica via parâmetro de rota
  2. carregarMusica(id_musica) despachado
  3. Verifica EntityAdapter: se entities[id_musica] existe → resolve imediatamente (cache hit)
  4. Se não: MusicasRepository.findById(id_musica):
    SELECT m.*, cl.indice, cl.ordem, el.edicao, el.ano, l.titulo as titulo_livro, e.nome as editora
    FROM musica m
    LEFT JOIN cantico_livro cl ON cl.id_musica = m.id_musica
    LEFT JOIN edicao_livro el ON el.id_edicao_livro = cl.id_edicao_livro
    LEFT JOIN livro l ON l.id_livro = el.id_livro
    LEFT JOIN editora e ON e.id_editora = el.id_editora
    WHERE m.id_musica = ?
    
  5. Resultado mapeado para InformacoesDetalhadasMusica (agrupamento de linhas por música, múltiplos IndiceMusica)
  6. upsertOne no EntityAdapter
  7. activateKeepAwake() chamado
  8. Side effect (não esperado): marcarMusicaComoVisualizada(id_musica)
  9. Persiste em MusicasFavoritasRepository.marcarAsVisualizada
  10. Adiciona ao repertório id=2 via RepertoriosRepository.addItem
  11. Dispara Metricas.visualizarMusica()
  12. Tela renderiza letra, índices, mídias

Fluxos Alternativos

  • Cache hit: passos 4-6 são pulados; Keep Awake e side effect ainda executam
  • YouTubes[] vazio + YouTube preenchido: montar array [YouTube] para compatibilidade com componente de player
  • Nenhuma mídia disponível: seção de player não é renderizada
  • Sem índices em livros: seção de índices não é renderizada

Dependências

  • Redux EntityAdapter — cache de músicas
  • MusicasFavoritasRepositorymarcarAsVisualizada
  • RepertoriosRepository — adicionar item ao repertório id=2
  • react-native-keep-awakeactivateKeepAwake, deactivateKeepAwake
  • Metricas — evento de visualização
  • Módulo youtube-player — componente de reprodução

Estado Interno

Fatia Redux Campo Ciclo de vida
Musicas entities Persiste durante a sessão; não sobrevive a restart
Musicas status[id] loadingidle após carga; error em falha

Riscos e Lacunas

  • 🔴 Keep Awake: confirmar cleanup em todos os caminhos de saída (back gesture, notification tap, background)
  • 🟡 Músicas de Salmo têm sanitização especial da letra — ponto exato não localizado
  • 🔴 Comportamento ao carregar id_musica inexistente no banco — erro não mapeado