// Page Code for /checkout-link
import { cart } from 'wix-stores';
import wixLocation from 'wix-location';
/**
* Accepts `products` query parameter in Meta format:
* - Encoded: products=112233%3A1%2C445566%3A2
* - Unencoded: products=112233:1,445566:2 (still works)
*
* Each entry is ID:QTY. Colons/commas may be RFC 3986-escaped.
* Example final URL for Meta:
* https://mysticalcrow.com/checkout-link?products=112233%3A1%2C445566%3A2
*/
function parseProductsParam(rawParam) {
if (!rawParam || typeof rawParam !== 'string') return [];
// Try to decode once; if it throws or changes nothing, we still continue safely
let decoded = rawParam;
try {
// decodeURIComponent will convert %3A -> ":", %2C -> ","
decoded = decodeURIComponent(rawParam);
} catch (_e) {
// If decoding fails, we’ll proceed with the original string
}
// Split by commas (now that we normalized to ":" and ",")
// Trim spaces just in case.
return decoded
.split(',')
.map(s => s.trim())
.filter(Boolean)
.map(pair => {
const [id, qty] = pair.split(':').map(x => (x || '').trim());
const quantity = Number(qty);
return (id && !Number.isNaN(quantity) && quantity > 0)
? { productId: id, quantity }
: null;
})
.filter(Boolean);
}
async function addAllToCart(items) {
// Wix Stores cart.addProducts accepts an array of product objects.
// We’ll add one by one to ensure each promise resolves, but you can batch if desired.
for (const item of items) {
// If a product has variants/options, you’ll need to pass the relevant
// selection data here (e.g., options: [{ optionName, selection }]).
// For simple products, productId + quantity is sufficient.
await cart.addProducts([{ productId: item.productId, quantity: item.quantity }]);
}
}
$w.onReady(async function () {
const { products } = wixLocation.query;
if (!products) {
// No parameter present; go to cart so the user isn't stuck.
wixLocation.to('/cart');
return;
}
const items = parseProductsParam(products);
if (!items.length) {
// Parameter present but invalid/empty after parsing
wixLocation.to('/cart');
return;
}
try {
await addAllToCart(items);
// Success: go straight to checkout
wixLocation.to('/checkout');
} catch (_err) {
// If anything fails (bad ID, etc.), fall back to cart
wixLocation.to('/cart');
}
});