Hey there, dessert lovers! If you’re craving something that combines creamy, indulgent cheesecake, sweet berries, and the rich goodness of white chocolate, you are in for a treat! These White Chocolate Raspberry Cheesecake Balls are like little bites of heaven, bursting with flavor and a texture that’s to die for. Imagine biting into a soft, creamy center with a delicate crunch on the outside—pure magic! And the best part? They’re surprisingly easy to make. Seriously, you’ll feel like a pastry pro after whipping these up.

These cheesecake balls are the perfect dessert to share at a party or treat yourself to a sweet little snack. The balance of tangy cream cheese and fresh raspberries, all covered in a luscious white chocolate coating, is irresistible. Trust me, you’re going to love these bite-sized wonders. Let’s dive right into why they’ll quickly become a staple in your dessert rotation!

Why You’ll Love White Chocolate Raspberry Cheesecake Balls

Let me tell you, these little cheesecake balls will quickly become your go-to treat. Whether you’re hosting a party, celebrating with friends, or just satisfying a sweet tooth, this recipe is a total game-changer. Here’s why it’s bound to become your new favorite:

Versatile: These cheesecake balls are the perfect treat for any occasion. They’re the ideal bite-sized dessert for parties, or you can make them ahead of time for a treat that’s always ready when you need it. They’re super easy to pop in your mouth (and your guests will love them too!).

Budget-Friendly: Don’t let the fancy-sounding ingredients fool you—these little treats are made with simple ingredients you probably already have. It’s a high-impact dessert without breaking the bank.

Quick and Easy: No oven, no baking—just mix, roll, chill, and dip. This recipe is so easy, you’ll wonder why you didn’t try it sooner! Perfect for anyone who wants an impressive dessert without all the hassle.

Customizable: Want to switch things up? You can experiment with different fruit fillings, like strawberries or blueberries. Or, if you’re feeling extra indulgent, drizzle some caramel over the top for a luxurious twist.

Crowd-Pleasing: Trust me, everyone is going to be asking for the recipe. These little cheesecake balls are the perfect size for popping into your mouth, making them a hit with kids and adults alike.

Ingredients in White Chocolate Raspberry Cheesecake Balls

Here’s what you’ll need to make these delectable little bites:

Cream Cheese: The creamy base of these cheesecake balls. It adds that rich, smooth texture that makes each bite melt in your mouth.

Raspberries: Fresh, tart raspberries bring just the right balance to the sweetness of the white chocolate and cream cheese. They’ll give these cheesecake balls that perfect burst of berry goodness.

White Chocolate: This velvety white chocolate coating adds that sweet, indulgent finish to each cheesecake ball. It’s smooth, sweet, and the perfect complement to the tangy cream cheese.

Powdered Sugar: This helps sweeten the mixture without adding any granulated crunch, giving the cheesecake balls a smooth, creamy texture.

Vanilla Extract: Adds a bit of warmth and depth to the flavor profile, rounding everything out perfectly.

Graham Cracker Crumbs: These add a touch of crunch and remind you of the crust on a traditional cheesecake. They help give these cheesecake balls that classic, familiar taste.

(Note: the full ingredients list, including measurements, is provided in the recipe card directly below.)

Instructions

Let’s dive into the steps to create these irresistible cheesecake balls:

Prepare the Cream Cheese Mixture

In a large bowl, combine the softened cream cheese, powdered sugar, and vanilla extract. Use a hand mixer or a stand mixer to blend everything until it’s nice and smooth. You want a rich, creamy consistency here—trust me, this is the base for your cheesecake magic.

Add Raspberries

Gently fold in the fresh raspberries. Be careful not to crush them too much; you want some lovely little bits of raspberry throughout the mixture to give your cheesecake balls that delicious, fruity burst.

Roll the Cheesecake Balls

Once everything is well combined, roll the mixture into bite-sized balls, about 1-inch in diameter. Place them on a baking sheet lined with parchment paper. The mixture might be a bit sticky, so you can refrigerate it for about 15 minutes to make rolling easier.

Coat in White Chocolate

Melt your white chocolate in a heatproof bowl, either using a double boiler or in the microwave. Dip each cheesecake ball into the melted white chocolate, making sure it’s fully coated. You can use a fork to help coat them and then tap off any excess chocolate.

