Skip to content

Instantly share code, notes, and snippets.

@josecarneiro
Created May 24, 2021 23:39
Show Gist options
  • Save josecarneiro/3839557811ae9c7acf52b708600df4a2 to your computer and use it in GitHub Desktop.
Save josecarneiro/3839557811ae9c7acf52b708600df4a2 to your computer and use it in GitHub Desktop.
// Write your Pizza Builder JavaScript in this file.
// Constants
let basePrice = 10;
let ingredients = {
pepperoni: { name: 'pepperoni', price: 1 },
mushrooms: { name: 'Mushrooms', price: 1 },
greenPeppers: { name: 'Green Peppers', price: 1 },
whiteSauce: { name: 'White sauce', price: 3 },
glutenFreeCrust: { name: 'Gluten-free crust', price: 5 }
};
// Initial value of the state (the state values can change over time)
let state = {
pepperoni: true,
mushrooms: true,
greenPeppers: true,
whiteSauce: false,
glutenFreeCrust: false
};
// This function takes care of rendering the pizza based on the state
// This function is triggered once at the beginning and every time the state is changed
function renderEverything() {
renderPepperoni();
renderMushrooms();
renderGreenPeppers();
renderWhiteSauce();
renderGlutenFreeCrust();
renderButtons();
renderPrice();
}
function renderPepperoni() {
document.querySelectorAll('.pep').forEach((onePep) => {
onePep.style.visibility = state.pepperoni ? 'visible' : 'hidden';
});
}
function renderMushrooms() {
// Iteration 1: set the visibility of `<section class="mushroom">`
document.querySelectorAll('.mushroom').forEach((mushroom) => {
mushroom.style.visibility = state.mushrooms ? 'visible' : 'hidden';
});
}
function renderGreenPeppers() {
// Iteration 1: set the visibility of `<section class="green-pepper">`
document.querySelectorAll('.green-pepper').forEach((greenPepper) => {
greenPepper.style.visibility = state.greenPeppers ? 'visible' : 'hidden';
});
}
function renderWhiteSauce() {
// Iteration 2: add/remove the class "sauce-white" of `<section class="sauce">
const whiteSauces = document.querySelector('.sauce');
if (state.whiteSauce) {
whiteSauces.classList.add('sauce-white');
} else {
whiteSauces.classList.remove('sauce-white');
}
}
function renderGlutenFreeCrust() {
// Iteration 2: add/remove the class "crust-gluten-free" of `<section class="crust">
const crusts = document.querySelector('.crust');
if (state.glutenFreeCrust) {
crusts.classList.add('crust-gluten-free');
} else {
crusts.classList.remove('crust-gluten-free');
}
}
function renderButtons() {
// Iteration 3: add/remove the class "active" of each `<button class="btn">`
if (state.pepperoni) {
document.querySelector('.btn-pepperoni').classList.add('active');
} else {
document.querySelector('.btn-pepperoni').classList.remove('active');
}
if (state.greenPeppers) {
document.querySelector('.btn-green-peppers').classList.add('active');
} else {
document.querySelector('.btn-green-peppers').classList.remove('active');
}
if (state.mushrooms) {
document.querySelector('.btn-mushrooms').classList.add('active');
} else {
document.querySelector('.btn-mushrooms').classList.remove('active');
}
if (state.whiteSauce) {
document.querySelector('.btn-sauce').classList.add('active');
} else {
document.querySelector('.btn-sauce').classList.remove('active');
}
if (state.glutenFreeCrust) {
document.querySelector('.btn-crust').classList.add('active');
} else {
document.querySelector('.btn-crust').classList.remove('active');
}
}
function renderPrice() {
// Iteration 4: change the HTML of `<aside class="panel price">`
let totalPrice = basePrice;
const ingredientsList = document.querySelector('.panel.price ul');
ingredientsList.innerHTML = '';
for (let ingredient in state) {
if (state[ingredient]) {
const unit = document.createElement('li');
unit.innerText = `${ingredients[ingredient].price} ${ingredients[ingredient].name}`;
ingredientsList.append(unit);
totalPrice += ingredients[ingredient].price;
}
}
const price = document.querySelector('.panel.price strong');
price.textContent = `$ ${totalPrice}`;
}
renderEverything();
// Iteration 1: Example of a click event listener on `<button class="btn btn-pepperoni">`
document.querySelector('.btn.btn-pepperoni').addEventListener('click', () => {
state.pepperoni = !state.pepperoni;
renderEverything();
});
// Iteration 1: Add click event listener on `<button class="btn btn-mushrooms">`
document.querySelector('.btn.btn-mushrooms').addEventListener('click', () => {
state.mushrooms = !state.mushrooms;
renderEverything();
});
// Iteration 1: Add click event listener on `<button class="btn btn-green-peppers">`
document
.querySelector('.btn.btn-green-peppers')
.addEventListener('click', () => {
state.greenPeppers = !state.greenPeppers;
renderEverything();
});
// Iteration 2: Add click event listener on `<button class="btn btn-sauce">`
document.querySelector('.btn.btn-sauce').addEventListener('click', () => {
state.whiteSauce = !state.whiteSauce;
renderEverything();
});
// Iteration 2: Add click event listener on `<button class="btn btn-crust">'
document.querySelector('.btn.btn-crust').addEventListener('click', () => {
state.glutenFreeCrust = !state.glutenFreeCrust;
renderEverything();
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment