Skip to content

Listar Livros — Design Técnico

Gerado pelo Writer (Reversa) em 2026-05-11 doc_level: detalhado

Interface

Redux Store

Símbolo Assinatura Retorno Observação
LivrosAction.carregar () ThunkAction Busca todos os livros; armazena via livrosAdapter.setAll
LivrosSelect.allIds (state) number[] 🔴 Bug: retorna state.repertorios.ids em vez de state.livros.ids
LivrosSelect.isCarregando (state) boolean true quando estado for OCIOSO ou CARREGANDO
LivrosSelect.byId (id)(state) EdicaoLivro \| undefined Seletor individual por ID via EntityAdapter

Componentes de UI

Símbolo Props Observação
LivrosScreen AppStackNavigationProps<AppStack.Biblioteca> Screen principal; dispara carregar no useEffect
buildLivroItemList (onItemSelected: OnLivro) Factory HOF que retorna ListRenderItem<number>
LivroListItem {idLivro: number, onItemSelected: OnLivro} Busca livro do store por ID; renderiza ItemList

Fluxo Principal

  1. LivrosScreen monta → useEffect dispara dispatch(LivrosAction.carregar())
  2. LivrosAction.carregar chama LivrosRepository.findAll() → SQL com JOIN livro + editora + edicao_livro
  3. Store recebe lista; livrosAdapter.setAll substitui o estado anterior
  4. LivrosSelect.allIds (bug: retorna repertorios.ids) alimenta FlatList.data
  5. Para cada ID, buildLivroItemList renderiza LivroListItem → busca EdicaoLivro via LivrosSelect.byId(id)
  6. Usuário toca no item → irParaLivro navega para AppStack.Livro com idEdicaoLivro

Fluxos Alternativos

  • Banco vazio (sem livros instalados): findAll retorna []; livrosAdapter.setAll esvazia o estado; FlatList não renderiza itens.
  • Erro no thunk: Estado passa para FALHOU; nenhum handler de UI para este caso — lista fica vazia silenciosamente. 🟡

Dependências

  • LivrosRepository — acesso ao banco SQLite para findAll
  • livrosAdapter (EntityAdapter de @reduxjs/toolkit) — gestão normalizada de EdicaoLivro[]
  • ItemList — componente genérico de linha de lista (reutilizado em múltiplos módulos)
  • AppStackNavigator — roteamento para AppStack.Livro

Decisões de Design Identificadas

Decisão Evidência no código Confiança
FlatList com IDs numéricos e seletor por ID LivrosScreen.tsx + LivroItemList.tsx 🟢
buildLivroItemList como factory para renderItem LivroItemList.tsxbuildLivroItemList 🟢
LivrosView comentada em favor de FlatList raw LivrosScreen.tsx{/* <LivrosView ... /> */} 🟢

Estado Interno

O estado de livros é armazenado no Redux slice livros (EntityAdapter normalizado):

interface LivrosState {
  estado: EstadoRequisicao; // OCIOSO | CARREGANDO | BEM_SUCEDIDO | FALHOU
  ids: EntityId[];
  entities: Record<EntityId, EdicaoLivro>;
}

Riscos e Lacunas

  • 🔴 LivrosSelect.allIds aponta para state.repertorios.ids — a lista de livros exibe IDs de repertórios (bug confirmado no código)
  • 🟡 Estado FALHOU não gera feedback visual ao usuário
  • 🟡 Não há tratamento de estado vazio com mensagem orientativa