Chill the Cheesecake Balls

Place the coated cheesecake balls back on the parchment-lined baking sheet and let them chill in the fridge for about 30 minutes, or until the white chocolate hardens.

Serve and Enjoy

Once your cheesecake balls are chilled and the chocolate coating is set, they’re ready to be devoured! Enjoy these little bites of indulgence anytime you need a sweet pick-me-up.

How to Serve White Chocolate Raspberry Cheesecake Balls

These little cheesecake balls are perfect for any occasion, but here are some ways to serve them up:

As a Dessert Table Treat: Make a large batch and serve them on a dessert table at a party. They’ll be a standout, and your guests will love popping them into their mouths.

With Fresh Fruit: Pair them with fresh berries or a citrusy fruit salad to add a refreshing contrast to the creamy sweetness of the cheesecake balls.

As a Sweet Snack: They’re the perfect grab-and-go treat. Store them in an airtight container, and you’ll have a delightful little snack on hand whenever that sweet tooth strikes.

On Their Own: Honestly, these cheesecake balls are so good, you don’t need anything extra. Serve them on their own for a perfect, bite-sized indulgence.

Additional Tips

Here are some extra tips to help you get the most out of this recipe:

Prep Ahead: You can make the cheesecake balls in advance. Just roll and coat them, then store them in the fridge for up to a week. They’ll be ready whenever you want them!

Switch Up the Fruit: Raspberries are amazing, but you can also try strawberries, blackberries, or even blueberries for a new twist.

Use a Cookie Scoop: To ensure all your cheesecake balls are the same size, use a small cookie scoop to portion out the mixture.

Storage Tips: Store the cheesecake balls in an airtight container in the refrigerator for up to a week. They also freeze well, so feel free to make a double batch and save some for later.

FAQ Section

Q1: Can I use frozen raspberries instead of fresh?

A1: Yes! If you use frozen raspberries, just make sure to thaw and drain them before mixing them into the cheesecake filling.

Q2: Can I substitute dark or milk chocolate for white chocolate?

A2: Absolutely! Dark or milk chocolate will give you a richer flavor, but the white chocolate coating is what gives these cheesecake balls their signature sweetness.

Q3: How long can I store these cheesecake balls?

A3: They’ll stay fresh in the fridge for up to a week, and you can freeze them for up to a month if you want to keep them longer.

Q4: Can I make these without the graham cracker crumbs?

A4: Yes, if you don’t want to use graham cracker crumbs, you can skip them. You’ll still have a delicious, creamy treat, just without the “cheesecake crust” crunch.

Q5: Can I make these ahead of time?

A5: Definitely! These cheesecake balls are a perfect make-ahead dessert. Just chill them in the fridge and they’ll be ready when you need them.

Conclusion

These White Chocolate Raspberry Cheesecake Balls are the perfect treat to add a little sweetness to your day. With a smooth, creamy center, a burst of fresh raspberry flavor, and a rich white chocolate coating, they’re a bite-sized indulgence that will wow anyone who tries them. Whether you’re making them for a special occasion or simply as a sweet snack, these cheesecake balls are sure to impress. Happy snacking, and enjoy every delicious bite!

Print

White Chocolate Raspberry Cheesecake Balls


5 Stars 4 Stars 3 Stars 2 Stars 1 Star

No reviews

These White Chocolate Raspberry Cheesecake Balls are the perfect treat for any occasion! A creamy, tangy cheesecake center is combined with the sweetness of white chocolate and the tartness of fresh raspberries, then coated with a final layer of melt-in-your-mouth white chocolate and freeze-dried raspberries. Sweet, indulgent, and super easy to make!

  • Prep Time: 15 minutes (excluding chill time)
  • Cook Time: 0 minutes (no baking required)
  • Total Time: 1 hour 45 minutes (including chilling time)
  • Yield: 2024 cheesecake balls (depending on size) 1x
  • Category: Dessert, No-Bake Dessert, Party Treats
  • Method: No-bake
  • Cuisine: American
  • Diet: Vegetarian

Ingredients


