Skip to content

Ver Detalhes do 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 no store
LivrosSelect.byId (id: number)(state) EdicaoLivro \| undefined Seletor por ID via EntityAdapter

Componentes de UI

Símbolo Props Observação
LivroDetalhesScreen AppStackNavigationProps<AppStack.LivroDetalhes> + route.params.idEdicaoLivro: number Screen de detalhes

Utilitários

Símbolo Assinatura Retorno Observação
openLink (url: string) void Abre URL externa via Linking.openURL

Fluxo Principal

  1. Usuário navega de LivroScreenAppStack.LivroDetalhes com { idEdicaoLivro }
  2. LivroDetalhesScreen monta → useEffect dispara dispatch(LivrosAction.carregarLivro(idLivro))
  3. Guard no thunk: se livro já no store, thunk é cancelado
  4. LivrosSelect.byId(idLivro) retorna EdicaoLivro
  5. comprarVersao = () => livro?.site && openLink(livro.site) é construída
  6. hasSite = livro?.site !== null && livro?.site !== undefined determina estado do botão
  7. Tela renderiza título, subtítulo (edição, ano, editora), descrição, mensagem de incentivo e botão

Fluxos Alternativos

  • livro ainda não disponível: campos exibem strings vazias via livro?.titulo ?? ''; botão desabilitado
  • site nulo: hasSite = false → botão com disabled={true}; comprarVersao não é invocada
  • Link externo aberto: openLink usa Linking.openURL — pode falhar silenciosamente se o SO não conseguir abrir o URL

Dependências

  • LivrosRepository.findById — busca individual do livro
  • LivrosAction.carregarLivro — thunk com guard
  • openLink — utilitário de src/arch/util/linking.ts
  • Botao — componente base de botão com suporte a disabled

Decisões de Design Identificadas

Decisão Evidência no código Confiança
Strings vazias como fallback para campos de livro LivroDetalhesScreen.tsx?? '' em todo lugar 🟢
hasSite avalia null E undefined separadamente livro?.site !== null && livro?.site !== undefined 🟢
Mensagem de incentivo hardcoded (não configurável) LivroDetalhesScreen.tsx — texto fixo na tela 🟢

Estado Interno

Nenhum estado local. Dados derivados do store via useAppSelector.

Riscos e Lacunas

  • 🟡 openLink não valida o schema da URL — um site com valor malformado poderia causar erro silencioso
  • 🟡 Durante carregamento, tela exibe campos vazios sem indicação visual de loading
  • 🟡 Sem tratamento explícito do caso em que carregarLivro é rejeitado (livro não encontrado no banco)