-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
338 lines (294 loc) · 11.7 KB
/
app.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
///////////////////////////////// VARIABLES
let producto;
let cantidad = 1;
let productos = [];
let precioTotal = 0;
let carrito = [];
if (localStorage.getItem('carrito')) {
carrito = JSON.parse(localStorage.getItem('carrito'));
}
///////////////////////////////// CARGA DE PRODUCTOS
const cargarProductos = async () => {
const respuesta = await fetch("./productos.json");
data = await respuesta.json();
productos = data;
listarProductos(productos);
};
///////////////////////////////// QUERIES SOBRE DOCUMENT
const qProd = document.querySelectorAll(".qProd");
const prodMain = document.querySelector(".prodMain");
const home = document.querySelector(".home");
const contCarrito = document.querySelector(".contCarrito");
const cantidadEnCarrito = document.querySelector(".cantidadEnCarrito");
const h5Total = document.querySelector(".total");
const botonVaciar = document.querySelector(".botonVaciar");
/////////////////////////////////// FUNCIONES
/////// FUNCIÓN FILTRO (nav)
const filtro = (queryCat) => {
const accFilt = productos.filter((el) => {
for (let cat of el.categoria) {
if (cat == queryCat) {
return true
}
}
})
return accFilt
};
/////////////////////////////////// CONTADORES EN TARJETAS
//RESTA
const restQ = (e) => {
const contador = document.querySelector(`#prod${e.id} span`);
let contadorN = parseInt(contador.innerText);
if (contadorN > 1) {
contadorN--;
contador.innerText = `${contadorN}`;
//GUARDADO TEMPORAL DE LA CANTIDAD SELECCIONADA DEL ITEM
sessionStorage.setItem(`'cant-${e.nombre}${e.id}'`, `${contador.innerText}`);
}
};
//SUMA
const sumQ = (e) => {
const contador = document.querySelector(`#prod${e.id} span`);
let contadorN = parseInt(contador.innerText);
contadorN++;
contador.innerText = `${contadorN}`;
//GUARDADO TEMPORAL DE LA CANTIDAD SELECCIONADA DEL ITEM
sessionStorage.setItem(`'cant-${e.nombre}${e.id}'`, `${contador.innerText}`);
};
/////////////////////////////////// RENDERIZADO DEL MAIN
const listarProductos = (arrayFiltrado) => {
prodMain.innerHTML = "";
arrayFiltrado.forEach((e) => {
const creaDiv = document.createElement("div");
//INICIALIZA LA CANTIDAD SELECCIONADA DEL ITEM POR TARJETA
let numItems = 1;
sessionStorage.setItem(`'cant-${e.nombre}${e.id}'`, `${numItems}`);
creaDiv.classList.add("prodMain__elemento", "col", "mb-5");
creaDiv.dataset.aos = 'fade-up'
creaDiv.innerHTML = `
<div id="card${e.id}" class="card h-100">
<img class="card-img-top p-3" src="./assets/${e.img}" alt="${e.nombre}" />
<div class="card-body p-4">
<div id="precio${e.id}" class="text-center">
<h5 class="fw-bolder caps">${e.nombre}</h5>
<span>$${e.precio}</span>
</div>
</div>
<div id="prod${e.id}" class="card-footer p-4 pt-0 border-top-0 bg-transparent text-center d-flex flex-column-reverse flex-sm-row">
<a class="btn btn-outline-dark w-100">
<i class="bi-cart-fill me-1">
</i><p class="m-auto">Agregar al <br>
carrito</p></a>
<div class="d-flex flex-row-reverse mb-2 mb-sm-auto flex-sm-column botonesQ justify-content-evenly">
<button class="cantidad mas btn btn-outline-dark rounded-pill">+</button>
<span class="badge bg-dark text-white rounded-pill my-0 mx-1 px-3 my-sm-1 mx-sm-0 px-sm-0">${numItems}</span>
<button class="cantidad menos btn btn-outline-dark rounded-pill">-</button>
</div>
</div>
</div>
`;
prodMain.append(creaDiv);
//AGREGADOS DE ESTILO Y MODIFICACION DE PRECIO EN CASO DE PRODUCTO EN OFERTA
if (e.categoria.find((cat) => cat == "oferta")) {
const divCard = document.querySelector(`#card${e.id}`)
const etiqOferta = document.createElement('div')
etiqOferta.className = "badge bg-dark text-white position-absolute"
etiqOferta.style.right = "0.7rem";
etiqOferta.style.top = "0.7rem"
etiqOferta.innerText = "Oferta"
const porcentaje = (100 - ((100 / e.precio) * e.pOferta)).toFixed(2)
divCard.append(etiqOferta)
const divPrecio = document.querySelector(`#precio${e.id}`)
divPrecio.innerHTML = `
<h5 class="fw-bolder caps">${e.nombre}</h5>
<small class="text-muted text-decoration-line-through">$${e.precio}</small>
<small class="text-success"> -${porcentaje}%</small><br/>
<span>$${e.pOferta}</span>`
}
const botonAgregar = document.querySelector(`#prod${e.id} a`);
botonAgregar.addEventListener("click", () => {
agregarAlCarrito(e);
//RESETEA CONTADOR AL AGREGAR A CARRITO
const contador = document.querySelector(`#prod${e.id} span`);
contador.innerText = 1;
});
//EVENTOS PARA LLAMAR A LAS FUNCIONES DE MODIFICACION DE NUMERO DE PRODUCTOS A AGREGAR
const botonMas = document.querySelector(`#prod${e.id} .mas`);
botonMas.addEventListener("click", () => sumQ(e));
const botonMenos = document.querySelector(`#prod${e.id} .menos`);
botonMenos.addEventListener("click", () => restQ(e));
});
};
////////////////////////////// CARRITO
//// TOTAL CARRITO
const funcTotal = () => {
const pTotal = carrito.reduce((acc, carr) => acc + carr.precio * carr.cantidad, 0);
h5Total.innerText = `$${pTotal}`;
return pTotal;
};
//// ACTUALIZAZIÓN DEL CARRITO - AGREGA, ELIMINA INDIVIDUALMENTE Y VACÍA CARRITO
const actualizarCarrito = () => {
localStorage.setItem('carrito', JSON.stringify(carrito))
contCarrito.innerHTML = "";
if (carrito.length == 0) {
//SI EL ARRAY CARRITO ESTÁ VACÍO APARECE ESTE MENSAJE
contCarrito.innerHTML = `<p class="caps nomProd my-4 fs-5">Carrito vacío</p>`;
} else {
carrito.forEach((prod, i) => {
const li = document.createElement("li");
// li.className = "d-flex flex-row align-items-center justify-content-between";
li.className = "row align-items-center"
li.innerHTML = `
<span class="caps nomProd col-5 col-sm-6">${prod.nombre}</span>
<span class="fst-italic col col-sm-2">${prod.cantidad} u.</span>
<strong class="col-3 col-sm">$${prod.precio*prod.cantidad}</strong>
<button id="carr${i}" class="btn text-danger col-1"><i class="bi bi-x-circle"></i></button>
`;
contCarrito.append(li);
//BOTON ELIMINAR DEL CARRITO
const botonEliminar = document.querySelector(`#carr${i}`);
botonEliminar.addEventListener("click", () => {
eliminarDelCarrito(i);
});
});
}
//FIJA CANTIDAD ITEMS DIFERENTES EN CARRITO EN EL CONTADOR QUE SE MUESTRA EN BOTON CARRITO
cantidadEnCarrito.innerText = carrito.length;
//EL PRECIO TOTAL ES EL PRECIO DEL PRODUCTO POR LA VARIABLE CANTIDAD DEL OBJ EN CARRITO
precioTotal = funcTotal();
};
////// FUNCIÓN AGREGAR AL CARRITO
const agregarAlCarrito = (el) => {
//TOMA DE VARIABLE DEL CONTADOR ALMACENADA EN SESSION
const cantidad = parseInt(
sessionStorage.getItem(`'cant-${el.nombre}${el.id}'`)
);
//TOAST
Toastify({
text: `Agregó: \n ${el.nombre} por ${cantidad} u.`,
duration: 900,
stopOnFocus: false,
style: {
"text-transform": "capitalize",
padding: "1em",
background: "#212121",
border: "3px solid #f44336",
"border-radius": ".4em",
color: "#fff",
},
}).showToast();
//BUSCA SI EL ITEM A AGREGAR ESTA YA EN CARRITO
let yaEnCarrito = carrito.find((item) => item.id === el.id);
//SUMA POR CADA UNIDAD QUE SE AGREGUE, CUANDO EL ITEM YA ESTA EN EL CARRITO
if (yaEnCarrito) {
yaEnCarrito.cantidad += cantidad;
} else {
//EVALUA SI EL PRODUCTO ESTÁ EN OFERTA Y LO ENVIA A CARRITO CON PRECIO DE OFERTA O REGULAR
let {
id,
nombre,
precio,
pOferta,
img
} = productos.find((item) => item.id === el.id);
if (el.categoria.find((cat) => cat == "oferta")) {
carrito.push({
id: id,
nombre: nombre,
precio: pOferta,
img: img,
//SE TOMA LA CANTIDAD GUARDADA EN CONTADOR COMO VALOR INICIAL DE CANTIDAD EN CARRITO
cantidad: cantidad,
});
} else {
carrito.push({
id: id,
nombre: nombre,
precio: precio,
img: img,
cantidad: cantidad,
});
};
}
actualizarCarrito();
//RESET DE LA VARIABLE CANTIDAD EN SESSION STORAGE
sessionStorage.setItem(`'cant-${el.nombre}${el.id}'`, 1);
};
//
const eliminarDelCarrito = (i) => {
carrito.splice(i, 1);
actualizarCarrito();
};
botonVaciar.addEventListener("click", () => {
if (carrito.length == 0) {
Toastify({
text: `El carrito ya está vacío`,
position: "left",
duration: 3000,
stopOnFocus: false,
style: {
padding: "1em",
background: "#212121",
border: "3px solid #f44336",
"border-radius": ".4em",
color: "#fff",
},
}).showToast();
} else {
carrito.length = 0;
actualizarCarrito();
contCarrito.innerHTML = `<p class="caps nomProd my-4 fs-5">Carrito vacío</p>`;
Toastify({
text: `Se vació el carrito`,
position: "left",
duration: 3000,
stopOnFocus: false,
style: {
padding: "1em",
background: "#212121",
border: "3px solid #f44336",
"border-radius": ".4em",
color: "#fff",
},
}).showToast();
}
});
////////////// EVENTOS FILTRA BUSQUEDA
qProd.forEach((opcion) =>
opcion.addEventListener("click", () => {
if (opcion.className.includes("barra")) {
const filtrado = filtro("barra");
listarProductos(filtrado);
} else if (opcion.className.includes("disco")) {
const filtrado = filtro("disco");
listarProductos(filtrado);
} else if (opcion.className.includes("mancuerna")) {
const filtrado = filtro("mancuerna");
listarProductos(filtrado);
} else if (opcion.className.includes("accesorio")) {
const filtrado = filtro("accesorio");
listarProductos(filtrado);
} else if (opcion.className.includes("oferta")) {
const filtrado = filtro("oferta");
listarProductos(filtrado);
}
})
);
////////////////////////////////////////// BOTON TO TOP
//MUESTRA BOTON AL SCROLLEAR
const showButton = () => {
if (document.documentElement.scrollTop > 50) {
toTopButton.style.display = "block";
} else {
toTopButton.style.display = "none";
}
}
const toTopButton = document.querySelector("#toTop");
window.onscroll = () => showButton();
//VUELVE AL COMIENZO DE LA PÁGINA
toTopButton.addEventListener('click', () => document.documentElement.scrollTop = 0)
//////////////////////////////////////////////////////////////
//LLAMADO INICIAL DE CARGAR Y LISTAR PRODUCTOS
cargarProductos();
//LLAMADO INICIAL DE LISTAR PRODUCTOS EN CARRITO
actualizarCarrito();