// 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'); } });
top of page

Haunted Library – Dark Academia Candle

Among dust-laden shelves and flickering candlelight, the Haunted Library keeps its secrets close. This candle conjures the scent of forgotten tomes, ghostly whispers, and velvet shadows stretching across wooden floors. The fragrance is a moody blend of rustic woods and dark rum—warm, spiced, and lingering—like aged volumes steeped in smoke and the echo of stories long past. It is the essence of history that refuses to be silent.

Rich, intoxicating, and enigmatic, this blend transforms any room into a chamber of quiet reverie and spectral charm. Perfect for late-night reading, studying by candlelight, or simply embracing the romance of haunted spaces.

Hand-poured with 100% soy wax and a clean cotton wick, this candle offers a pure, toxin-free burn. Each fragrance oil is clean and phthalate-free, ensuring a safe yet deeply immersive experience.

Available in three sizes to suit your rituals:
– 16 oz glass jar for endless nights among ghostly shelves
– 12 oz glass jar for daily brushes with mystery
– 6 oz travel tin to carry the haunt wherever you roam

Light the flame, and let the Haunted Library awaken—where every breath is a story, and every shadow holds a whisper.

HAUNTED LIBRARY Dark Academia Candle Collection

$13.00Price
Quantity
    bottom of page