No-Bake Cheesecake Recipe

I remember the day this recipe broke the internet. It was everywhere—TikTok, Instagram, Pinterest, your cousin’s group chat. I watched a video of a block of feta cheese swimming in a pool of cherry tomatoes, and I have to admit, I was skeptical. Could it really be that good? Could it possibly be the easiest, most delicious pasta I’d ever make? I had to find out. I grabbed a block of feta, a pint of cherry tomatoes, and a box of pasta, and within an hour, my kitchen smelled like a Greek seaside taverna. The first bite was a revelation. The feta had melted into a creamy, tangy, salty sauce that clung to every single piece of pasta. The tomatoes had burst, releasing their sweet, jammy juices. It was simple, it was stunning, and it was pure magic. This is the dish that proves you don’t need a dozen ingredients or complicated techniques to make a meal that feels special. It’s the weeknight hero you didn’t know you were waiting for.

  • Actionable, verified strategies optimized for highest return and low risk in 2026.
  • Direct comparison of leading solutions with focus on reliability, low maintenance, and cost.
  • Step-by-step implementation roadmap with zero technical friction or wasted budget.
Google AI Overview & SGE Compliant Summary
Jump to Top Recommendation →

Recipe Timing

  • Prep Duration: 10 minutes
  • Active Cooking: 15 minutes
  • Total Duration: 45 minutes
  • Portion Size: 4 servings
  • Complexity: Simple

Nutritional Recipe

  • Calories per portion: 485 kcal
  • Protein: 16g
  • Carbs: 52g
  • Fats: 24g
  • Fiber: 4g
  • Sugars: 8g
  • Sodium: 720mg

Why You’ll Love This Baked Feta Pasta

This isn’t just a recipe; it’s a movement. And for good reason. You’ll love it because it’s almost impossibly easy. You toss a few ingredients into a baking dish, let the oven do the heavy lifting, and then stir it all together with hot pasta. That’s it. The sauce is a dream—luxuriously creamy without a drop of cream, thanks to the oven-melted feta. It’s tangy, salty, and perfectly balanced by the sweet, roasted tomatoes. It feels fancy enough for a dinner party, but it’s so simple you can make it on a Tuesday night when you have zero energy left. Plus, it’s endlessly adaptable. Add protein, switch up the veggies, or toss in your favorite herbs. This is the kind of meal that makes you feel like a culinary genius with almost no effort.

The Complete Cooking Journey

Let’s walk through the process together, from start to finish. The magic begins when you place a block of feta in the center of a baking dish, surrounded by a sea of cherry tomatoes, garlic, and a generous glug of olive oil. A little salt, a little pepper, and a pinch of red pepper flakes for warmth. Into a hot oven it goes. While the feta softens and the tomatoes blister, you boil your pasta. The aromas that fill your kitchen are intoxicating—roasted garlic, sweet tomatoes, and that salty, creamy feta. When everything is ready, you pull the baking dish from the oven. The feta is soft and golden, the tomatoes are collapsed and juicy. You stir it all together, watching the feta break down into a silky, luscious sauce. Then, you add the hot pasta, a handful of fresh basil, and a splash of pasta water. Give it a good toss, and you’re done. It’s a bowl of pure comfort.

Ingredients:

  • 1 (8-ounce) block of feta cheese (use a block in brine for the best texture)
  • 2 pints (about 600g) cherry or grape tomatoes
  • 4 cloves garlic, smashed
  • 1/4 cup (60ml) extra-virgin olive oil, plus more for serving
  • 1/2 teaspoon red pepper flakes (optional, for a little heat)
  • 1/2 teaspoon salt
  • 1/4 teaspoon black pepper
  • 10 ounces (280g) dried pasta (short shapes like penne, fusilli, or ziti work best)
  • 1/3 cup (10g) fresh basil leaves, roughly chopped, plus more for garnish
  • 1/4 cup (60ml) reserved pasta water

Method:

Step 1: Preheat the Oven and Prepare the Baking Dish

Preheat your oven to 400°F (200°C). Choose a 9×13-inch baking dish or a similar-sized oven-safe skillet. You want the dish to be large enough that the tomatoes and feta have a little room to spread out.

Step 2: Assemble the Ingredients for Roasting

