Loading...
Heading
$
Description
622ba82224b4c413a4332fe0
Hide the undesired categories from the menu, separating them with commas ','
By entering "True" value you will enable the grid layout.
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
<script>
const propsContainer = document.querySelector(".props-container");
const root = document.getElementById("app");
const listItem = document.getElementById("list-item-main");
const categoriesContainer = document.getElementById("categories-container");
const categoriesLink = document.getElementById("category-link");
const isGrid = document.getElementById("rGrid").textContent;
if (isGrid === "true") {
root.classList.add("grid");
// Add grid-display class to list-item and item-thumbnail-wrapper
const listItems = document.querySelectorAll(".list-item");
listItems.forEach(item => {
item.classList.add("grid-display");
});
const thumbnailWrappers = document.querySelectorAll(".item-thumbnail-wrapper");
thumbnailWrappers.forEach(wrapper => {
wrapper.classList.add("grid-display");
});
}
let itemsByCategory = {};
let categoryNames = {uncategorized: "uncategorized"};
const excludedCategoriesText = document.getElementById("rExcludeList").textContent;
const excludedCategoryNames = excludedCategoriesText
.split(",")
.map((name) => name.trim());
// Fetch menu data
async function fetchMenuData() {
try {
const dt = new Date();
const year = dt.getFullYear();
const month = (dt.getMonth() + 1).toString().padStart(2, "0");
const day = dt.getDate().toString().padStart(2, "0");
const date = year + '-' + month + '-' + day
const merchantId = document.getElementById("rMID").textContent.trim();
const url = `https://qa-ecommerce-api.spoton.com/v1/restaurants/${merchantId}/menu-groups?orderDateTime=${date}T10:22:25-05:00&orderTypeId=3uxw5e1y0vgz3dwi1we2ioj1lq`;
const response = await fetch(url);
if (!response.ok) {
throw new Error("Network response was not ok for categories");
}
const categories = await response.json();
categories.forEach((category) => {
categoryNames[category.id] = category.name.trim();
itemsByCategory[category.id] = category.menuItems;
});
createCategoryLinks();
const firstCategory = Object.keys(itemsByCategory).find(
(categoryId) => !excludedCategoryNames.includes(categoryNames[categoryId]));
if (firstCategory) {
displayItems(firstCategory);
setActiveCategory(firstCategory);
}
} catch (error) {
console.error("There was a problem with the fetch operation:", error);
} finally {
listItem.remove();
}
}
function createCategoryLinks() {
Object.keys(itemsByCategory).forEach((categoryId) => {
if (!excludedCategoryNames.includes(categoryNames[categoryId])) {
let link = categoriesLink.cloneNode(true);
link.href = "#app";
link.removeAttribute("id");
link.textContent = categoryNames[categoryId] || categoryId;
link.dataset.categoryId = categoryId;
link.addEventListener("click", (e) => {
e.preventDefault();
setActiveCategory(categoryId);
displayItems(categoryId);
});
link.classList.remove("hidden");
categoriesContainer.appendChild(link);
}
});
categoriesLink.remove();
}
function setActiveCategory(categoryId) {
const links = categoriesContainer.getElementsByTagName("a");
for (let link of links) {
if (link.dataset.categoryId === categoryId) {
link.classList.add("active");
} else {
link.classList.remove("active");
}
}
}
function displayItems(categoryId) {
root.innerHTML = "";
itemsByCategory[categoryId].forEach((item) => {
let cloneNode = listItem.cloneNode(true);
cloneNode.removeAttribute("id");
cloneNode.classList.remove("hidden");
cloneNode.querySelector(".list-item-name").textContent = item.name;
// Display price if available and not zero, otherwise, remove the "$" sign
const priceElement = cloneNode.querySelector(".list-item-price");
if (item.price && parseFloat(item.price) !== 0) {
priceElement.textContent = "$" + item.price;
} else {
priceElement.textContent = "";
}
cloneNode.querySelector(".list-item-description").textContent = item.description;
// Display image if available, otherwise, hide the wrapper
if (item.imageUrl) {
cloneNode.querySelector(".list-item-image").src = item.imageUrl;
} else {
cloneNode.querySelector(".item-thumbnail-wrapper").remove();
}
// Check if modifiers exist
if (item.modifiers && item.modifiers.length > 0) {
// Create a list to store modifiers
let modifiersList = document.createElement('ul');
modifiersList.classList.add('modifiers-list');
// Iterate through modifiers and add them to the list
item.modifiers.forEach(modifier => {
let modifierItem = document.createElement('li');
modifierItem.textContent = `${modifier.name} (${modifier.price})`;
modifiersList.appendChild(modifierItem);
});
// Append the list of modifiers to the menu item
cloneNode.appendChild(modifiersList);
}
root.appendChild(cloneNode);
});
propsContainer.remove();
}
// Call the function to fetch menu data
fetchMenuData();
</script>