146 lines
4.6 KiB
JavaScript
146 lines
4.6 KiB
JavaScript
// --- Carousel State ---
|
|
let allProducts = [];
|
|
let selectedProducts = [];
|
|
let currentIndex = 0;
|
|
|
|
// --- Helpers ---
|
|
const getProductId = (product) => {
|
|
return `${product.skuID}-${product.catNumber}-${product.productNumber}`;
|
|
};
|
|
|
|
// --- Render the three visible items ---
|
|
const renderCarousel = () => {
|
|
const productList = document.getElementById("product-list");
|
|
productList.innerHTML = "";
|
|
|
|
if (selectedProducts.length === 0) return;
|
|
|
|
// Calculate indexes for left, center, right
|
|
const leftIndex = (currentIndex - 1 + selectedProducts.length) % selectedProducts.length;
|
|
const centerIndex = currentIndex;
|
|
const rightIndex = (currentIndex + 1) % selectedProducts.length;
|
|
|
|
const visibleIndexes = [leftIndex, centerIndex, rightIndex];
|
|
|
|
visibleIndexes.forEach((idx, position) => {
|
|
const product = selectedProducts[idx];
|
|
const productId = getProductId(product);
|
|
|
|
const card = document.createElement("div");
|
|
card.className = "product-card";
|
|
if (position === 1) card.classList.add("is-centered");
|
|
|
|
card.dataset.productId = productId;
|
|
card.innerHTML = `
|
|
<img src="../images/_s-thumbs/${product.category}/${product.imageFile}" alt="${product.altText}">
|
|
<h3>${product.productName}</h3>
|
|
<p class="description">${position === 1 ? product.longDescription : product.shortDescription}</p>
|
|
<p>$${product.price}</p>
|
|
<button class="add-to-cart-btn" data-product-id="${productId}">Add to Cart</button>
|
|
`;
|
|
|
|
// Event listeners
|
|
card.querySelector('.add-to-cart-btn')
|
|
.addEventListener('click', () => addToCart(productId, allProducts));
|
|
|
|
card.addEventListener('click', (event) => {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
|
|
if (position === 0) prevProduct(); // left → move backward
|
|
if (position === 2) nextProduct(); // right → move forward
|
|
});
|
|
|
|
productList.appendChild(card);
|
|
});
|
|
};
|
|
|
|
// --- Navigation ---
|
|
const nextProduct = () => {
|
|
currentIndex = (currentIndex + 1) % selectedProducts.length;
|
|
renderCarousel();
|
|
};
|
|
|
|
const prevProduct = () => {
|
|
currentIndex = (currentIndex - 1 + selectedProducts.length) % selectedProducts.length;
|
|
renderCarousel();
|
|
};
|
|
|
|
// --- Category Update ---
|
|
const updateProductList = (category) => {
|
|
const productList = document.getElementById("product-list");
|
|
if (!productList) return console.error("Element with ID 'product-list' not found.");
|
|
|
|
// Remove active class from all buttons
|
|
document.querySelectorAll(".categories ul li").forEach(li => {
|
|
li.classList.remove('active');
|
|
});
|
|
|
|
// Add active class to the button for the current category
|
|
document.querySelectorAll(".cat-btn").forEach(button => {
|
|
const url = new URL(button.href);
|
|
const btnCategory = url.searchParams.get('category');
|
|
if (btnCategory === category) {
|
|
button.parentElement.classList.add('active');
|
|
}
|
|
});
|
|
|
|
selectedProducts = allProducts.filter(product => product.category === category);
|
|
currentIndex = 0;
|
|
|
|
if (selectedProducts.length === 0) {
|
|
console.error(`No products found for category: ${category}`);
|
|
productList.innerHTML = "";
|
|
return;
|
|
}
|
|
|
|
renderCarousel();
|
|
};
|
|
|
|
// --- Cart ---
|
|
const addToCart = (productId, products) => {
|
|
const product = products.find(p => getProductId(p) === productId);
|
|
if (!product) return;
|
|
|
|
let cart = JSON.parse(sessionStorage.getItem('cart')) || [];
|
|
const existing = cart.find(item => getProductId(item) === productId);
|
|
|
|
if (existing) {
|
|
existing.quantity++;
|
|
} else {
|
|
cart.push({ ...product, quantity: 1 });
|
|
}
|
|
|
|
sessionStorage.setItem('cart', JSON.stringify(cart));
|
|
alert(`${product.productName} has been added to your cart!`);
|
|
};
|
|
|
|
// --- Init ---
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
fetch("../data/inventory.json")
|
|
.then(r => r.json())
|
|
.then(products => {
|
|
allProducts = products;
|
|
|
|
const scrollLeftButton = document.getElementById('scroll-left');
|
|
const scrollRightButton = document.getElementById('scroll-right');
|
|
const categoryButtons = document.querySelectorAll(".cat-btn");
|
|
|
|
scrollLeftButton.addEventListener('click', prevProduct);
|
|
scrollRightButton.addEventListener('click', nextProduct);
|
|
|
|
categoryButtons.forEach(button => {
|
|
button.addEventListener('click', (event) => {
|
|
event.preventDefault();
|
|
const url = new URL(button.href);
|
|
const category = url.searchParams.get('category');
|
|
updateProductList(category);
|
|
});
|
|
});
|
|
|
|
const currentUrl = new URL(window.location.href);
|
|
const defaultCategory = currentUrl.searchParams.get('category') || 'trees';
|
|
updateProductList(defaultCategory);
|
|
})
|
|
.catch(err => console.error('Problem fetching products:', err));
|
|
}); |