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
LivrosScreen monta → useEffect dispara dispatch(LivrosAction.carregar())
LivrosAction.carregar chama LivrosRepository.findAll() → SQL com JOIN livro + editora + edicao_livro
- Store recebe lista;
livrosAdapter.setAll substitui o estado anterior
LivrosSelect.allIds (bug: retorna repertorios.ids) alimenta FlatList.data
- Para cada ID,
buildLivroItemList renderiza LivroListItem → busca EdicaoLivro via LivrosSelect.byId(id)
- 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.tsx — buildLivroItemList |
🟢 |
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