281 lines
8.1 KiB
JavaScript
Executable File
281 lines
8.1 KiB
JavaScript
Executable File
class Cesta {
|
||
/**
|
||
* Returns the object from local storage
|
||
*/
|
||
static getFromLocalStorage() {
|
||
if (!localStorage.getItem('cesta')) localStorage.setItem('cesta', '{}');
|
||
return JSON.parse(localStorage.getItem('cesta'));
|
||
}
|
||
|
||
/**
|
||
* Adds 1 unit of the product
|
||
* @param productID
|
||
* @param varID
|
||
*/
|
||
static add(productID, varID = 0, showAlert = false) {
|
||
const products = Cesta.getFromLocalStorage();
|
||
if (products[productID]) {
|
||
if (products[productID][varID]) {
|
||
products[productID][varID]++;
|
||
}
|
||
else {
|
||
products[productID][varID] = 1;
|
||
}
|
||
}
|
||
else {
|
||
products[productID] = {};
|
||
products[productID][varID] = 1;
|
||
}
|
||
Cesta.save(products);
|
||
Cesta.updateBadge();
|
||
if (showAlert) {
|
||
swal(TEXTOS_CESTA.productoAnadido, TEXTOS_CESTA.textoProductoAnadido, 'success',{
|
||
buttons: {
|
||
cancel: TEXTOS_CESTA.cancel,
|
||
ok: {
|
||
text: TEXTOS_CESTA.ok,
|
||
value: 'ok'
|
||
}
|
||
}
|
||
})
|
||
.then((value) => {
|
||
if (value === 'ok') {
|
||
window.location.href = ENLACE_CESTA;
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Substracts 1 unit of the product
|
||
* @param productID
|
||
*/
|
||
static substract(productID) {
|
||
const products = Cesta.getFromLocalStorage();
|
||
if (products[productID]) {
|
||
products[productID].quantity--;
|
||
if (products[productID].quantity === 0) {
|
||
delete products[productID];
|
||
}
|
||
}
|
||
Cesta.save(products);
|
||
Cesta.updateBadge();
|
||
}
|
||
|
||
static setQuantity(productID, varID = 0, quantity = 1) {
|
||
let products = Cesta.getFromLocalStorage();
|
||
if (!products[productID] || !products[productID][varID]) {
|
||
Cesta.add(productID, varID, false);
|
||
products = Cesta.getFromLocalStorage();
|
||
}
|
||
products[productID][varID] = Math.max(quantity, 1);
|
||
Cesta.save(products);
|
||
Cesta.updateBadge();
|
||
}
|
||
|
||
/**
|
||
* Removes a product from the basket
|
||
* @param productID
|
||
*/
|
||
static remove(productID) {
|
||
const products = Cesta.getFromLocalStorage();
|
||
delete products[productID];
|
||
console.log(productID, products);
|
||
Cesta.save(products);
|
||
Cesta.updateBadge();
|
||
}
|
||
|
||
/**
|
||
* Clears the basket
|
||
*/
|
||
static clear() {
|
||
Cesta.save({});
|
||
Cesta.updateBadge();
|
||
}
|
||
|
||
/**
|
||
* Saves the new object to the local storage
|
||
* @param products
|
||
*/
|
||
static save(products) {
|
||
localStorage.setItem('cesta', JSON.stringify(products));
|
||
}
|
||
|
||
|
||
/**
|
||
* Returns a promise with the products from the server
|
||
*/
|
||
static getProducts(sessID = '') {
|
||
const timestamp = (new Date()).getTime();
|
||
const products = Cesta.getFromLocalStorage();
|
||
let gastosDeEnvio = document.querySelector('select[name=gastos_de_envio]');
|
||
if (gastosDeEnvio) {
|
||
gastosDeEnvio = gastosDeEnvio.value;
|
||
}
|
||
else {
|
||
gastosDeEnvio = 0;
|
||
}
|
||
|
||
let codigoDescuento = document.querySelector('#cesta .descuento input');
|
||
if (codigoDescuento) {
|
||
codigoDescuento = codigoDescuento.value;
|
||
}
|
||
else {
|
||
codigoDescuento = '';
|
||
}
|
||
|
||
return fetch(`${RUTA_RAIZ}/cesta.php?getProducts=1&cesta=${JSON.stringify(products)}&gastos=${gastosDeEnvio}&codigo=${codigoDescuento}×tamp=${timestamp}&sessID=${sessID}`)
|
||
.then((data) => {
|
||
return data.json();
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Looks for all the "Añadir a la cesta" buttons and bind them to add a product
|
||
*/
|
||
static bindNodes() {
|
||
const nodes = document.querySelectorAll('.add-to-basket');
|
||
if (nodes) {
|
||
nodes.forEach(function(node) {
|
||
node.removeEventListener('click', Cesta.bindNode);
|
||
node.addEventListener('click', Cesta.bindNode);
|
||
});
|
||
}
|
||
}
|
||
|
||
static bindNode(e) {
|
||
const node = this;
|
||
const productID = parseInt(node.getAttribute('data-producto'));
|
||
const varID = parseInt(node.getAttribute('data-variacion'));
|
||
Cesta.add(productID, varID, true);
|
||
}
|
||
|
||
static updateBadge() {
|
||
let count = 0;
|
||
const products = Cesta.getFromLocalStorage();
|
||
for (const key in products) {
|
||
for (const v in products[key]) {
|
||
count += products[key][v];
|
||
}
|
||
}
|
||
let badges = document.querySelectorAll('.cesta-count');
|
||
if (badges) {
|
||
badges.forEach(function(badge) {
|
||
badge.innerHTML = `(${count})`;
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
class Favorites {
|
||
static getFromLocalStorage() {
|
||
if (!localStorage.getItem('favoritos')) localStorage.setItem('favoritos', '{}');
|
||
return JSON.parse(localStorage.getItem('favoritos'));
|
||
}
|
||
|
||
/**
|
||
* Saves the new object to the local storage
|
||
* @param products
|
||
*/
|
||
static save(products) {
|
||
localStorage.setItem('favoritos', JSON.stringify(products));
|
||
}
|
||
|
||
/**
|
||
* Adds or removes from the local storage
|
||
*/
|
||
static toggle(productID, node = null) {
|
||
const products = Favorites.getFromLocalStorage();
|
||
if (products[productID]) {
|
||
delete products[productID];
|
||
Favorites.changeClass(node, false);
|
||
}
|
||
else {
|
||
products[productID] = true;
|
||
Favorites.changeClass(node, true);
|
||
}
|
||
Favorites.save(products);
|
||
Favorites.updateBadge();
|
||
}
|
||
|
||
/**
|
||
* Returns if the product is favorite or not
|
||
*/
|
||
static isFavorite(productID) {
|
||
const products = Favorites.getFromLocalStorage();
|
||
return products[productID] ? true : false;
|
||
}
|
||
|
||
/**
|
||
* Updates the class of all the buttons of the same product
|
||
*/
|
||
static changeClass(node, active = true) {
|
||
if (!node) return;
|
||
if (active) {
|
||
node.classList.add('active');
|
||
node.querySelector('i').classList.remove('fa-heart-o');
|
||
node.querySelector('i').classList.add('fa-heart');
|
||
}
|
||
else {
|
||
node.classList.remove('active');
|
||
node.querySelector('i').classList.remove('fa-heart');
|
||
node.querySelector('i').classList.add('fa-heart-o');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Returns a promise with the products from the server
|
||
*/
|
||
static getProducts() {
|
||
const products = Favorites.getFromLocalStorage();
|
||
|
||
return fetch(`${RUTA_RAIZ}/favoritos.php?getProducts=1&favoritos=${JSON.stringify(products)}`)
|
||
.then((data) => {
|
||
return data.json();
|
||
});
|
||
}
|
||
|
||
|
||
/**
|
||
* Looks for all the "Añadir a la cesta" buttons and bind them to add a product
|
||
*/
|
||
static bindNodes() {
|
||
const nodes = document.querySelectorAll('.add-to-favorites');
|
||
if (nodes) {
|
||
nodes.forEach(function(node) {
|
||
const productID = node.getAttribute('data-producto');
|
||
Favorites.changeClass(node, Favorites.isFavorite(productID));
|
||
node.removeEventListener('click', Favorites.bindNode);
|
||
node.addEventListener('click', Favorites.bindNode);
|
||
});
|
||
}
|
||
Favorites.updateBadge();
|
||
}
|
||
|
||
static bindNode(e) {
|
||
let node = this;
|
||
while (node && !node.classList.contains('add-to-favorites')) {
|
||
node = node.parentNode;
|
||
}
|
||
|
||
if (!node) return;
|
||
|
||
const productID = parseInt(node.getAttribute('data-producto'));
|
||
Favorites.toggle(productID, node);
|
||
}
|
||
|
||
static updateBadge() {
|
||
let count = 0;
|
||
const products = Favorites.getFromLocalStorage();
|
||
for (const key in products) {
|
||
count++;
|
||
}
|
||
let badges = document.querySelectorAll('.favoritos-count');
|
||
if (badges) {
|
||
badges.forEach(function(badge) {
|
||
badge.innerHTML = `(${count})`;
|
||
});
|
||
}
|
||
}
|
||
}
|