{
  "version": 3,
  "sources": ["../../assets/js/express-checkout.js"],
  "sourcesContent": ["/**\n * Express Checkout Element integration for Apple Pay / Google Pay.\n *\n * Reads configuration from the mount element's data attributes:\n *   data-mode        \"buynow\" | \"cart\"\n *   data-copy-id     BookCopy PK (buynow only)\n *   data-amount      Total in penny units (initial estimate)\n *   data-shipping-url  POST endpoint for shipping rates\n *   data-buynow-url    POST endpoint for creating intent (buynow)\n *   data-intent-url    POST endpoint for creating intent (cart)\n *   data-complete-url  Redirect after success\n */\nconst el = document.getElementById('express-checkout-element');\nif (el) {\n  const stripePublicKey = el.dataset.stripeKey;\n  if (stripePublicKey) {\n    const mode = el.dataset.mode;\n    const copyId = el.dataset.copyId || null;\n    const productType = el.dataset.productType || 'book';\n    const amount = parseInt(el.dataset.amount, 10) || 0;\n    const shippingUrl = el.dataset.shippingUrl;\n    const intentUrl = el.dataset.intentUrl;\n    const completeUrl = el.dataset.completeUrl;\n    let allowedCountries = [];\n    try { allowedCountries = JSON.parse(el.dataset.allowedCountries || '[]'); } catch (e) { /* ignore */ }\n\n    const stripe = Stripe(stripePublicKey);\n\n    const elements = stripe.elements({\n      mode: 'payment',\n      amount: amount,\n      currency: 'gbp',\n    });\n\n    const expressCheckoutElement = elements.create('expressCheckout', {\n      buttonType: {\n        applePay: 'buy',\n        googlePay: 'buy',\n      },\n    });\n\n    expressCheckoutElement.mount('#express-checkout-element');\n\n    // Show container only when express payment methods are available\n    expressCheckoutElement.on('ready', (event) => {\n      const methods = event.availablePaymentMethods;\n      if (methods && (methods.applePay || methods.googlePay)) {\n        el.style.display = 'block';\n        const divider = document.querySelector('.express-checkout-divider');\n        if (divider) divider.style.display = 'flex';\n      }\n    });\n\n    // Track selected shipping rate and current total\n    let currentShippingAmount = 0;\n\n    // Helper: get CSRF token from page\n    const getCsrfToken = () => {\n      const meta = document.querySelector('[name=csrfmiddlewaretoken]');\n      if (meta) return meta.value;\n      const cookie = document.cookie.match(/csrftoken=([^;]+)/);\n      return cookie ? cookie[1] : '';\n    };\n\n    // Helper: POST JSON and return parsed response\n    const postJSON = async (url, data) => {\n      const res = await fetch(url, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRFToken': getCsrfToken(),\n        },\n        body: JSON.stringify(data),\n      });\n      return res.json();\n    };\n\n    // Fetch shipping rates from server\n    const fetchShippingRates = (address) =>\n      postJSON(shippingUrl, {\n        country: address.country,\n        postcode: address.postal_code || '',\n        mode: mode,\n        copy_id: copyId,\n        product_type: productType,\n      });\n\n    // Handle the click event \u2014 open the payment sheet\n    expressCheckoutElement.on('click', (event) => {\n      const options = {\n        shippingAddressRequired: true,\n        emailRequired: true,\n        phoneNumberRequired: false,\n      };\n      if (allowedCountries.length > 0) {\n        options.allowedShippingCountries = allowedCountries;\n      }\n      event.resolve(options);\n    });\n\n    // Handle shipping address changes\n    expressCheckoutElement.on('shippingaddresschange', async (event) => {\n      try {\n        const data = await fetchShippingRates(event.address);\n\n        if (!data.success || !data.rates || data.rates.length === 0) {\n          event.reject();\n          return;\n        }\n\n        const shippingRates = data.rates.map((r) => ({\n          id: String(r.id),\n          displayName: r.displayName,\n          amount: r.amount,\n        }));\n\n        currentShippingAmount = shippingRates[0].amount;\n        const newTotal = amount + currentShippingAmount;\n\n        elements.update({ amount: newTotal });\n        event.resolve({ shippingRates });\n      } catch {\n        event.reject();\n      }\n    });\n\n    // Handle shipping rate changes\n    expressCheckoutElement.on('shippingratechange', (event) => {\n      currentShippingAmount = event.shippingRate.amount;\n      const newTotal = amount + currentShippingAmount;\n      elements.update({ amount: newTotal });\n      event.resolve();\n    });\n\n    // Handle payment confirmation\n    expressCheckoutElement.on('confirm', async (event) => {\n      const billingDetails = event.billingDetails || {};\n      const shippingAddress = event.shippingAddress || {};\n      const shippingRate = event.shippingRate || {};\n\n      // Build address from Express Checkout Element data\n      // The Express Checkout Element nests street fields under shippingAddress.address\n      const addr = shippingAddress.address || {};\n\n      const payload = {\n        mode: mode,\n        copy_id: copyId,\n        product_type: productType,\n        shipping_rate_id: shippingRate.id || null,\n        email: billingDetails.email || '',\n        shipping_address: {\n          name: shippingAddress.name || billingDetails.name || '',\n          address: [addr.line1, addr.line2].filter(Boolean).join(', '),\n          city: addr.city || '',\n          postcode: addr.postal_code || '',\n          country: addr.country || 'GB',\n          phone: billingDetails.phone || '',\n        },\n      };\n\n      try {\n        const data = await postJSON(intentUrl, payload);\n        if (data.error) {\n          alert(data.error);\n          return;\n        }\n\n        const result = await stripe.confirmPayment({\n          elements: elements,\n          clientSecret: data.client_secret,\n          confirmParams: {\n            return_url: window.location.origin + completeUrl + '?order_id=' + data.order_id,\n          },\n        });\n\n        if (result.error) {\n          alert(result.error.message || 'Payment failed. Please try again.');\n        }\n        // If no error, the browser redirects to return_url\n      } catch {\n        alert('Something went wrong. Please try again.');\n      }\n    });\n  }\n}\n"],
  "mappings": "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",
  "names": ["el", "stripePublicKey", "mode", "copyId", "productType", "amount", "shippingUrl", "intentUrl", "completeUrl", "allowedCountries", "stripe", "elements", "expressCheckoutElement", "event", "methods", "divider", "currentShippingAmount", "getCsrfToken", "meta", "cookie", "postJSON", "url", "data", "fetchShippingRates", "address", "options", "shippingRates", "r", "newTotal", "billingDetails", "shippingAddress", "shippingRate", "addr", "payload", "result"]
}
