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
- Tela recebe
id_musica via parâmetro de rota
carregarMusica(id_musica) despachado
- Verifica EntityAdapter: se
entities[id_musica] existe → resolve imediatamente (cache hit)
- 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 = ?
- Resultado mapeado para
InformacoesDetalhadasMusica (agrupamento de linhas por música, múltiplos IndiceMusica)
upsertOne no EntityAdapter
activateKeepAwake() chamado
- Side effect (não esperado):
marcarMusicaComoVisualizada(id_musica)
- Persiste em
MusicasFavoritasRepository.marcarAsVisualizada
- Adiciona ao repertório id=2 via
RepertoriosRepository.addItem
- Dispara
Metricas.visualizarMusica()
- 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
MusicasFavoritasRepository — marcarAsVisualizada
RepertoriosRepository — adicionar item ao repertório id=2
react-native-keep-awake — activateKeepAwake, 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] |
loading → idle 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