-
Notifications
You must be signed in to change notification settings - Fork 4
/
pesquisa.js
121 lines (92 loc) · 3.39 KB
/
pesquisa.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
let resultados
document.addEventListener('DOMContentLoaded', function () {
const form = document.querySelector('form')
form.addEventListener('submit', pesquisaEExibicao)
const areaResultados = document.getElementById('resultados')
async function pesquisaEExibicao(e) {
console.log(e)
e.preventDefault()
const dadosForm = new FormData(form)
const termo = encodeURIComponent(dadosForm.get('pesquisa'))
resultados = new Resultados(termo, areaResultados)
resultados.termo
resultados.areaResultados
await resultados.requisicao()
resultados.exibirResultados()
}
})
class Resultados {
constructor(termo, areaResultados) {
this.URL_PESQUISA = 'http://openlibrary.org/search.json'
this.URL_CAPAS = 'http://covers.openlibrary.org/b/ID/'
this.termo = termo
this.total = 0
this.areaResultados = areaResultados
this.listagemResultados = []
}
async requisicao(page = 1) {
const resp = await fetch(this.URL_PESQUISA + '?q=' + this.termo + '&page=' + page) // GET
const dados = await tratarResposta(resp)
await this._tratarDados(dados)
function tratarResposta(resp) {
if (resp.ok) {
return resp.json()
}
throw new Error("O servidor respondeu com erro!")
}
}
_tratarDados(dados) {
this.total = dados.numFound
this.listagemResultados = dados.docs
}
exibirResultados(quantidade = 10, pagina = 0 ) {
this.numPaginas = Math.ceil(this.listagemResultados.length / 10)
this.paginaAtual = pagina
const listagem = this.listagemResultados.slice(
pagina * quantidade, pagina * quantidade + quantidade
)
this.areaResultados.innerHTML = ""
listagem.forEach(resultado => {
const urlCapa = this._obterURLCapa(resultado)
const card = criarCardLivro(resultado.title, urlCapa)
this.areaResultados.append(card)
})
this._exibirLinksPaginas()
}
_obterURLCapa(resultado) {
const tamanho = 'L' // S, M, L
return `${this.URL_CAPAS}${resultado.cover_i}-${tamanho}.jpg`
}
_exibirLinksPaginas() {
const linksContainer = document.querySelector('#links-paginas')
linksContainer.innerHTML = ""
for (let i=0; i < this.numPaginas; i++) {
const btn = document.createElement('button')
btn.classList.add('btn', 'btn-primary')
btn.textContent = i+1
// btn.dataset.numPagina = i.toString()
btn.onclick = () => { this.exibirResultados(this.numPaginas, i) }
if (this.paginaAtual === i) {
btn.disabled = true
}
linksContainer.append(btn)
}
}
}
function criarCardLivro(titulo, capa) {
const card = document.createElement('div')
card.classList.add('card')
card.style.width = '10rem'
const img = document.createElement('img')
img.src = capa;
img.classList.add('card-img-top')
const cardBody = document.createElement('div')
cardBody.classList.add('card-body')
const tituloEl = document.createElement('h3')
tituloEl.textContent = titulo
tituloEl.classList.add('card-title')
cardBody.appendChild(tituloEl)
card.append(img, cardBody)
// console.log(card)
return card
}