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
- Usuário navega de
LivroScreen → AppStack.LivroDetalhes com { idEdicaoLivro }
LivroDetalhesScreen monta → useEffect dispara dispatch(LivrosAction.carregarLivro(idLivro))
- Guard no thunk: se livro já no store, thunk é cancelado
LivrosSelect.byId(idLivro) retorna EdicaoLivro
comprarVersao = () => livro?.site && openLink(livro.site) é construída
hasSite = livro?.site !== null && livro?.site !== undefined determina estado do botão
- 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)