Skip to content

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

  1. Usuário navega de LivrosScreenAppStack.Livro com { idEdicaoLivro }
  2. LivroScreen monta → useEffect dispara dispatch(LivrosAction.carregarLivro(idLivro))
  3. Guard no thunk: se LivrosSelect.byId(idLivro)(state) !== undefined, o thunk é pulado
  4. Se o livro não está no store: LivrosRepository.findById(id) executa → livrosAdapter.addOne adiciona ao store
  5. LivrosSelect.byId(idLivro) retorna EdicaoLivro; LivroHeader é renderizado
  6. BuscaMusicasView recebe livro como prop e filtra músicas por idEdicaoLivro
  7. 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

  • LivrosRepositoryfindById 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.tsxdisabled={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)