From 28501fec7cacc9320fc1d493bd8c9d03cc7c88b3 Mon Sep 17 00:00:00 2001 From: isUnknown Date: Wed, 14 Jan 2026 11:26:14 +0100 Subject: [PATCH] Implement custom Shopify cart with drawer UI Replace Shopify Buy Button iframe with custom implementation using Storefront API 2026-01. Create interactive cart drawer with full product management capabilities (add, remove, update quantities) and seamless checkout flow. Co-Authored-By: Claude Sonnet 4.5 --- .../css/components/_shopify-buy-button.scss | 0 .../css/components/_shopify-cart-drawer.scss | 233 +++++++++++++++++ assets/css/style.css | 234 +++++++++++++++++- assets/css/style.css.map | 2 +- assets/css/style.scss | 3 +- assets/css/template/shop/_snipcart.scss | 3 - assets/js/cart-drawer.js | 214 ++++++++++++++++ assets/js/product-add-to-cart.js | 121 +++++++++ assets/js/shopify-cart.js | 232 +++++++++++++++++ site/snippets/buy-button--t-shirt.php | 85 +++++++ site/snippets/footer.php | 32 +++ site/snippets/header.php | 1 + site/templates/product.php | 79 +----- 13 files changed, 1158 insertions(+), 81 deletions(-) create mode 100644 assets/css/components/_shopify-buy-button.scss create mode 100644 assets/css/components/_shopify-cart-drawer.scss delete mode 100644 assets/css/template/shop/_snipcart.scss create mode 100644 assets/js/cart-drawer.js create mode 100644 assets/js/product-add-to-cart.js create mode 100644 assets/js/shopify-cart.js create mode 100644 site/snippets/buy-button--t-shirt.php diff --git a/assets/css/components/_shopify-buy-button.scss b/assets/css/components/_shopify-buy-button.scss new file mode 100644 index 0000000..e69de29 diff --git a/assets/css/components/_shopify-cart-drawer.scss b/assets/css/components/_shopify-cart-drawer.scss new file mode 100644 index 0000000..e21387c --- /dev/null +++ b/assets/css/components/_shopify-cart-drawer.scss @@ -0,0 +1,233 @@ +/* Cart Drawer Styles */ +.cart-drawer { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 9999; + pointer-events: none; + opacity: 0; + transition: opacity 0.3s ease; +} + +.cart-drawer.is-open { + pointer-events: auto; + opacity: 1; +} + +.cart-drawer__overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + cursor: pointer; +} + +.cart-drawer__panel { + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 100%; + max-width: 420px; + background-color: #ffffff; + box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15); + display: flex; + flex-direction: column; + transform: translateX(100%); + transition: transform 0.3s ease; +} + +.cart-drawer.is-open .cart-drawer__panel { + transform: translateX(0); +} + +.cart-drawer__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1.5rem; + border-bottom: 1px solid #e0e0e0; +} + +.cart-drawer__header h3 { + margin: 0; + font-size: 1.5rem; + font-weight: bold; +} + +.cart-drawer__close { + background: none; + border: none; + cursor: pointer; + padding: 0.5rem; + display: flex; + align-items: center; + justify-content: center; + transition: opacity 0.2s; +} + +.cart-drawer__close:hover { + opacity: 0.7; +} + +.cart-drawer__content { + flex: 1; + overflow-y: auto; + padding: 1.5rem; +} + +.cart-drawer__empty { + text-align: center; + padding: 3rem 1rem; + color: #666; +} + +.cart-drawer__empty.hidden { + display: none; +} + +.cart-drawer__items { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.cart-drawer__items.hidden { + display: none; +} + +.cart-item { + display: flex; + gap: 1rem; + padding: 1rem; + border: 1px solid #e0e0e0; + border-radius: 8px; +} + +.cart-item__image { + width: 80px; + height: 80px; + object-fit: cover; + border-radius: 4px; + flex-shrink: 0; +} + +.cart-item__details { + flex: 1; + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.cart-item__title { + font-weight: 600; + margin: 0; + font-size: 1rem; +} + +.cart-item__variant { + font-size: 0.875rem; + color: #666; + margin: 0; +} + +.cart-item__price { + font-weight: bold; + color: #000; +} + +.cart-item__quantity { + display: flex; + align-items: center; + gap: 0.5rem; + margin-top: auto; +} + +.cart-item__qty-btn { + width: 28px; + height: 28px; + border: 1px solid #ddd; + background: #fff; + border-radius: 4px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 1rem; + transition: background-color 0.2s; +} + +.cart-item__qty-btn:hover:not(:disabled) { + background-color: #f5f5f5; +} + +.cart-item__qty-btn:disabled { + opacity: 0.4; + cursor: not-allowed; +} + +.cart-item__qty-value { + min-width: 30px; + text-align: center; + font-weight: 600; +} + +.cart-item__remove { + background: none; + border: none; + color: #ff3333; + cursor: pointer; + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + text-decoration: underline; + align-self: flex-start; +} + +.cart-item__remove:hover { + color: #cc0000; +} + +.cart-drawer__footer { + border-top: 1px solid #e0e0e0; + padding: 1.5rem; +} + +.cart-drawer__checkout-btn { + width: 100%; + font-family: "Open Sans", sans-serif; + font-weight: bold; + font-size: 1rem; + color: #000000; + background-color: #00ff00; + border: none; + border-radius: 40px; + padding: 14px 34px; + cursor: pointer; + transition: background-color 0.3s ease; +} + +.cart-drawer__checkout-btn:hover:not(:disabled) { + background-color: #00e600; +} + +.cart-drawer__checkout-btn:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +/* Mobile responsiveness */ +@media (max-width: 768px) { + .cart-drawer__panel { + max-width: 100%; + } +} + +/* Loading state */ +.cart-drawer__content.is-loading { + opacity: 0.5; + pointer-events: none; +} diff --git a/assets/css/style.css b/assets/css/style.css index 824c345..54e5a88 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -1258,8 +1258,238 @@ body.is-fullscreen { margin-top: calc(var(--spacing) * 4); } -.snipcart-modal__container { - z-index: 1000; +/* Cart Drawer Styles */ +.cart-drawer { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 9999; + pointer-events: none; + opacity: 0; + transition: opacity 0.3s ease; +} + +.cart-drawer.is-open { + pointer-events: auto; + opacity: 1; +} + +.cart-drawer__overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + cursor: pointer; +} + +.cart-drawer__panel { + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 100%; + max-width: 420px; + background-color: #ffffff; + box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15); + display: flex; + flex-direction: column; + transform: translateX(100%); + transition: transform 0.3s ease; +} + +.cart-drawer.is-open .cart-drawer__panel { + transform: translateX(0); +} + +.cart-drawer__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1.5rem; + border-bottom: 1px solid #e0e0e0; +} + +.cart-drawer__header h3 { + margin: 0; + font-size: 1.5rem; + font-weight: bold; +} + +.cart-drawer__close { + background: none; + border: none; + cursor: pointer; + padding: 0.5rem; + display: flex; + align-items: center; + justify-content: center; + transition: opacity 0.2s; +} + +.cart-drawer__close:hover { + opacity: 0.7; +} + +.cart-drawer__content { + flex: 1; + overflow-y: auto; + padding: 1.5rem; +} + +.cart-drawer__empty { + text-align: center; + padding: 3rem 1rem; + color: #666; +} + +.cart-drawer__empty.hidden { + display: none; +} + +.cart-drawer__items { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.cart-drawer__items.hidden { + display: none; +} + +.cart-item { + display: flex; + gap: 1rem; + padding: 1rem; + border: 1px solid #e0e0e0; + border-radius: 8px; +} + +.cart-item__image { + width: 80px; + height: 80px; + -o-object-fit: cover; + object-fit: cover; + border-radius: 4px; + flex-shrink: 0; +} + +.cart-item__details { + flex: 1; + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.cart-item__title { + font-weight: 600; + margin: 0; + font-size: 1rem; +} + +.cart-item__variant { + font-size: 0.875rem; + color: #666; + margin: 0; +} + +.cart-item__price { + font-weight: bold; + color: #000; +} + +.cart-item__quantity { + display: flex; + align-items: center; + gap: 0.5rem; + margin-top: auto; +} + +.cart-item__qty-btn { + width: 28px; + height: 28px; + border: 1px solid #ddd; + background: #fff; + border-radius: 4px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 1rem; + transition: background-color 0.2s; +} + +.cart-item__qty-btn:hover:not(:disabled) { + background-color: #f5f5f5; +} + +.cart-item__qty-btn:disabled { + opacity: 0.4; + cursor: not-allowed; +} + +.cart-item__qty-value { + min-width: 30px; + text-align: center; + font-weight: 600; +} + +.cart-item__remove { + background: none; + border: none; + color: #ff3333; + cursor: pointer; + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + text-decoration: underline; + align-self: flex-start; +} + +.cart-item__remove:hover { + color: #cc0000; +} + +.cart-drawer__footer { + border-top: 1px solid #e0e0e0; + padding: 1.5rem; +} + +.cart-drawer__checkout-btn { + width: 100%; + font-family: "Open Sans", sans-serif; + font-weight: bold; + font-size: 1rem; + color: #000000; + background-color: #00ff00; + border: none; + border-radius: 40px; + padding: 14px 34px; + cursor: pointer; + transition: background-color 0.3s ease; +} + +.cart-drawer__checkout-btn:hover:not(:disabled) { + background-color: #00e600; +} + +.cart-drawer__checkout-btn:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +/* Mobile responsiveness */ +@media (max-width: 768px) { + .cart-drawer__panel { + max-width: 100%; + } +} +/* Loading state */ +.cart-drawer__content.is-loading { + opacity: 0.5; + pointer-events: none; } [data-template=subscription-newsletter] main { diff --git a/assets/css/style.css.map b/assets/css/style.css.map index c3b0a2e..7ba498b 100644 --- a/assets/css/style.css.map +++ b/assets/css/style.css.map @@ -1 +1 @@ -{"version":3,"sources":["style.css","base/_var.scss","base/_body.scss","components/_nav-tabs.scss","components/_btn--default.scss","components/_btn--don.scss","components/_form-newsletter.scss","components/_gauge.scss","components/_text.scss","partials/_site-header.scss","partials/_site-footer.scss","template/support/_layout.scss","template/support/_section--donation.scss","template/support/_section--comments.scss","template/support/_section--questions.scss","template/support/_section--video.scss","template/shop/_layout.scss","template/shop/_section--product.scss","template/shop/_thanks.scss","template/shop/_snipcart.scss","template/subscription-newsletter/_layout.scss"],"names":[],"mappings":"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","file":"style.css"} \ No newline at end of file +{"version":3,"sources":["style.css","base/_var.scss","base/_body.scss","components/_nav-tabs.scss","components/_btn--default.scss","components/_btn--don.scss","components/_form-newsletter.scss","components/_gauge.scss","components/_text.scss","partials/_site-header.scss","partials/_site-footer.scss","template/support/_layout.scss","template/support/_section--donation.scss","template/support/_section--comments.scss","template/support/_section--questions.scss","template/support/_section--video.scss","template/shop/_layout.scss","template/shop/_section--product.scss","template/shop/_thanks.scss","components/_shopify-cart-drawer.scss","template/subscription-newsletter/_layout.scss"],"names":[],"mappings":"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","file":"style.css"} \ No newline at end of file diff --git a/assets/css/style.scss b/assets/css/style.scss index 2e517e4..334ba35 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -22,6 +22,7 @@ @import "template/shop/layout"; @import "template/shop/section--product"; @import "template/shop/thanks"; -// @import "template/shop/snipcart"; // Snipcart désactivé - voir assets/snipcart-archive/README.md +@import "components/shopify-buy-button.scss"; +@import "components/shopify-cart-drawer.scss"; @import "template/subscription-newsletter/layout"; diff --git a/assets/css/template/shop/_snipcart.scss b/assets/css/template/shop/_snipcart.scss deleted file mode 100644 index aab74c7..0000000 --- a/assets/css/template/shop/_snipcart.scss +++ /dev/null @@ -1,3 +0,0 @@ -.snipcart-modal__container { - z-index: 1000; -} diff --git a/assets/js/cart-drawer.js b/assets/js/cart-drawer.js new file mode 100644 index 0000000..483dea0 --- /dev/null +++ b/assets/js/cart-drawer.js @@ -0,0 +1,214 @@ +/** + * Cart Drawer Component + * Manages the cart sidebar with add/remove/update functionality + */ +(function() { + const drawer = document.getElementById('cart-drawer'); + const emptyState = document.querySelector('[data-cart-empty]'); + const itemsContainer = document.querySelector('[data-cart-items]'); + const checkoutBtn = document.querySelector('[data-cart-checkout]'); + const closeButtons = document.querySelectorAll('[data-cart-close]'); + + let currentCart = null; + let cartInstance = null; + + // Wait for ShopifyCart to be available + function initCartDrawer() { + if (typeof ShopifyCart === 'undefined') { + setTimeout(initCartDrawer, 100); + return; + } + + cartInstance = new ShopifyCart({ + domain: 'nv7cqv-bu.myshopify.com', + storefrontAccessToken: 'dec3d35a2554384d149c72927d1cfd1b' + }); + + // Initialize event listeners + setupEventListeners(); + } + + function setupEventListeners() { + // Close drawer + closeButtons.forEach(btn => { + btn.addEventListener('click', closeDrawer); + }); + + // Checkout button + checkoutBtn.addEventListener('click', () => { + if (currentCart?.checkoutUrl) { + window.location.href = currentCart.checkoutUrl; + } + }); + + // Listen for custom cart update events + document.addEventListener('cart:updated', (e) => { + currentCart = e.detail.cart; + renderCart(); + openDrawer(); + }); + } + + function openDrawer() { + drawer.classList.add('is-open'); + document.body.style.overflow = 'hidden'; + } + + function closeDrawer() { + drawer.classList.remove('is-open'); + document.body.style.overflow = ''; + } + + function renderCart() { + if (!currentCart || !currentCart.lines || currentCart.lines.edges.length === 0) { + emptyState.classList.remove('hidden'); + itemsContainer.classList.add('hidden'); + checkoutBtn.disabled = true; + return; + } + + emptyState.classList.add('hidden'); + itemsContainer.classList.remove('hidden'); + checkoutBtn.disabled = false; + + // Render cart items + itemsContainer.innerHTML = currentCart.lines.edges.map(edge => { + const item = edge.node; + const merchandise = item.merchandise; + + return ` +
+
+

${merchandise.product.title}

+ ${merchandise.title !== 'Default Title' ? `

${merchandise.title}

` : ''} +

${merchandise.price.amount} ${merchandise.price.currencyCode}

+ +
+ + ${item.quantity} + +
+ + +
+
+ `; + }).join(''); + + // Attach event listeners to quantity buttons + attachQuantityListeners(); + } + + function attachQuantityListeners() { + const buttons = itemsContainer.querySelectorAll('[data-action]'); + + buttons.forEach(btn => { + btn.addEventListener('click', async (e) => { + const action = e.target.dataset.action; + const lineId = e.target.dataset.lineId; + + await handleQuantityChange(action, lineId); + }); + }); + } + + async function handleQuantityChange(action, lineId) { + if (!cartInstance || !currentCart) return; + + // Find the line item + const line = currentCart.lines.edges.find(edge => edge.node.id === lineId); + if (!line) return; + + const currentQty = line.node.quantity; + let newQty = currentQty; + + if (action === 'increase') { + newQty = currentQty + 1; + } else if (action === 'decrease') { + newQty = Math.max(0, currentQty - 1); + } else if (action === 'remove') { + newQty = 0; + } + + // Update cart via API + try { + itemsContainer.classList.add('is-loading'); + + const query = ` + mutation cartLinesUpdate($cartId: ID!, $lines: [CartLineUpdateInput!]!) { + cartLinesUpdate(cartId: $cartId, lines: $lines) { + cart { + id + checkoutUrl + lines(first: 10) { + edges { + node { + id + quantity + merchandise { + ... on ProductVariant { + id + title + price { + amount + currencyCode + } + product { + title + } + } + } + } + } + } + } + userErrors { + field + message + } + } + } + `; + + const data = await cartInstance.query(query, { + cartId: currentCart.id, + lines: [{ + id: lineId, + quantity: newQty + }] + }); + + if (data.cartLinesUpdate.userErrors.length > 0) { + throw new Error(data.cartLinesUpdate.userErrors[0].message); + } + + currentCart = data.cartLinesUpdate.cart; + renderCart(); + + } catch (error) { + console.error('Error updating cart:', error); + alert('Erreur lors de la mise à jour du panier'); + } finally { + itemsContainer.classList.remove('is-loading'); + } + } + + // Public API + window.CartDrawer = { + open: openDrawer, + close: closeDrawer, + updateCart: (cart) => { + currentCart = cart; + renderCart(); + } + }; + + // Initialize when DOM is ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initCartDrawer); + } else { + initCartDrawer(); + } +})(); diff --git a/assets/js/product-add-to-cart.js b/assets/js/product-add-to-cart.js new file mode 100644 index 0000000..267e05b --- /dev/null +++ b/assets/js/product-add-to-cart.js @@ -0,0 +1,121 @@ +/** + * Product Add to Cart functionality + * Handles the add to cart button interaction with Shopify + */ +(function() { + // Initialize Shopify Cart + const cart = new ShopifyCart({ + domain: 'nv7cqv-bu.myshopify.com', + storefrontAccessToken: 'dec3d35a2554384d149c72927d1cfd1b' + }); + + // Get product ID from data attribute + const addToCartBtn = document.querySelector('[data-shopify-add-to-cart]'); + + if (!addToCartBtn) { + console.warn('Add to cart button not found'); + return; + } + + const productId = addToCartBtn.dataset.productId; + const variantId = addToCartBtn.dataset.variantId; + const stockDisplay = document.querySelector('[data-product-stock]'); + + // Load product data to check availability + async function loadProductData() { + try { + const product = await cart.getProduct(productId); + + if (!product) { + console.error('Product not found'); + return; + } + + // Find the specific variant or use the first one + let variant; + if (variantId) { + variant = product.variants.edges.find( + edge => edge.node.id === `gid://shopify/ProductVariant/${variantId}` + )?.node; + } else { + variant = product.variants.edges[0]?.node; + } + + if (!variant) { + console.error('Variant not found'); + return; + } + + // Update button based on availability + if (!variant.availableForSale) { + addToCartBtn.disabled = true; + addToCartBtn.textContent = 'Rupture de stock'; + addToCartBtn.classList.add('out-of-stock'); + if (stockDisplay) { + stockDisplay.textContent = 'Rupture de stock'; + stockDisplay.classList.add('out-of-stock'); + } + } else { + // Show in stock + if (stockDisplay) { + stockDisplay.textContent = 'En stock'; + stockDisplay.classList.add('in-stock'); + } + } + + // Store variant ID for later use + addToCartBtn.dataset.variantId = variant.id.replace('gid://shopify/ProductVariant/', ''); + + } catch (error) { + console.error('Error loading product:', error); + } + } + + // Handle add to cart click + addToCartBtn.addEventListener('click', async function(e) { + e.preventDefault(); + + // Disable button during request + addToCartBtn.disabled = true; + const originalText = addToCartBtn.textContent; + addToCartBtn.textContent = 'Ajout en cours...'; + + try { + const variantId = this.dataset.variantId; + const cartResult = await cart.addToCart(variantId, 1); + + // Show success feedback + addToCartBtn.textContent = 'Ajouté ! ✓'; + addToCartBtn.classList.add('success'); + + // Dispatch event to open cart drawer + document.dispatchEvent(new CustomEvent('cart:updated', { + detail: { cart: cartResult } + })); + + // Reset button after short delay + setTimeout(() => { + addToCartBtn.disabled = false; + addToCartBtn.textContent = originalText; + addToCartBtn.classList.remove('success'); + }, 1500); + + } catch (error) { + console.error('Error adding to cart:', error); + + // Show error feedback + addToCartBtn.textContent = 'Erreur - Réessayer'; + addToCartBtn.classList.add('error'); + + // Re-enable button after delay + setTimeout(() => { + addToCartBtn.disabled = false; + addToCartBtn.textContent = originalText; + addToCartBtn.classList.remove('error'); + }, 2000); + } + }); + + // Load product data on page load + loadProductData(); +})(); diff --git a/assets/js/shopify-cart.js b/assets/js/shopify-cart.js new file mode 100644 index 0000000..faf88d7 --- /dev/null +++ b/assets/js/shopify-cart.js @@ -0,0 +1,232 @@ +/** + * Shopify Storefront API Client + * Custom implementation using Cart API (2026-01) + */ +class ShopifyCart { + constructor(config) { + this.domain = config.domain; + this.storefrontAccessToken = config.storefrontAccessToken; + this.apiVersion = '2026-01'; + this.endpoint = `https://${this.domain}/api/${this.apiVersion}/graphql.json`; + this.cartId = null; + this.cartItems = []; + + // Load existing cart from localStorage + this.loadCart(); + } + + /** + * Make GraphQL request to Shopify Storefront API + */ + async query(query, variables = {}) { + const response = await fetch(this.endpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Shopify-Storefront-Access-Token': this.storefrontAccessToken, + }, + body: JSON.stringify({ query, variables }), + }); + + const result = await response.json(); + + if (result.errors) { + console.error('Shopify API Error:', result.errors); + throw new Error(result.errors[0].message); + } + + return result.data; + } + + /** + * Get product information by ID + */ + async getProduct(productId) { + const query = ` + query getProduct($id: ID!) { + product(id: $id) { + id + title + description + availableForSale + variants(first: 10) { + edges { + node { + id + title + price { + amount + currencyCode + } + availableForSale + } + } + } + } + } + `; + + const data = await this.query(query, { + id: `gid://shopify/Product/${productId}` + }); + + return data.product; + } + + /** + * Create a new cart + */ + async createCart(lines = []) { + const query = ` + mutation cartCreate($input: CartInput!) { + cartCreate(input: $input) { + cart { + id + checkoutUrl + lines(first: 10) { + edges { + node { + id + quantity + merchandise { + ... on ProductVariant { + id + title + price { + amount + currencyCode + } + product { + title + } + } + } + } + } + } + } + userErrors { + field + message + } + } + } + `; + + const data = await this.query(query, { + input: { lines } + }); + + if (data.cartCreate.userErrors.length > 0) { + throw new Error(data.cartCreate.userErrors[0].message); + } + + this.cartId = data.cartCreate.cart.id; + this.saveCart(); + + return data.cartCreate.cart; + } + + /** + * Add item to cart + */ + async addToCart(variantId, quantity = 1) { + const lines = [{ + merchandiseId: `gid://shopify/ProductVariant/${variantId}`, + quantity: quantity + }]; + + let cart; + + if (this.cartId) { + // Add to existing cart + const query = ` + mutation cartLinesAdd($cartId: ID!, $lines: [CartLineInput!]!) { + cartLinesAdd(cartId: $cartId, lines: $lines) { + cart { + id + checkoutUrl + lines(first: 10) { + edges { + node { + id + quantity + merchandise { + ... on ProductVariant { + id + title + price { + amount + currencyCode + } + product { + title + } + } + } + } + } + } + } + userErrors { + field + message + } + } + } + `; + + const data = await this.query(query, { + cartId: this.cartId, + lines + }); + + if (data.cartLinesAdd.userErrors.length > 0) { + throw new Error(data.cartLinesAdd.userErrors[0].message); + } + + cart = data.cartLinesAdd.cart; + } else { + // Create new cart + cart = await this.createCart(lines); + } + + this.cartItems = cart.lines.edges; + return cart; + } + + /** + * Get checkout URL to redirect user + */ + getCheckoutUrl(cart) { + return cart?.checkoutUrl || null; + } + + /** + * Save cart ID to localStorage + */ + saveCart() { + if (this.cartId) { + localStorage.setItem('shopify_cart_id', this.cartId); + } + } + + /** + * Load cart ID from localStorage + */ + loadCart() { + this.cartId = localStorage.getItem('shopify_cart_id'); + } + + /** + * Clear cart + */ + clearCart() { + this.cartId = null; + this.cartItems = []; + localStorage.removeItem('shopify_cart_id'); + } +} + +// Export for use in other scripts +window.ShopifyCart = ShopifyCart; diff --git a/site/snippets/buy-button--t-shirt.php b/site/snippets/buy-button--t-shirt.php new file mode 100644 index 0000000..0076131 --- /dev/null +++ b/site/snippets/buy-button--t-shirt.php @@ -0,0 +1,85 @@ +
+
+

+
+ + +
+ + \ No newline at end of file diff --git a/site/snippets/footer.php b/site/snippets/footer.php index 6acee68..fdb4979 100644 --- a/site/snippets/footer.php +++ b/site/snippets/footer.php @@ -1,3 +1,33 @@ + +
+
+
+
+

Panier

+ +
+ +
+
+

Votre panier est vide

+
+ +
+
+ + +
+
+
+ + diff --git a/site/snippets/header.php b/site/snippets/header.php index 3582006..ee74be4 100644 --- a/site/snippets/header.php +++ b/site/snippets/header.php @@ -12,6 +12,7 @@ +