Setup to Squarespace

Squarespace allows to use e-commerce functionality of yappyBuy buddy assistant, so you can use two variants of buddy script.


Open backend of your Squarespace site, select Pages in navigation


Scroll to bottom and select Website Tool in navigation bar


Press Code Injection


Add code you got from yappyBuy Buddy dashboard and save (this code does not include e-commece functionality)



Code for ecommerce functionality

<!-------------- Start yappyBuy Buddy Integration -------------->
<script>

window.yappyBuyBuddyToken = "PUT-YOUR-TOKEN-HERE"; 

class YappybuyBuddy{
	
    
    constructor() {

		this.options={
			host 		: window.location.origin,
			crumb 		: this._getCookie('crumb'),
			cartToken	: null,
			cartApi 	: "/api/commerce/shopping-cart",
			cartItemApi	: "/api/3/commerce/cart/",
			productApi 	: "/api/commerce/products/"
		};
		
		this.products=[];
		
		var jsLink = document.createElement( "script" );
                // check below url with code you got from buddy dashboard and change it 
                // if you have different url in buddy code you got from dashboard
		jsLink.src = "//yb-cdn.eu-central-1.linodeobjects.com/buddy.js";
		jsLink.type = "text/javascript";
		document.getElementsByTagName( "head" )[0].appendChild( jsLink );       			
		jsLink.onload = () => {		
			this._getOptions();				
		}
		
    }
	
	
	_getOptions(){
            
	  
		this.buddy = new Buddy(window.yappyBuyBuddyToken);
		this.buddy.initializeChatbot();		
		this.buddy.on("add_to_cart",this._cartAction.bind(this,'add_to_cart'));				
		this.buddy.on("add_coupon",this._cartAction.bind(this,'add_coupon'));				
		this.buddy.on("get_cart",this._cartAction.bind(this,'get_cart'));
		this.buddy.on("delete_cart_item_full",this._cartAction.bind(this,'remove_cart_item'));				
		this.buddy.on("delete_cart_item",this._cartAction.bind(this,'decrement_cart_item'));				
		this.buddy.on("add_cart_item",this._cartAction.bind(this,'increment_cart_item'));		
		
	}	
	
	async _cartAction(action, e=null){
		console.log(action);
		console.log(e);
		console.log(arguments);
		
		let cart = await this.getCart();
		
		
		switch (action) {
			case 'add_to_cart': 
				//parameters+=`&sku=${e.sku}`;						
				break;
			case 'add_coupon': 
				//parameters+=`&code=${e.coupon}`;						
				break;
			case 'remove_cart_item': 
			case 'decrement_cart_item': 
			case 'increment_cart_item': 
				if(e.itemId in cart){
					cart = await this.updateCartItem(e.itemId, action == 'remove_cart_item' ? 0 : cart[e.itemId]['qty'] + (action == 'decrement_cart_item' ? -1 : 1));	
				}
				break;	
			default:				

		}
		this.buddy.setCart('cartItemList',Object.values(cart));

		
	}

	async getCart(){	
		
		const result = await fetch(this.options.host+this.options.cartApi +'?crumb=' + this.options.crumb + '&mock=false&calculateSubtotal=true',
		{
			method: 'GET',
			cache: 'no-cache',
			headers: {
				'Content-Type': 'application/json'  
			},
			redirect: 'follow',
			referrerPolicy: 'no-referrer'
			})
		.then(response => {
		  return response.json();
		})
		.then(
			async (data) =>{
 				let cartItems={};
				this.options.cartToken=data.cartToken;
				console.log(data);
				for (const item of data.entries){				
					console.log(item);
					let cartContent = await this.updateCartItem(item.id, item.quantity);
					return cartContent;
					/* let  product=  await this.getProduct(item.itemId);
					cartItems[item.id]={
						name 			: product.name,
						sku				: item.chosenVariant.sku,
						qty				: item.quantity,
						itemId			: item.id,
						priceInclTax	: parseFloat(item.purchasePriceCents) / 100, 
				 		thumbnail		: product.image,
						url				: this.options.host + product.url 
					}; */ 
				};	 
				return cartItems;
			}
		)
		.catch((error) => {
		  console.error('Error:', error);
		});	
		
		return result;
		
	}
	
	async getProduct(productId){	
		if (this.products.indexOf(productId) === -1) {
			const result = await fetch(this.options.productApiUrl + productId ,
			{
				method: 'GET',
				cache: 'no-cache',			
				headers: {
					'Content-Type': 'application/json',
					Authorization: `Bearer ${window.yappyBuyBuddyApi}`					
				}				
				})
			.then(response => {
			  return response.json();
			})
			.then(
				data =>{
					console.log(data);
					let product={
						id		: data.id,
						name	: data.name,
						url		: data.url.fullPath,
						image	: data.thumbnailImage.urls.https
					};
					return product;
				}
			)
			.catch((error) => {
				console.error('Error:', error);
				return null;
			});	
			
			this.products[result.id]=result;
			
			return result;
		}
		else {
			return this.products[productId];
		}		
	}	
	
	async updateCartItem(itemId, qty){	
		
		const result = await fetch(this.options.host+this.options.cartItemApi + this.options.cartToken + '/items/' + itemId,
		{
			method: 'PUT',
			cache: 'no-cache',
			headers: {
				'Content-Type': 'application/json',
				'X-CSRF-Token': this.options.crumb
			},
			redirect: 'follow',
			referrerPolicy: 'no-referrer',
			 body: JSON.stringify({"quantity":qty}) 
			})
		.then(response => {
		  return response.json();
		})
		.then(
			async (data) =>{
 				let cartItems={};
				let cnt=0;
				this.options.cartToken=data.cartToken;
				console.log(data);
				for (const item of data.items){				
					console.log(item);
					//let  product=  await this.getProduct(item.productId	);
					cartItems[item.id]={
						name 			: item.productName,
						sku				: item.sku,
						qty				: item.quantity,
						itemId			: item.id,
						priceInclTax	: parseFloat(item.unitPrice.value) / 100, 
				 		thumbnail		: item.image.url,
						url				: ''//this.options.host + product.url 
					};
					cnt+=item.quantity;
				};	 
				console.log('==========',cnt);
				let carts=document.querySelectorAll(".cart-quantity-container .sqs-cart-quantity");
				carts.forEach((item) => {
					item.innerText = cnt;
				});
                
				return cartItems;
			}
		)
		.catch((error) => {
		  console.error('Error:', error);
		});	
		
		return result;
		
	}	
	
	_getCookie(name) {
		const search = name + "=";
		const ca = document.cookie.split(';');
		for(let i = 0; i < ca.length; i++) {
			let c = ca[i];
			while (c.charAt(0) === ' ') {
				c = c.substring(1, c.length);
			}
			if (c.indexOf(search) === 0) {
				return decodeURIComponent(c.substring(search.length));
			}
		}
		return null;
	} 
		
}

window.onload = function() {
  new YappybuyBuddy();
};

</script>
<!-------------- End yappyBuy Buddy Integration -------------->
Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.