Place the block of feta cheese in the center of the baking dish. Arrange the cherry tomatoes all around it, nestling them close. Add the smashed garlic cloves to the dish. Drizzle the entire dish with the olive oil, then sprinkle the red pepper flakes (if using), salt, and black pepper over everything. Gently toss the tomatoes to coat them in the oil and seasonings, but leave the feta in place.

Step 3: Roast the Feta and Tomatoes

Place the baking dish in the preheated oven and roast for 30 to 35 minutes. The tomatoes should be blistered and starting to burst, and the feta should be soft and lightly golden on the edges. Don’t worry if the cheese looks a little dry—it will come together beautifully when you mix it.

Step 4: Cook the Pasta to Al Dente

While the feta and tomatoes are roasting, bring a large pot of salted water to a boil (about 1 tablespoon of salt for 4 quarts of water). Add your pasta and cook according to the package directions until it is al dente. Before draining, reserve about 1 cup of the pasta water. Drain the pasta well.

Step 5: Combine and Create the Creamy Sauce

Remove the baking dish from the oven. Immediately add the hot, drained pasta directly to the dish. Use a wooden spoon or a fork to break the soft feta block into smaller pieces. Stir everything together vigorously. The feta will break down completely, and the tomatoes will burst, creating a thick, creamy, rosy sauce. If the sauce seems too thick, add the reserved pasta water, a tablespoon at a time, until you reach your desired consistency. The starch in the pasta water helps the sauce cling to every noodle.

Step 6: Garnish and Serve

Add the chopped fresh basil to the pasta and stir gently to combine. Taste and adjust the seasoning with more salt or pepper if needed. Serve immediately, drizzled with a little extra olive oil and topped with more fresh basil.

Serving Suggestions & Pairings

This dish is a star on its own, but it loves company. Serve it alongside a simple green salad dressed with a lemon vinaigrette to cut through the richness. A side of crusty bread is perfect for sopping up any extra sauce left in the bowl. For a heartier meal, top each serving with grilled or pan-seared chicken, crispy chickpeas, or even a few sautéed shrimp. If you’re feeling fancy, finish the dish with a sprinkle of toasted pine nuts or a few shavings of Parmesan. A glass of crisp white wine, like a Sauvignon Blanc or a Pinot Grigio, is the perfect match.

Storage & Leftovers Guide

This pasta is wonderful the next day, if you can resist eating it all. Store any leftovers in an airtight container in the refrigerator for up to 3 days. The pasta may absorb some of the sauce as it sits, so when you reheat it, add a splash of water or a drizzle of olive oil to loosen it up. You can reheat it in a skillet over medium-low heat, stirring occasionally, or in the microwave in 30-second bursts. I don’t recommend freezing this dish, as the creamy texture of the sauce can become grainy when thawed.

Kitchen Wisdom & Success Tips

  • Use a block of feta, not crumbled. Feta sold in a block with brine has a much creamier texture than pre-crumbled feta, which is often coated in anti-caking agents and won’t melt as smoothly.
  • Don’t skip the pasta water. It’s the secret to a perfectly silky sauce. The starch helps the sauce emulsify and cling to the pasta.
  • Roast your tomatoes until they are truly blistered. You want them to look wrinkled and a little caramelized. This deepens their sweetness and creates a richer sauce.
  • Smash the garlic cloves. Leaving them whole and smashing them gently will infuse the oil with flavor without burning.
  • Work quickly. Once the feta and tomatoes come out of the oven, add the pasta immediately while everything is still hot. This helps the sauce come together perfectly.

Flavor Variations & Adaptations

  • Add Protein: Toss in 1 cup of cooked, shredded chicken, crumbled Italian sausage, or pan-fried chickpeas when you add the pasta.
  • Switch the Veggies: Add a handful of halved sun-dried tomatoes, a diced zucchini, or a cup of fresh spinach (stir it in at the end until it wilts).
  • Make it Vegan: Use a high-quality vegan feta block and a plant-based pasta. The technique works the same way.
  • Try Different Herbs: Swap the basil for fresh oregano, thyme, or even a little chopped rosemary for a different flavor profile.
  • Add a Crunchy Topping: Sprinkle the finished dish with toasted breadcrumbs, crispy fried shallots, or crushed red pepper flakes for texture.

Reader Questions & Solutions

Q: My feta didn’t melt into a creamy sauce. Why?

No-Bake Cheesecake

