If you’re looking for a vibrant, delicious meal that will brighten up your dinner table, then this Vegan Pineapple Tofu is just the ticket! With its sweet and tangy flavors, crispy texture, and colorful veggies, it’s a dish that brings smiles to everyone. Perfect for busy weeknights or family gatherings, this recipe is not just quick to whip up but also a delightful twist on takeout favorites.

I love this recipe because it’s not only packed with nutrition but also bursting with flavor. The combination of crispy tofu and juicy pineapple creates a harmony that makes every bite feel special. Plus, it’s versatile enough to suit various tastes and dietary preferences!


Why You’ll Love This Recipe
- Quick and Easy: Ready in just 35 minutes, this dish is perfect for those hectic weeknights when you want something satisfying without spending hours in the kitchen.
- Family-Friendly: Kids and adults alike will enjoy the sweet and savory blend of flavors—it’s a guaranteed crowd-pleaser!
- Meal Prep Friendly: Make a big batch ahead of time! This dish tastes even better the next day, making it ideal for lunchboxes or leftovers.
- Wholesome Ingredients: Packed with fresh vegetables and wholesome tofu, you’ll feel good serving this dish to your loved ones.
Ingredients You’ll Need
This Vegan Pineapple Tofu uses simple and wholesome ingredients that you can easily find at your local grocery store. Each component works together to create the mouthwatering flavors that make this dish so special!
Main Ingredients
- 1 block (14 oz) extra-firm tofu, pressed and cubed
- 2 cups fresh pineapple chunks (or frozen, thawed)
- 1 red bell pepper, sliced
- 1 green bell pepper, sliced
- 1 medium onion, sliced
- 3 cloves garlic, minced
- 1 tablespoon fresh ginger, minced
For Coating
- 3 tablespoons cornstarch (for coating the tofu)
Sauce Ingredients
- 2 tablespoons soy sauce or tamari
- 2 tablespoons rice vinegar
- 1 tablespoon maple syrup (naturally vegan and perfect here)
For Cooking
- 2 tablespoons neutral oil for cooking
- Green onions and sesame seeds for garnish
Variations
One of the best things about this recipe is its flexibility! You can easily swap out ingredients or add your favorite flavors to make it your own.
- Add more veggies: Feel free to toss in some broccoli or snap peas for extra crunch and nutrition.
- Spice it up: Add some chili flakes or sriracha to the sauce for a spicy kick that complements the sweetness of the pineapple.
- Swap the protein: If you’re looking for something different, try using tempeh instead of tofu for an even nuttier flavor profile.
- Go global: Serve this dish over quinoa or brown rice for a Mediterranean twist or pair it with noodles for an Asian-inspired fusion bowl.
How to Make Vegan Pineapple Tofu
Step 1: Press the Tofu
Start by pressing your tofu between clean kitchen towels for about 15 minutes. This crucial step helps remove excess moisture so your tofu will get nice and crispy when cooked. Trust me; skipping this step could lead to soggy disappointment!
Step 2: Prepare the Tofu
Cut your pressed tofu into 1-inch cubes. Then toss them with cornstarch until each piece is beautifully coated. This coating is what gives the tofu its irresistible crunch!
Step 3: Cook the Tofu
Heat oil in your largest skillet over medium-high heat. Add the coated tofu in a single layer and let it sit undisturbed for about 3-4 minutes until golden brown. Resist the urge to check on them too often; patience here pays off with perfectly crisp pieces!
Step 4: Sauté Vegetables
Once your tofu is golden perfection, remove it from the pan. Now add sliced peppers and onions to that same pan. Cook these beauties until they start caramelizing—this process brings out their natural sweetness.
Step 5: Infuse Flavor
Next up is adding garlic and ginger! Stir them in constantly for about 30 seconds until your kitchen smells divine. This step infuses those aromatic flavors into the mix.
Step 6: Add Pineapple Magic
Toss in those juicy pineapple chunks now! Let them caramelize for about 2-3 minutes; trust me—this is where magic happens as they soak up all those delicious flavors.
Step 7: Combine Everything
In a separate bowl, mix together soy sauce, rice vinegar, and maple syrup before pouring it over everything in the skillet along with the crispy tofu. Stir gently for about 2 minutes until everything looks glossy and irresistible!
Now you have a stunning Vegan Pineapple Tofu that’s ready to be served! Enjoy it hot with some steamed rice or on its own—either way, it’s bound to become a new favorite in your household!
Pro Tips for Making Vegan Pineapple Tofu
Creating the perfect Vegan Pineapple Tofu is all about the little details that elevate your dish from good to spectacular. Here are some essential tips to keep in mind:
- Press the tofu well: Ensuring you adequately press the tofu removes excess moisture, resulting in a crispier texture when cooked.
- Use fresh pineapple: Fresh pineapple adds a vibrant sweetness and juiciness that frozen varieties can’t quite match, enhancing the overall flavor of the dish.
- Let it caramelize: Resist the urge to stir too frequently while cooking the tofu and vegetables; letting them sit allows for that beautiful golden-brown crust to form.
- Adjust seasoning to taste: Feel free to tweak the soy sauce and maple syrup amounts based on your preference—this dish is all about balancing sweet and savory!
- Serve hot: For the best experience, enjoy this dish immediately after cooking, as it tastes best when freshly made.
How to Serve Vegan Pineapple Tofu
Serving Vegan Pineapple Tofu can be just as fun as making it! Consider these ideas to present your dish beautifully and make mealtime even more enjoyable.
Garnishes
- Green onions: Sliced thinly, these add a pop of color and a fresh bite that contrasts nicely with the sweetness of the pineapple.
- Sesame seeds: A sprinkle of sesame seeds not only provides a lovely crunch but also enhances the Asian-inspired flavors of this dish.
Side Dishes
- Steamed jasmine rice: The fluffy grains soak up the delicious sauce perfectly, making each bite satisfying.
- Quinoa salad: A light quinoa salad with cucumbers and cherry tomatoes offers a refreshing complement to the richness of the tofu.
- Stir-fried greens: Quick-cooked bok choy or kale brings some greens into your meal while adding vibrant color and nutrition.
- Coconut rice: Sweet and creamy coconut rice pairs beautifully with the tangy pineapple, creating a tropical twist on your dinner plate.
Make Ahead and Storage
This Vegan Pineapple Tofu recipe is perfect for meal prep! You can whip up a batch ahead of time and enjoy it throughout the week.
Storing Leftovers
- Allow the tofu to cool completely before storing.
- Place leftovers in an airtight container in the refrigerator.
- Enjoy them within 3 days for the best flavor and texture.
Freezing
- It’s not recommended to freeze this dish, as the tofu may become spongy and lose its appealing texture.
- If necessary, freeze only the uncooked, cubed tofu after pressing and coating with cornstarch.
Reheating
- For best results, reheat gently in a skillet over medium heat.
- Stir occasionally until warmed through, which helps maintain texture.
- Avoid microwaving, as it can lead to a soggy consistency.
FAQs
If you’re wondering about some common questions regarding this dish, you’re in the right place!
Can I make Vegan Pineapple Tofu ahead of time?
Yes! This recipe is great for meal prep. Just store leftovers in an airtight container in the fridge and enjoy within three days.
What is the best way to reheat Vegan Pineapple Tofu?
The best way to reheat Vegan Pineapple Tofu is gently in a skillet over medium heat. This helps preserve its crispy texture better than microwaving.
Can I use different vegetables in Vegan Pineapple Tofu?
Absolutely! Feel free to swap out or add any veggies you love. Broccoli, snap peas, or carrots would all complement this dish beautifully.
Is Vegan Pineapple Tofu gluten-free?
You can easily make this dish gluten-free by using tamari instead of soy sauce. Ensure all other ingredients are also gluten-free.
Final Thoughts
I hope you find joy in making this delicious Vegan Pineapple Tofu! It’s not just a meal; it’s a celebration of flavors that will brighten your day. I encourage you to try it out—whether for dinner with family or as a fast weekday lunch—you’re going to love every bite!
Vegan Pineapple Tofu
Vegan Pineapple Tofu is a delightful dish that combines the sweetness of pineapple with the savory crunch of crispy tofu, making it a perfect meal for any occasion. This vibrant stir-fry is not only quick to prepare but also packed with nutrients and colorful vegetables. In just 35 minutes, you can serve up a plate that’s sure to impress family and friends. The blend of fresh ingredients creates a symphony of flavors, making it ideal for busy weeknights or as a tasty addition to your meal prep. Enjoy it over rice or on its own for a satisfying and wholesome dish!
- Prep Time: 15 minutes
- Cook Time: 20 minutes
- Total Time: 35 minutes
- Yield: Serves 4
- Category: Main
- Method: Frying
- Cuisine: Asian
Ingredients
Scale
- 1 block (14 oz) extra-firm tofu, pressed and cubed
- 2 cups fresh pineapple chunks
- 1 red bell pepper, sliced
- 1 green bell pepper, sliced
- 1 medium onion, sliced
- 3 cloves garlic, minced
- 1 tablespoon fresh ginger, minced
- 3 tablespoons cornstarch
- 2 tablespoons soy sauce or tamari
- 2 tablespoons rice vinegar
- 1 tablespoon maple syrup
- 2 tablespoons neutral oil
Instructions
- Press the tofu between clean kitchen towels for about 15 minutes to remove excess moisture.
- Cut the pressed tofu into cubes and coat with cornstarch.
- Heat oil in a skillet over medium-high heat and cook the tofu until golden brown on all sides.
- Remove tofu and sauté bell peppers and onion in the same pan until caramelized.
- Add garlic and ginger; sauté for another 30 seconds.
- Stir in pineapple chunks and cook for an additional few minutes until caramelized.
- Combine soy sauce, rice vinegar, and maple syrup in a bowl; pour over the mixture in the skillet along with tofu.
- Stir gently for about two minutes until everything is well-coated.
Nutrition
- Serving Size: 1 cup (250g)
- Calories: 220
- Sugar: 10g
- Sodium: 400mg
- Fat: 9g
- Saturated Fat: 1g
- Unsaturated Fat: 8g
- Trans Fat: 0g
- Carbohydrates: 29g
- Fiber: 3g
- Protein: 10g
- Cholesterol: 0mg
window.trCommon={“minRating”:6,”ajaxurl”:”https:\/\/simplyhomecooking.com\/wp-admin\/admin-ajax.php”,”ratingNonce”:”1002c3199c”,”postId”:8671};
window.TastyRecipes = window.TastyRecipes || {};
window.TastyRecipes.smoothScroll = {
init() {
document.addEventListener( ‘click’, ( e ) => {
let anchor = e.target;
if ( anchor.tagName !== ‘A’ ) {
anchor = anchor.closest( ‘a.tasty-recipes-scrollto’ );
}
if ( ! anchor || ! anchor.classList.contains( ‘tasty-recipes-scrollto’ ) ) {
return;
}
const elementHref = anchor.getAttribute( ‘href’ );
if ( ! elementHref ) {
return;
}
e.preventDefault();
this.goToSelector( elementHref );
});
},
goToSelector( selector ) {
const element = document.querySelector( selector );
if ( ! element ) {
return;
}
element.scrollIntoView( { behavior: ‘smooth’ } );
}
};
document.addEventListener(
‘DOMContentLoaded’,
() => window.TastyRecipes.smoothScroll.init()
);
(function(){
var bothEquals = function( d1, d2, D ) {
var ret = 0;
if (d1<=D) {
ret++;
}
if (d2<=D) {
ret++;
}
return ret === 2;
};
var frac =function frac(x,D,mixed){var n1=Math.floor(x),d1=1;var n2=n1+1,d2=1;if(x!==n1){while(bothEquals(d1,d2,D)){var m=(n1+n2)/(d1+d2);if(x===m){if(d1+d2d2){d2=D+1;}else {d1=D+1;}break}else if(xD){d1=d2;n1=n2}if(!mixed){return[0,n1,d1];}var q=Math.floor(n1/d1);return[q,n1-q*d1,d1]};frac.cont=function cont(x,D,mixed){var sgn=x<0?-1:1;var B=x*sgn;var P_2=0,P_1=1,P=0;var Q_2=1,Q_1=0,Q=0;var A=Math.floor(B);while(Q_1<D){A=Math.floor(B);P=A*P_1+P_2;Q=A*Q_1+Q_2;if(B-AD){if(Q_1>D){Q=Q_2;P=P_2}else{Q=Q_1;P=P_1}}if(!mixed){return[0,sgn*P,Q];}var q=Math.floor(sgn*P/Q);return[q,sgn*P-q*Q,Q]};
window.tastyRecipesVulgarFractions = JSON.parse(decodeURIComponent(“%7B%22%C2%BC%22%3A%221%2F4%22%2C%22%C2%BD%22%3A%221%2F2%22%2C%22%C2%BE%22%3A%223%2F4%22%2C%22%E2%85%93%22%3A%221%2F3%22%2C%22%E2%85%94%22%3A%222%2F3%22%2C%22%E2%85%95%22%3A%221%2F5%22%2C%22%E2%85%96%22%3A%222%2F5%22%2C%22%E2%85%97%22%3A%223%2F5%22%2C%22%E2%85%98%22%3A%224%2F5%22%2C%22%E2%85%99%22%3A%221%2F6%22%2C%22%E2%85%9A%22%3A%225%2F6%22%2C%22%E2%85%9B%22%3A%221%2F8%22%2C%22%E2%85%9C%22%3A%223%2F8%22%2C%22%E2%85%9D%22%3A%225%2F8%22%2C%22%E2%85%9E%22%3A%227%2F8%22%7D”));
window.tastyRecipesFormatAmount = function(amount, el) {
if ( parseFloat( amount ) === parseInt( amount ) ) {
return amount;
}
var roundType = ‘frac’;
if (typeof el.dataset.amountShouldRound !== ‘undefined’) {
if (‘false’ !== el.dataset.amountShouldRound) {
if ( ‘number’ === el.dataset.amountShouldRound ) {
roundType = ‘number’;
} else if (‘frac’ === el.dataset.amountShouldRound) {
roundType = ‘frac’;
} else if (‘vulgar’ === el.dataset.amountShouldRound) {
roundType = ‘vulgar’;
} else {
roundType = ‘integer’;
}
}
}
if (‘number’ === roundType) {
amount = Number.parseFloat(amount).toPrecision(2);
} else if (‘integer’ === roundType) {
amount = Math.round(amount);
} else if (‘frac’ === roundType || ‘vulgar’ === roundType) {
var denom = 8;
if (typeof el.dataset.unit !== ‘undefined’) {
var unit = el.dataset.unit;
if ([‘cups’,’cup’,’c’].includes(unit)) {
denom = 4;
if (0.125 === amount) {
denom = 8;
}
if (“0.1667″ === Number.parseFloat( amount ).toPrecision(4)) {
denom = 6;
}
}
if ([‘tablespoons’,’tablespoon’,’tbsp’].includes(unit)) {
denom = 2;
}
if ([‘teaspoons’,’teaspoon’,’tsp’].includes(unit)) {
denom = 8;
}
}
var amountArray = frac.cont( amount, denom, true );
var newAmount = ”;
if ( amountArray[1] !== 0 ) {
newAmount = amountArray[1] + ‘/’ + amountArray[2];
if (‘vulgar’ === roundType) {
Object.keys(window.tastyRecipesVulgarFractions).forEach(function(vulgar) {
if (newAmount === window.tastyRecipesVulgarFractions[vulgar]) {
newAmount = vulgar;
}
});
}
}
if ( newAmount ) {
newAmount = ‘ ‘ + newAmount;
}
if ( amountArray[0] ) {
newAmount = amountArray[0] + newAmount;
}
amount = newAmount;
}
return amount;
};
window.tastyRecipesUpdatePrintLink = () => {
const printButton = document.querySelector( ‘.tasty-recipes-print-button’ );
if ( ! printButton ) {
return;
}
const printURL = new URL( printButton.href );
const searchParams = new URLSearchParams( printURL.search );
const unitButton = document.querySelector( ‘.tasty-recipes-convert-button-active’ );
const scaleButton = document.querySelector( ‘.tasty-recipes-scale-button-active’ );
let unit = ”;
let scale = ”;
if ( unitButton ) {
unit = unitButton.dataset.unitType;
searchParams.delete(‘unit’);
searchParams.set( ‘unit’, unit );
}
if ( scaleButton ) {
scale = scaleButton.dataset.amount;
searchParams.set( ‘scale’, scale );
}
const paramString = searchParams.toString();
const newURL = ” === paramString ? printURL.href : printURL.origin + printURL.pathname + ‘?’ + paramString;
const printLinks = document.querySelectorAll( ‘.tasty-recipes-print-link’ );
printLinks.forEach( ( el ) => {
el.href = newURL;
});
const printButtons = document.querySelectorAll( ‘.tasty-recipes-print-button’ );
printButtons.forEach( ( el ) => {
el.href = newURL;
});
};
document.addEventListener( ‘DOMContentLoaded’, () => {
if ( ! window.location.href.includes( ‘/print/’ ) ) {
return;
}
const searchParams = new URLSearchParams( window.location.search );
const unit = searchParams.get( ‘unit’ );
const scale = searchParams.get( ‘scale’ );
if ( unit && ( ‘metric’ === unit || ‘usc’ === unit ) ) {
document.querySelector( ‘.tasty-recipes-convert-button[data-unit-type=”‘ + unit + ‘”]’ ).click();
}
if ( scale && Number(scale) > 0 ) {
document.querySelector( ‘.tasty-recipes-scale-button[data-amount=”‘ + Number(scale) + ‘”]’ ).click();
}
});
}());
(function(){
var buttonClass = ‘tasty-recipes-scale-button’,
buttonActiveClass = ‘tasty-recipes-scale-button-active’,
buttons = document.querySelectorAll(‘.tasty-recipes-scale-button’);
if ( ! buttons ) {
return;
}
buttons.forEach(function(button){
button.addEventListener(‘click’, function(event){
event.preventDefault();
var recipe = event.target.closest(‘.tasty-recipes’);
if ( ! recipe ) {
return;
}
var otherButtons = recipe.querySelectorAll(‘.’ + buttonClass);
otherButtons.forEach(function(bt){
bt.classList.remove(buttonActiveClass);
});
button.classList.add(buttonActiveClass);
var scalables = recipe.querySelectorAll(‘span[data-amount]’);
var buttonAmount = parseFloat( button.dataset.amount );
scalables.forEach(function(scalable){
if (typeof scalable.dataset.amountOriginalType === ‘undefined’
&& typeof scalable.dataset.nfOriginal === ‘undefined’) {
if (-1 !== scalable.innerText.indexOf(‘/’)) {
scalable.dataset.amountOriginalType = ‘frac’;
}
if (-1 !== scalable.innerText.indexOf(‘.’)) {
scalable.dataset.amountOriginalType = ‘number’;
}
Object.keys(window.tastyRecipesVulgarFractions).forEach(function(vulgar) {
if (-1 !== scalable.innerText.indexOf(vulgar)) {
scalable.dataset.amountOriginalType = ‘vulgar’;
}
});
if (typeof scalable.dataset.amountOriginalType !== ‘undefined’) {
scalable.dataset.amountShouldRound = scalable.dataset.amountOriginalType;
}
}
var amount = parseFloat( scalable.dataset.amount ) * buttonAmount;
amount = window.tastyRecipesFormatAmount(amount, scalable);
if ( typeof scalable.dataset.unit !== ‘undefined’ ) {
if ( ! scalable.classList.contains(‘nutrifox-quantity’) ) {
if ( ! scalable.classList.contains(‘nutrifox-second-quantity’) ) {
amount += ‘ ‘ + scalable.dataset.unit;
}
}
}
scalable.innerText = amount;
});
var nonNumerics = recipe.querySelectorAll(‘[data-has-non-numeric-amount]’);
nonNumerics.forEach(function(nonNumeric){
var indicator = nonNumeric.querySelector(‘span[data-non-numeric-label]’);
if ( indicator ) {
nonNumeric.removeChild(indicator);
}
if ( 1 !== buttonAmount ) {
indicator = document.createElement(‘span’);
indicator.setAttribute(‘data-non-numeric-label’, true);
var text = document.createTextNode(‘ (x’ + buttonAmount + ‘)’);
indicator.appendChild(text);
nonNumeric.appendChild(indicator);
}
});
window.tastyRecipesUpdatePrintLink();
});
});
}());
window.TastyRecipes = window.TastyRecipes || {};
window.TastyRecipes.cookMode = {
wakeLockApi: false,
wakeLock: false,
cookModeSelector: ‘.tasty-recipes-cook-mode’,
init() {
if (“wakeLock” in navigator && “request” in navigator.wakeLock) {
this.wakeLockApi = navigator.wakeLock;
}
const cookModes = document.querySelectorAll(this.cookModeSelector);
if (cookModes.length > 0) {
for (const cookMode of cookModes) {
if (this.wakeLockApi) {
cookMode.querySelector(‘input[type=”checkbox”]’).addEventListener(“change”, event => {
this.checkboxChange(event.target);
}, false);
} else {
cookMode.style.display = “none”;
}
}
}
},
checkboxChange(checkbox) {
if (checkbox.checked) {
this.lock();
} else {
this.unlock();
}
},
setCheckboxesState(state) {
const checkboxes = document.querySelectorAll(this.cookModeSelector + ‘ input[type=”checkbox”]’);
for (const checkbox of checkboxes) {
checkbox.checked = state;
}
},
async lock() {
try {
this.wakeLock = await this.wakeLockApi.request(“screen”);
this.wakeLock.addEventListener(“release”, () => {
this.wakeLock = false;
this.setCheckboxesState(false);
});
this.setCheckboxesState(true);
} catch (error) {
this.setCheckboxesState(false);
}
},
unlock() {
if (this.wakeLock) {
this.wakeLock.release();
this.wakeLock = false;
}
this.setCheckboxesState(false);
}
};
(function(callback) {
if (document.readyState !== “loading”) {
callback();
} else {
document.addEventListener(“DOMContentLoaded”, callback);
}
})(() => {
window.TastyRecipes.cookMode.init();
});
window.TastyRecipes = window.TastyRecipes || {};
window.TastyRecipes.staticTooltip = {
element: null,
tooltipElement: null,
deleting: false,
init( element ) {
if ( this.deleting ) {
return;
}
this.element = element;
this.buildElements();
},
destroy() {
if ( ! this.tooltipElement || this.deleting ) {
return;
}
this.deleting = true;
this.tooltipElement.classList.remove( ‘opened’ );
setTimeout( () => {
this.tooltipElement.remove();
this.deleting = false;
}, 500 );
},
buildElements() {
const tooltipElement = document.createElement( ‘div’ );
tooltipElement.classList.add( ‘tasty-recipes-static-tooltip’);
tooltipElement.setAttribute( ‘id’, ‘tasty-recipes-tooltip’ );
const currentTooltipElement = document.getElementById( ‘tasty-recipes-tooltip’ );
if ( currentTooltipElement ) {
document.body.replaceChild( tooltipElement, currentTooltipElement );
} else {
document.body.appendChild( tooltipElement );
}
this.tooltipElement = document.getElementById( ‘tasty-recipes-tooltip’ );
},
show() {
if ( ! this.tooltipElement ) {
return;
}
const tooltipTop = this.element.getBoundingClientRect().top
+ window.scrollY
– 10 // 10px offset.
– this.tooltipElement.getBoundingClientRect().height;
const tooltipLeft = this.element.getBoundingClientRect().left
– ( this.tooltipElement.getBoundingClientRect().width / 2 )
+ ( this.element.getBoundingClientRect().width / 2 ) – 1;
const posLeft = Math.max( 10, tooltipLeft );
this.maybeRemoveTail( posLeft !== tooltipLeft );
this.tooltipElement.setAttribute( ‘style’, ‘top:’ + tooltipTop + ‘px;left:’ + posLeft + ‘px;’ );
this.tooltipElement.classList.add( ‘opened’ );
},
maybeRemoveTail( removeTail ) {
if ( removeTail ) {
this.tooltipElement.classList.add( ‘tr-hide-tail’ );
} else {
this.tooltipElement.classList.remove( ‘tr-hide-tail’ );
}
},
changeMessage( message ) {
if ( ! this.tooltipElement ) {
return;
}
this.tooltipElement.innerHTML = message;
}
};
window.TastyRecipes.ajax = {
sendPostRequest( url, data, success, failure ) {
const xhr = new XMLHttpRequest();
xhr.open( ‘POST’, url, true );
xhr.send( this.preparePostData( data ) );
xhr.onreadystatechange = () => {
if ( 4 !== xhr.readyState ) {
return;
}
if ( xhr.status === 200 ) {
success( JSON.parse( xhr.responseText ) );
return;
}
failure( xhr );
};
xhr.onerror = () => {
failure( xhr );
};
},
preparePostData( data ) {
const formData = new FormData();
for ( const key in data ) {
formData.append( key, data[key] );
}
return formData;
},
};
window.TastyRecipes.ratings = {
defaultRating: 0,
currentRatingPercentage: 100,
savingRating: false,
init( minRating ) {
this.minRating = minRating;
this.formWatchRating();
this.closeTooltipWhenClickOutside();
this.addBodyClassBasedOnSelectedRating();
this.backwardCompFormRatingPosition();
},
formWatchRating() {
const ratings = document.querySelectorAll(‘.tasty-recipes-no-ratings-buttons [data-rating]’);
if ( ratings.length {
event.preventDefault();
this.defaultRating = event.target.closest( ‘.checked’ ).dataset.rating;
this.setCheckedStar( event.target );
this.maybeSendRating( this.defaultRating, event.target );
this.setRatingInForm( this.defaultRating );
} );
}
},
closeTooltipWhenClickOutside() {
window.addEventListener( ‘click’, e => {
// Bailout (don’t remove the tooltip) when the clicked element is a rating star, or it’s the tooltip itself.
if ( e.target.closest( ‘.tasty-recipes-rating’ ) || e.target.classList.contains( ‘tasty-recipes-static-tooltip’ ) ) {
return;
}
window.TastyRecipes.staticTooltip.destroy();
} );
},
setRatingInForm( rating ) {
const ratingInput = document.querySelector( ‘#respond .tasty-recipes-rating[value=”‘ + rating + ‘”]’ );
if ( ! ratingInput ) {
return;
}
ratingInput.click();
},
addBodyClassBasedOnSelectedRating() {
const ratingInputs = document.querySelectorAll( ‘input.tasty-recipes-rating’ );
if ( ! ratingInputs ) {
return;
}
for ( const ratingInput of ratingInputs ) {
ratingInput.addEventListener( ‘click’, currentEvent => {
const selectedRating = currentEvent.target.getAttribute( ‘value’ );
this.handleBodyClassByRating( selectedRating );
this.toggleCommentTextareaRequired( selectedRating );
} );
}
},
handleBodyClassByRating( rating ) {
if ( rating < this.minRating ) {
document.body.classList.remove( 'tasty-recipes-selected-minimum-rating' );
return;
}
document.body.classList.add( 'tasty-recipes-selected-minimum-rating' );
},
toggleCommentTextareaRequired( rating ) {
const commentTextarea = document.getElementById( 'comment' );
if ( ! commentTextarea ) {
return;
}
if ( rating {
window.TastyRecipes.staticTooltip.changeMessage( response.data.message );
window.TastyRecipes.staticTooltip.show();
this.updateAverageText( response.data, recipeCardElement );
this.maybeFillCommentForm( response.data );
// Hide the tooltip after 5 seconds.
setTimeout( () => {
this.maybeResetTooltip( recipeCardElement, response.data, rating );
}, 5000 );
},
() => {
this.resetTooltip( recipeCardElement );
}
);
},
updateAverageText( data, recipeCardElement ) {
if ( ! data.average ) {
return;
}
this.setRatingPercent( data );
if ( ! data.count ) {
return;
}
const quickLink = document.querySelector( ‘.tasty-recipes-rating-link’ );
if ( quickLink ) {
this.setTextInContainer( quickLink, data );
this.setPartialStar( quickLink );
}
const cardStars = recipeCardElement.querySelector( ‘.tasty-recipes-ratings-buttons’ );
cardStars.dataset.trDefaultRating = data.average;
this.setTextInContainer( recipeCardElement.querySelector( ‘.tasty-recipes-rating’ ), data );
},
setTextInContainer( container, data ) {
if ( ! container ) {
return;
}
if ( data.label ) {
const ratingLabelElement = container.querySelector( ‘.rating-label’ );
if ( ratingLabelElement ) {
ratingLabelElement.innerHTML = data.label;
}
return;
}
const averageElement = container.querySelector( ‘.average’ );
if ( averageElement ) {
averageElement.textContent = data.average;
}
const countElement = container.querySelector( ‘.count’ );
if ( countElement ) {
countElement.textContent = data.count;
}
},
setPartialStar( container ) {
const highestStar = container.querySelector( ‘[data-rating=”‘ + Math.ceil( this.defaultRating ) + ‘”]’ );
if ( highestStar ) {
highestStar.dataset.trClip = this.currentRatingPercentage;
}
},
setRatingPercent( data ) {
this.defaultRating = data.average.toFixed( 1 );
const parts = data.average.toFixed( 2 ).toString().split( ‘.’ );
this.currentRatingPercentage = parts[1] ? parts[1] : 100;
if ( this.currentRatingPercentage === ’00’ ) {
this.currentRatingPercentage = 100;
}
},
setCheckedStar( target ) {
const cardRatingContainer = target.closest( ‘.tasty-recipes-ratings-buttons’ );
const selectedRatingElement = cardRatingContainer.querySelector( ‘[data-tr-checked]’ );
if ( selectedRatingElement ) {
delete selectedRatingElement.dataset.trChecked;
}
const thisStar = target.closest( ‘.tasty-recipes-rating’ );
thisStar.dataset.trChecked = 1;
thisStar.querySelector( ‘[data-tr-clip]’ ).dataset.trClip = 100;
},
maybeFillCommentForm( data ) {
if ( ! data.comment || ! data.comment.content ) {
return;
}
const commentForm = document.querySelector( ‘#commentform’ );
if ( ! commentForm ) {
return;
}
const commentBox = commentForm.querySelector( ‘[name=comment]’ );
if ( ! commentBox || commentBox.value ) {
return;
}
// Add comment details for editing.
commentBox.innerHTML = data.comment.content;
if ( data.comment.name ) {
commentForm.querySelector( ‘[name=author]’ ).value = data.comment.name;
commentForm.querySelector( ‘[name=email]’ ).value = data.comment.email;
}
},
maybeResetTooltip( recipeCardElement, data, rating ) {
if ( this.savingRating === rating ) {
this.resetTooltip( recipeCardElement, data );
}
},
resetTooltip( recipeCardElement, data ) {
window.TastyRecipes.staticTooltip.destroy();
this.savingRating = false;
// Reset the default rating.
const cardRatingContainer = recipeCardElement.querySelector( ‘.tasty-recipes-ratings-buttons’ );
if ( cardRatingContainer ) {
this.defaultRating = ( data && data.average ) ? data.average.toFixed(1) : cardRatingContainer.dataset.trDefaultRating;
cardRatingContainer.dataset.trDefaultRating = this.defaultRating;
this.resetSelectedStar( cardRatingContainer, data );
}
},
resetSelectedStar( cardRatingContainer ) {
const selectedRatingElement = cardRatingContainer.querySelector( ‘[data-rating=”‘ + Math.ceil( this.defaultRating ) + ‘”]’ );
if ( selectedRatingElement ) {
selectedRatingElement.querySelector( ‘[data-tr-clip]’ ).dataset.trClip = this.currentRatingPercentage;
selectedRatingElement.parentNode.dataset.trChecked = 1;
}
const previousSelectedElement= cardRatingContainer.querySelector( ‘[data-tr-checked]’ );
if ( previousSelectedElement ) {
const currentSelectedRating = previousSelectedElement.querySelector(‘[data-rating]’);
if ( currentSelectedRating !== selectedRatingElement ) {
delete previousSelectedElement.dataset.trChecked;
}
}
},
backwardCompFormRatingPosition() {
const ratingsButtons = document.querySelector( ‘#respond .tasty-recipes-ratings-buttons, #tasty-recipes-comment-rating .tasty-recipes-ratings-buttons’ );
if ( ! ratingsButtons ) {
return;
}
const ratingsButtonsStyles = window.getComputedStyle(ratingsButtons);
if ( ! ratingsButtonsStyles.display.includes( ‘flex’ ) ) {
ratingsButtons.style.direction = ‘rtl’;
}
if ( typeof tastyRecipesRating !== ‘undefined’ ) {
// Select the rating that was previously selected in admin.
ratingsButtons.querySelector( ‘.tasty-recipes-rating[value=”‘ + tastyRecipesRating + ‘”]’ ).checked = true;
}
const ratingSpans = ratingsButtons.querySelectorAll( ‘.tasty-recipes-rating’ );
for (const ratingSpan of ratingSpans) {
ratingSpan.addEventListener( ‘click’, event => {
if ( ratingSpan === event.target ) {
return;
}
ratingSpan.previousElementSibling.click();
} );
}
}
};
(function(callback) {
if (document.readyState !== “loading”) {
callback();
} else {
window.addEventListener( ‘load’, callback );
}
})(() => {
window.TastyRecipes.ratings.init( window.trCommon ? window.trCommon.minRating : 4 );
});



Leave a Comment