// 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

Library Ghost – Dark Academia Candle

Silent as the turning of a forgotten page, the Library Ghost lingers between stacks where time stands still. This candle captures the spectral presence of a spirit bound to books and memory, forever haunting the shelves of a dimly lit library. The fragrance of gardenia drifts like a soft, floral echo through the air—delicate yet haunting, as though each bloom carries a secret once whispered by candlelight. It is both comforting and uncanny, a scent that blurs the line between beauty and the beyond.

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

Available in three sizes to suit your rituals:
– 16 oz glass jar for endless nights among haunted shelves
– 12 oz glass jar for daily brushes with mystery
– 6 oz travel tin to carry the ghost’s whisper wherever you go

Light the flame, and invite the Library Ghost to linger—a quiet presence that turns every room into a story waiting to be told.

LIBRARY GHOST Dark Academia Candle Collection

$13.00Price
Quantity
    bottom of page