Visualizar Livro — Design Técnico
Gerado pelo Writer (Reversa) em 2026-05-11
doc_level: detalhado
Interface
Redux / Thunks
| Símbolo |
Assinatura |
Retorno |
Observação |
LivrosAction.carregarLivro |
(idLivro: number) |
ThunkAction |
Guard: só executa se livro não está no store |
LivrosSelect.byId |
(id: number)(state) |
EdicaoLivro \| undefined |
Seletor via livrosAdapter.getSelectors().selectById |
Componentes de UI
| Símbolo |
Props |
Observação |
LivroScreen |
AppStackNavigationProps<AppStack.Livro> + route.params.idEdicaoLivro: number |
Screen principal |
LivroHeader |
{livro: EdicaoLivro, irParaLivroDetalhes: () => void} |
Sub-componente local; mostra título e botões de ação |
BuscaMusicasView |
{livro: EdicaoLivro \| undefined} |
View de busca de músicas com filtro por livro |
Fluxo Principal
- Usuário navega de
LivrosScreen → AppStack.Livro com { idEdicaoLivro }
LivroScreen monta → useEffect dispara dispatch(LivrosAction.carregarLivro(idLivro))
- Guard no thunk: se
LivrosSelect.byId(idLivro)(state) !== undefined, o thunk é pulado
- Se o livro não está no store:
LivrosRepository.findById(id) executa → livrosAdapter.addOne adiciona ao store
LivrosSelect.byId(idLivro) retorna EdicaoLivro; LivroHeader é renderizado
BuscaMusicasView recebe livro como prop e filtra músicas por idEdicaoLivro
- Usuário pressiona "Informações" → navega para
AppStack.LivroDetalhes com { idEdicaoLivro }
Fluxos Alternativos
- ID de livro inexistente:
findById retorna undefined → thunk chama rejectWithValue('not found') → livro permanece undefined → header não renderizado; BuscaMusicasView recebe undefined.
- Livro já em cache:
condition retorna false, thunk é cancelado; livro está disponível imediatamente.
- Usuário pressiona "Seções": Botão com
disabled={true} — sem ação.
Dependências
LivrosRepository — findById para busca individual
livrosAdapter (EntityAdapter) — addOne para inserção no store
BuscaMusicasView — renderiza músicas filtradas por livro
AppStackNavigator — rotas AppStack.Livro e AppStack.LivroDetalhes
Decisões de Design Identificadas
| Decisão |
Evidência no código |
Confiança |
Guard de idempotência via condition em carregarLivro |
Livros.action.ts — bloco condition |
🟢 |
Header renderizado condicionalmente (livro && ...) |
LivroScreen.tsx — linha {livro && ...} |
🟢 |
| Botão Seções propositalmente desabilitado (feature futura) |
LivroScreen.tsx — disabled={true} |
🟢 |
Estado Interno
Nenhum estado local além dos selectors Redux. livro é derivado do store via useAppSelector.
Riscos e Lacunas
- 🟡
BuscaMusicasView com livro={undefined} durante carregamento — comportamento não confirmado no código desta view
- 🟡 Não há skeleton/loader no header durante carregamento inicial
- 🔴 Não há handler de erro na UI quando
carregarLivro é rejeitado (livro não encontrado)