Athenaeum/static/js/cart.js
2025-05-30 15:40:23 +02:00

233 lines
8.9 KiB
JavaScript

document.addEventListener('DOMContentLoaded', async () => {
try {
const token = localStorage.getItem('token');
if (!token) {
window.location.href = '/login.html';
return;
}
const response = await fetch('/api/cart', {
headers: {
'Authorization': `Bearer ${token}`
}
});
if (!response.ok) throw new Error('Błąd ładowania koszyka');
const cartItems = await response.json();
const container = document.getElementById('cart-items');
container.innerHTML = '';
if (cartItems.length === 0) {
container.innerHTML = '<p class="text-center">Twój koszyk jest pusty</p>';
return;
}
let totalCartValue = 0;
cartItems.forEach(item => {
// Formatowanie cen
const price = parseFloat(item.cena);
const formattedPrice = price.toFixed(2);
const itemTotal = price * item.quantity;
const formattedTotal = itemTotal.toFixed(2);
totalCartValue += itemTotal;
const itemHTML = `
<div class="col-12 mb-4 cart-item">
<div class="card dark-card">
<div class="row g-0">
<div class="col-md-4 text-center p-3 cart-item-image">
<img src="${item.obraz_url}"
class="img-fluid rounded"
alt="${item.tytul}"
style="max-height: 200px;">
</div>
<div class="col-md-8 cart-item-details">
<div class="card-body h-100 d-flex flex-column">
<div>
<h5 class="card-title cart-item-title">${item.tytul}</h5>
<p class="card-text cart-item-author">${item.autor}</p>
</div>
<div class="d-flex flex-wrap gap-3 mb-2 cart-item-info mt-auto">
<div class="d-flex flex-column flex-grow-1">
<span class="fw-bold cart-item-price">Cena jednostkowa</span>
<span class="fs-5">${formattedPrice} PLN</span>
</div>
<div class="d-flex flex-column">
<span class="fw-bold">Ilość</span>
<div class="d-flex align-items-center gap-2">
<span class="fs-5 badge bg-dark rounded-pill">${item.quantity}</span>
</div>
</div>
<div class="d-flex flex-column">
<span class="fw-bold cart-item-total">Suma</span>
<span class="fs-5 text-warning">${formattedTotal} PLN</span>
</div>
</div>
<div class="mt-3">
<div class="btn-group w-100" role="group">
<button class="btn btn-sm btn-outline-secondary decrease-quantity flex-grow-1"
data-book-id="${item.book_id}">
<i class="bi bi-dash"></i> Zmniejsz ilość
</button>
<button class="btn btn-sm btn-outline-danger remove-from-cart cart-remove-btn flex-grow-1"
data-book-id="${item.book_id}">
<i class="bi bi-trash"></i> Usuń
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
`;
container.insertAdjacentHTML('beforeend', itemHTML);
});
// Dodaj całkowitą sumę koszyka
const totalHTML = `
<div class="col-12 mt-4">
<div class="card dark-card p-4">
<div class="d-flex justify-content-between align-items-center">
<h2 class="mb-0">Suma całkowita</h2>
<h2 class="mb-0 total-cart-value">${totalCartValue.toFixed(2)} PLN</h2>
</div>
</div>
</div>
`;
container.insertAdjacentHTML('beforeend', totalHTML);
// Obsługa przycisku zmniejszania ilości
document.querySelectorAll('.decrease-quantity').forEach(button => {
button.addEventListener('click', function() {
const bookId = this.getAttribute('data-book-id');
updateCartItemQuantity(bookId, 'decrease');
});
});
// Obsługa przycisku usuwania
document.querySelectorAll('.remove-from-cart').forEach(button => {
button.addEventListener('click', function() {
const bookId = this.getAttribute('data-book-id');
updateCartItemQuantity(bookId, 'remove');
});
});
} catch (error) {
console.error('Error:', error);
alert('Nie udało się załadować koszyka');
}
});
async function updateCartItemQuantity(bookId, action) {
try {
const token = localStorage.getItem('token');
if (!token) {
window.location.href = '/login.html';
return;
}
let endpoint, method;
if (action === 'decrease') {
endpoint = `/api/decrease-cart-item/${bookId}`;
method = 'POST';
} else if (action === 'remove') {
endpoint = `/api/remove-from-cart/${bookId}`;
method = 'DELETE';
} else {
throw new Error('Nieznana akcja');
}
const response = await fetch(endpoint, {
method: method,
headers: {
'Authorization': `Bearer ${token}`
}
});
if (!response.ok) throw new Error('Błąd aktualizacji koszyka');
// Odśwież koszyk
location.reload();
} catch (error) {
console.error('Error:', error);
alert('Nie udało się zaktualizować koszyka');
}
}
async function removeFromCart(bookId) {
try {
const token = localStorage.getItem('token');
if (!token) {
window.location.href = '/login.html';
return;
}
const response = await fetch(`/api/remove-from-cart/${bookId}`, {
method: 'DELETE',
headers: {
'Authorization': `Bearer ${token}`
}
});
if (!response.ok) throw new Error('Błąd usuwania z koszyka');
// Odśwież koszyk
location.reload();
} catch (error) {
console.error('Error:', error);
alert('Nie udało się usunąć z koszyka');
}
}
document.getElementById('checkoutBtn').addEventListener('click', async () => {
try {
const token = localStorage.getItem('token');
if (!token) {
window.location.href = '/login.html';
return;
}
// Pobierz aktualną zawartość koszyka
const cartResponse = await fetch('/api/cart', {
headers: { 'Authorization': `Bearer ${token}` }
});
const cartItems = await cartResponse.json();
// Przygotuj dane do zamówienia
const checkoutData = {
items: cartItems.map(item => ({
book_id: item.book_id,
quantity: item.quantity
})),
total: cartItems.reduce((sum, item) =>
sum + (parseFloat(item.cena) * item.quantity), 0)
};
// Wyślij zamówienie
const response = await fetch('/api/checkout', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify(checkoutData)
});
if (!response.ok) throw new Error('Błąd podczas składania zamówienia');
window.location.href = '/thankyou.html';
} catch (error) {
console.error('Error:', error);
alert('Nie udało się złożyć zamówienia: ' + error.message);
}
});