If you’re looking for a delicious and healthy appetizer, then you’ve come to the right place! These crispy air fryer rice paper noodle rolls are not only packed with vibrant veggies and tofu (or shrimp), but they also come together in no time. They make a fantastic snack for busy weeknights, family gatherings, or even a cozy movie night at home. I promise you, once you taste these delightful rolls, they’ll become a staple in your kitchen.

What makes this recipe truly special is its versatility. You can customize it with your favorite fillings, and it’s gluten-free too! Plus, the air fryer gives them that perfect crispiness without needing tons of oil. Trust me, you’ll love making (and eating!) these Taste Air Fryer Rice Paper Noodle Rolls: A Crispy, Healthy Appetizer You’ll Love.


Why You’ll Love This Recipe
- Quick and easy: With just 30 minutes from start to finish, these rolls are perfect for when you’re short on time.
- Healthy and wholesome: Packed with fresh veggies and tofu or shrimp, they’re a nutritious choice that doesn’t skimp on flavor.
- Family-friendly: Everyone can join in on the fun of rolling their own noodles—it’s a great way to get kids involved in cooking!
- Customizable filling options: Swap out ingredients based on what you have on hand or your personal preferences for endless variations.
- Perfect for meal prep: Make a batch ahead of time and enjoy them throughout the week as a quick snack or appetizer.
Ingredients You’ll Need
These are simple, wholesome ingredients that you probably have in your pantry already. Each component brings its own flavor and texture to the rolls, making them utterly delicious!
- 8 rice paper sheets
- 1 cup cooked vermicelli noodles
- 1/2 cup shredded carrots
- 1 cup finely chopped cabbage
- 1 block of firm tofu (or 8 cooked shrimp)
- 2 tablespoons green onion, sliced
- 2 teaspoons grated ginger
- 1 tablespoon minced garlic
- 1 tablespoon soy sauce
- 1 tablespoon Shaoxing apple vinegar (or rice vinegar)
- 1 tablespoon sesame oil
- 1/2 teaspoon sugar
- Oil spray for air frying
- Optional dipping sauce: sweet chili, peanut, or soy-ginger
Variations
The beauty of these rice paper noodle rolls is how flexible they are! You can easily adapt them to suit your taste buds or dietary needs.
- Swap the protein: Try using tempeh or chickpeas instead of tofu for a different protein boost.
- Add more crunch: Incorporate sliced bell peppers or cucumbers for extra freshness and texture.
- Make it spicy: Add some chili flakes or sriracha into the filling for those who enjoy a little heat!
- Go vegan: Simply stick with tofu and omit any seafood for a fully plant-based option.
How to Make Taste Air Fryer Rice Paper Noodle Rolls: A Crispy, Healthy Appetizer You’ll Love
Step 1: Soak the Rice Paper
Start by soaking one rice paper sheet in warm water for about 10–15 seconds until it’s soft and pliable. This step is crucial because it makes the rice paper easier to roll without tearing.
Step 2: Prepare Your Rolling Station
Transfer the softened sheet onto a damp surface like a wooden board or clean towel. Having everything ready will help you assemble each roll quickly!
Step 3: Fill It Up
In the center of the rice paper sheet, add a small layer of cooked vermicelli noodles followed by shredded veggies and either diced tofu or shrimp. Don’t overfill; you want to be able to roll it up tightly without spilling!
Step 4: Roll It Up
Fold in both sides of the rice paper and then roll from the bottom up like you would with a burrito. The key here is to keep it snug so everything stays inside during cooking.
Step 5: Prepare for Air Frying
Lightly brush each roll with sesame oil or use an oil spray. This helps achieve that golden brown color while keeping them crispy without too much added fat.
Step 6: Preheat Your Air Fryer
Preheat your air fryer to 375°F (190°C) for about 2–3 minutes. This ensures that your rolls will start cooking evenly as soon as they go in.
Step 7: Arrange Them in the Basket
Place your rolls seam-side down into the air fryer basket in a single layer. Avoid overcrowding so that they cook evenly and get nice and crispy all around.
Step 8: Air Fry Until Golden
Air fry them for about 8–10 minutes, flipping halfway through until they’re golden brown and crispy on both sides. Keep an eye on them towards the end—everyone’s air fryer can be slightly different!
Step 9: Serve Warm
Serve your crispy rice paper noodle rolls hot with your favorite dipping sauce like sweet chili, peanut sauce, or soy garlic. Enjoy every bite!
Pro Tips for Making Taste Air Fryer Rice Paper Noodle Rolls: A Crispy, Healthy Appetizer You’ll Love
Making these rice paper noodle rolls can be a fun and rewarding experience! Here are some pro tips to ensure you achieve the best results:
Use warm water for soaking: Soaking rice paper sheets in warm water makes them more pliable and easier to handle, preventing tearing during the rolling process.
Don’t overfill your rolls: Adding too much filling can make it difficult to roll them tightly and may cause them to burst in the air fryer. Aim for a modest amount of filling for perfect rolls.
Preheat your air fryer: Preheating your air fryer ensures that the rolls cook evenly and become crispy all around, giving you that delightful crunch.
Experiment with dipping sauces: While sweet chili, peanut, or soy-ginger sauces are great options, don’t hesitate to try different combinations or even make your own sauce to add a personal touch.
Store leftovers properly: If you have any leftover rolls, store them in an airtight container in the fridge. Reheat them briefly in the air fryer for a quick snack later on!
How to Serve Taste Air Fryer Rice Paper Noodle Rolls: A Crispy, Healthy Appetizer You’ll Love
Presenting your rice paper noodle rolls can enhance their appeal and encourage everyone to dig in. Here’s how you can serve them up beautifully:
Garnishes
- Fresh herbs: Sprinkle chopped cilantro or basil on top for a pop of color and added freshness.
- Sesame seeds: Toasted sesame seeds add a nutty flavor and crunchy texture that complement the rolls perfectly.
Side Dishes
- Asian slaw: A crunchy slaw made with cabbage, carrots, and a tangy dressing pairs well with the rolls and adds extra veggies to your meal.
- Miso soup: This warm soup is comforting and balances out the crispy texture of the noodle rolls while providing umami flavor.
- Steamed edamame: Lightly salted edamame makes for a nutritious side that’s easy to prepare and adds protein.
- Cucumber salad: A refreshing cucumber salad drizzled with rice vinegar offers a light contrast to the richness of the rolls.
Make Ahead and Storage
These Taste Air Fryer Rice Paper Noodle Rolls are fantastic for meal prep! You can make them ahead of time, store them properly, and enjoy a healthy snack or appetizer whenever you like.
Storing Leftovers
- Store any leftover rolls in an airtight container in the refrigerator.
- They will stay fresh for up to 3 days.
- Place parchment paper between layers to prevent them from sticking together.
Freezing
- To freeze, place the cooked rolls on a baking sheet in a single layer until solid.
- Transfer them to a freezer-safe bag or container and label it with the date.
- They can be frozen for up to 2 months.
Reheating
- To reheat, preheat your air fryer to 375°F (190°C).
- Place the frozen rolls in the air fryer basket and heat for about 10-12 minutes until crispy.
- For refrigerated rolls, reheat them for about 5-7 minutes.
FAQs
Here are some common questions you might have about this recipe!
Can I use different fillings for Taste Air Fryer Rice Paper Noodle Rolls?
Absolutely! Feel free to customize your filling with your favorite vegetables, proteins, or even herbs. It’s all about what you enjoy!
How do I make sure my Taste Air Fryer Rice Paper Noodle Rolls are crispy?
To achieve that perfect crispiness, make sure to lightly brush or spray the rolls with oil before air frying. Also, avoid overcrowding the air fryer basket.
Can I prepare Taste Air Fryer Rice Paper Noodle Rolls ahead of time?
Yes! You can prepare these rolls in advance and store them in the fridge or freezer. Just follow the storage tips above for optimal freshness.
Final Thoughts
I hope you find joy in making these delightful Taste Air Fryer Rice Paper Noodle Rolls! They’re not just a treat for your taste buds but also a fun way to get creative in the kitchen. Enjoy every crispy bite and feel free to share your variations — happy cooking!
Taste Air Fryer Rice Paper Noodle Rolls: A Crispy, Healthy Appetizer You’ll Love
If you’re in search of a delicious and healthy appetizer, look no further than these crispy air fryer rice paper noodle rolls! Bursting with vibrant vegetables and your choice of tofu, these delightful rolls come together in just 30 minutes, making them perfect for busy weeknights or family gatherings. With their gluten-free nature and customizable fillings, they are sure to become a staple in your kitchen. The air fryer provides that perfect crispiness without the excess oil, ensuring you can enjoy every bite guilt-free. Whether served as snacks or appetizers, these rice paper noodle rolls will impress everyone at the table.
Total Time:
25 minutesYield:
Serves 4 (8 rolls) 1x
Ingredients
Scale
- 8 rice paper sheets
- 1 cup cooked vermicelli noodles
- 1/2 cup shredded carrots
- 1 cup finely chopped cabbage
- 1 block of firm tofu
- 2 tablespoons green onion, sliced
- 2 teaspoons grated ginger
- 1 tablespoon minced garlic
- 1 tablespoon soy sauce
- 1 tablespoon apple vinegar
- 1 tablespoon sesame oil
- 1/2 teaspoon sugar
- Oil spray for air frying
- Optional dipping sauce: sweet chili, peanut, or soy-ginger
Instructions
- Soak rice paper sheets in warm water for 10–15 seconds until soft.
- Transfer softened sheets to a damp surface.
- In the center of each sheet, place a layer of vermicelli noodles, followed by veggies and tofu.
- Roll tightly from the bottom up, folding in the sides.
- Brush each roll with sesame oil or use an oil spray.
- Preheat air fryer to 375°F (190°C).
- Arrange rolls seam-side down in the basket without overcrowding.
- Air fry for 8–10 minutes until golden brown and crispy.
- Serve warm with your choice of dipping sauce.
- Prep Time: 15 minutes
- Cook Time: 10 minutes
- Category: Appetizer
- Method: Air Frying
- Cuisine: Asian
Nutrition
- Serving Size: 2 rolls (150g)
- Calories: 220
- Sugar: 3g
- Sodium: 450mg
- Fat: 7g
- Saturated Fat: 1g
- Unsaturated Fat: 5g
- Trans Fat: 0g
- Carbohydrates: 33g
- Fiber: 2g
- Protein: 8g
- Cholesterol: 0mg
window.trCommon={“minRating”:6,”ajaxurl”:”https:\/\/www.quickdailydish.com\/wp-admin\/admin-ajax.php”,”ratingNonce”:”ee983ce99b”,”postId”:3619};
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 );
});


