This guide covers building a custom wishlist header launch point using Swym APIs.
Scroll to the bottom of this page for an easy copy paste solution!
Step 1: Initialise SwymCallbacks
if(!window.SwymCallbacks){
window.SwymCallbacks = [];
}
window.SwymCallbacks.push(this._initializeHeaderIcon.bind(this));
Step 2: Initialise the header icon
_initializeHeaderIcon(swat){
this.button = this.querySelector('button');
//All functional code here
}
Step 3: Add an on-click event to the header icon that opens the Wishlist UI.
Code overview:
swat.ui.open() : used to open the Wishlist UI. You may need to add your own function to close your wishlist modal in case it is a custom wishlist modal.
this.button.addEventListener('click', _openWishlistUi);
function _openWishlistUi(evt){
// In case you have a custom wishlist page, modify the below code accordingly
window.location = '/pages/wishlist'
/* In case you need to use the default Swym Wishlist,
comment the above code (line 6) and uncomment the below code (line 11) */
// swat.ui.open();
}
Step 4 (optional): Initialize the header counter if required.
Code overview:
getListsData() : Uses the swat.fetchLsts API to fetch a user's lists. The lists contains products that a user has wishlisted.
// HEADER COUNTER CODE
this.counter = this.querySelector(".swym-wishlist-header-counter");
if(this.counter){
const counter = this.counter;
// Fetch the lists
async function getListsData(){
return new Promise(async (resolve, reject) => {
swat.fetchLists({
callbackFn: data => resolve(data),
onError: error => reject(error)
})
})
}
// Increase header count when product is added to the list.
swat.evtLayer.addEventListener(swat.JSEvents.addedToWishlist, () => {
const counterCount = +counter.innerHTML;
counter.innerHTML = counterCount+1;
})
// Decrease header count when product is removed from the list.
swat.evtLayer.addEventListener(swat.JSEvents.removedFromWishlist, () => {
const counterCount = +counter.innerHTML;
if(counterCount >= 0) counter.innerHTML = counterCount - 1;
})
// Fetch total number of products and update header counter.
const listData = await getListsData();
let products = [];
for (const list of listData) {
for (const product of list.listcontents) {
products.push(product);
}
}
this.counter.innerHTML = products.length;
}
Step 5: Add the HTML for the header icon
<swym-header-icon>
<button id="swym-header-icon" aria-label="View Wishlist">
{{ settings.swym_header_icon }}
</button>
</swym-header-icon>
<swym-header-icon>
<button id="swym-header-icon" aria-label="View Wishlist">
{{ settings.swym_header_icon }}
<span class="swym-wishlist-header-counter"></span>
</button>
</swym-header-icon>
Step 6: Add styling for the header icon
<style>
.swym-wishlist.swym-inject.header__icon { display: none }
swym-header-icon #swym-header-icon {
border: none;
width: auto;
height: 35px;
background: transparent;
display: flex;
align-items: end;
/* Update the color as per store requirements from the customisation settings */
color: {{ settings.swym_header_icon_color }};
}
</style>
Step 7: Add schema settings to customize the header icon from Shopify's theme customizer
{
"name": "Custom Header Implementation",
"settings": [
{
"type": "liquid",
"id": "swym_header_icon",
"label": "Swym Header icon",
"default": "<svg height=\"24\" clip-rule=\"evenodd\" fill-rule=\"evenodd\" stroke-linejoin=\"round\" stroke-miterlimit=\"2\" viewBox=\"0 0 24 24\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path fill=\"currentColor\" d=\"m7.234 3.004c-2.652 0-5.234 1.829-5.234 5.177 0 3.725 4.345 7.727 9.303 12.54.194.189.446.283.697.283s.503-.094.697-.283c4.977-4.831 9.303-8.814 9.303-12.54 0-3.353-2.58-5.168-5.229-5.168-1.836 0-3.646.866-4.771 2.554-1.13-1.696-2.935-2.563-4.766-2.563zm0 1.5c1.99.001 3.202 1.353 4.155 2.7.14.198.368.316.611.317.243 0 .471-.117.612-.314.955-1.339 2.19-2.694 4.159-2.694 1.796 0 3.729 1.148 3.729 3.668 0 2.671-2.881 5.673-8.5 11.127-5.454-5.285-8.5-8.389-8.5-11.127 0-1.125.389-2.069 1.124-2.727.673-.604 1.625-.95 2.61-.95z\" fill-rule=\"nonzero\"\/><\/svg>"
},
{
"type": "color",
"id": "swym_header_icon_color",
"label": "Swym Header Icon color",
"default": "#FFFFFF"
}
]
}
Step 8: Add the header icon in the header section
Keep in mind that the name of the header file may vary depending on the themes, so it's important to determine the name of the header file.
{% render 'swym-custom-header' %}
One Step Copy Paste - Final Code
You would still need to follow step 7 to add the schema settings in order to use Shopify's theme customizer to customize the header icon.
<swym-header-icon>
<button id="swym-header-icon" aria-label="View Wishlist">
{{ settings.swym_header_icon }}
<span class="swym-wishlist-header-counter"></span>
</button>
</swym-header-icon>
<style>
.swym-wishlist.swym-inject.header__icon { display: none }
swym-header-icon #swym-header-icon {
border: none;
width: auto;
height: 35px;
background: transparent;
display: flex;
align-items: end;
/* Update the color as per store requirements from the customisation settings */
color: {{ settings.swym_header_icon_color }};
}
</style>
<script>
if(!customElements.get('swym-header-icon')){
class SwymHeaderIcon extends HTMLElement{
constructor(){
super();
if (!window.SwymCallbacks) window.SwymCallbacks = [];
window.SwymCallbacks.push(this._initializeSwymButton.bind(this));
}
_initializeSwymButton(swat){
this.button = this.querySelector('button');
this.button.addEventListener('click', _openWishlistUi);
function _openWishlistUi(evt){
swat.ui.open();
}
// HEADER COUNTER CODE
this.counter = this.querySelector(".swym-wishlist-header-counter");
if(this.counter){
// Fetch the lists
async function getListsData(){
return new Promise(async (resolve, reject) => {
swat.fetchLists({
callbackFn: data => resolve(data),
onError: error => reject(error)
})
})
}
const listData = await getListsData();
// Remove the duplicate occurences of products
let products = {};
for (const list of listData) {
for (const product of list.listcontents) {
const epi = product.epi;
if (!products[epi]) {
products[epi] = product;
}
}
}
this.counter.innerHTML = Object.values(products).length;
}
}
}
customElements.define('swym-header-icon', SwymHeaderIcon);
}
</script>
Demo Store
Store Link
Password: demostore