A: The most common culprit is the type of feta. You must use a block of feta that is stored in brine. Pre-crumbled feta will not melt properly. Also, make sure your oven is fully preheated to 400°F (200°C). If the feta isn’t getting soft and golden, it might need a few more minutes.

Q: Can I use a different type of cheese?

A: Absolutely. Goat cheese is a fantastic substitute and will give you a tangy, creamy sauce. A block of cream cheese (cut into chunks) will also work, though it will be milder and richer. Brie (with the rind removed) can be a decadent option.

Q: My sauce is too thin. What did I do wrong?

A: This usually happens if you added too much pasta water. Next time, start with just 2 tablespoons and add more as needed. Also, make sure you are using a short pasta shape that holds onto the sauce. Overcooking your pasta can also release more starch, thinning the sauce.

Q: I don’t have cherry tomatoes. What can I use?

A: You can use grape tomatoes, Roma tomatoes (cut into quarters), or even a can of whole peeled tomatoes (drained and crushed by hand). If using canned tomatoes, the roasting time may be shorter, so keep an eye on them.

Q: Can I make this in advance for a party?

A: You can roast the feta and tomatoes up to a day ahead. Let them cool, then store them in the baking dish, covered, in the refrigerator. When you’re ready to serve, reheat the dish in a 350°F (175°C) oven until hot, then proceed with the pasta. The sauce may need a little extra pasta water to loosen up.

Q: How do I make it spicy?

A: Increase the red pepper flakes to 1 teaspoon, or add a finely chopped fresh chili pepper (like a serrano or jalapeño) to the tomatoes before roasting. You can also drizzle the finished dish with chili oil.

Wrapping Up

This Baked Feta Pasta is more than a recipe; it’s a reminder that the best meals are often the simplest. It’s proof that you can create something truly special with just a handful of humble ingredients and a little bit of heat. I hope this dish becomes a staple in your kitchen, just like it has in mine. So go ahead, treat yourself. Your future self (and your taste buds) will thank you. Happy cooking, friends!

No-Bake Cheesecake - pin

Print

No-Bake Cheesecake Pasta

5 Stars 4 Stars 3 Stars 2 Stars 1 Star

No reviews

This recipe is a revelation. The feta cheese melts into a creamy, tangy, and salty sauce that clings to every piece of pasta. The tomatoes burst, releasing their sweet, jammy juices. The result is a simple yet stunning dish that feels special. This is a perfect weeknight meal, no energy required.

  • Prep Time: 10 minutes
  • Cook Time: 15 minutes
  • Total Time: 45 minutes
  • Yield: 4 servings 1x
  • Category: Vegetarian, Paleo, Keto
  • Cuisine: Gourmet
  • Diet: Low calorie, low fat, high protein

Ingredients


Scale

1 (8-ounce) block of feta cheese (in brine for best texture)
2 pints (about 600g) cherry or grape tomatoes
4 cloves garlic, smashed
1/4 cup (60ml) extra-virgin olive oil
1/2 teaspoon red pepper flakes (optional, for heat)
1/2 teaspoon salt
1/4 teaspoon black pepper
10 ounces (280g) dried pasta (short shapes like penne, fusilli, or ziti)
1/3 cup (10g) fresh basil leaves, roughly chopped
1/4 cup (60ml) reserved pasta water

Instructions

Preheat the oven to 400°F (200°C). Choose a 9×13-inch baking dish or a similar-sized oven-safe skillet.
Place the block of feta cheese in the center of the baking dish. Arrange the cherry tomatoes all around it, nestling them close.
Add the smashed garlic cloves on top of the tomatoes.
Drizzle with extra-virgin olive oil and sprinkle with red pepper flakes, salt, and black pepper.
Bake for 15 minutes.
While the feta softens and the tomatoes blister, boil your pasta.
When everything is ready, pull the baking dish from the oven.
Drizzle with more olive oil and garnish with fresh basil leaves.
Garnish with freshly chopped basil and a splash of reserved pasta water.
Stir and serve.

Nutrition

  • Calories: 485 kcal
  • Sugar: 8g
  • Sodium: 720mg
  • Fat: 24g
  • Carbohydrates: 52g
  • Fiber: 4g
  • Protein: 16g

Did you make this recipe?

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

window.trCommon={“minRating”:6,”ajaxurl”:”https://www.thestationrecipes.com/wp-admin/admin-ajax.php”,”ratingNonce”:””,”postId”:16317};
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 );
});

Scroll to Top