Scale
  1. For the Cheesecake Balls:

    • 1 ½ cups graham cracker crumbs
    • 1 ½ cups cream cheese, softened
    • ½ cup powdered sugar
    • 1 teaspoon vanilla extract
    • ½ cup fresh raspberries, mashed
    • ½ cup white chocolate chips, melted

    For the Coating:

    1. 1 cup white chocolate chips, melted
    2. ¼ cup freeze-dried raspberries, crushed


Instructions

  • Prepare the Cheesecake Balls:

    • In a large mixing bowl, combine softened cream cheese, powdered sugar, and vanilla extract. Beat until smooth and creamy.
    • Gently fold in graham cracker crumbs and mashed fresh raspberries until well combined.
    • Chill the mixture in the fridge for 30 minutes to firm up slightly.
  • Shape the Balls:

    • Once chilled, scoop about 1 tablespoon of the cheesecake mixture and roll it into a ball. Place the shaped balls onto a parchment-lined tray.
    • Continue shaping the mixture until all the cheesecake balls are formed. Chill in the fridge for 1 hour.
  • Coat the Cheesecake Balls:

    • In a microwave-safe bowl, melt 1 cup of white chocolate chips in 20-30 second intervals, stirring in between, until smooth and melted.
    • Dip each chilled cheesecake ball into the melted white chocolate, ensuring it is fully coated.
    • Return the coated balls to the parchment-lined tray.
    • While the white chocolate is still soft, sprinkle the crushed freeze-dried raspberries over the top of each cheesecake ball.

 

  • Chill and Serve:

    • Place the coated cheesecake balls back into the fridge for at least 30 minutes to set.
    • Once the coating has hardened, your White Chocolate Raspberry Cheesecake Balls are ready to serve and enjoy!

Notes

  • Make sure to use freeze-dried raspberries for the coating, as fresh raspberries won’t work the same.
  • You can substitute the graham cracker crumbs with any other type of cookie crumbs you prefer.
  • These cheesecake balls can be stored in the fridge for up to 5 days.

 

  • For an extra touch, drizzle more melted white chocolate on top before adding the freeze-dried raspberries.

Nutrition

  • Serving Size: 1 cheesecake ball
  • Calories: 120
  • Sugar: 12g
  • Sodium: 25mg
  • Fat: 7g
  • Saturated Fat: 4g
  • Unsaturated Fat: 2g
  • Trans Fat: 0g
  • Carbohydrates: 15g
  • Fiber: 0g
  • Protein: 1g
  • Cholesterol: 10mg

Did you make this recipe?

Share a photo and tag us — we can’t wait to see what you’ve made!

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+d2<=D){d1+=d2;n1+=n2;d2=D+1}else if(d1>d2)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_1D){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(); }); }); }());

(function(){ document.querySelectorAll('[data-tr-ingredient-checkbox]').forEach(function(el) { var input = el.querySelector('.tr-ingredient-checkbox-container input[type="checkbox"]'); if ( ! input ) { return; } if (input.checked) { el.dataset.trIngredientCheckbox = 'checked'; } el.addEventListener('click', function(event) { if ( 'A' === event.target.nodeName || 'INPUT' === event.target.nodeName || 'LABEL' === event.target.nodeName ) { return; } input.click(); }); input.addEventListener('change', function() { el.dataset.trIngredientCheckbox = input.checked ? 'checked' : ''; }); }); }());

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 <= 0 ) { return; } for ( const rating of ratings ) { rating.addEventListener( 'click', event => { 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 < this.minRating ) { commentTextarea.setAttribute( 'required', '' ); return; } commentTextarea.removeAttribute( 'required' ); }, maybeSendRating( rating, element ) { if ( this.savingRating === rating ) { return; } this.savingRating = rating; window.TastyRecipes.staticTooltip.init( element ); const recipeCardElement = element.closest( '.tasty-recipes' ); if ( ! recipeCardElement ) { window.TastyRecipes.staticTooltip.destroy(); return; } window.TastyRecipes.ajax.sendPostRequest( window.trCommon.ajaxurl, { action: 'tasty_recipes_save_rating', rating, nonce: window.trCommon.ratingNonce, post_id: window.trCommon.postId, recipe_id: recipeCardElement.dataset.trId, }, ( response ) => { 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 ); });