If you’re looking for a meal that’s quick, satisfying, and bursting with flavor, you’ve come to the right place! These Honey Garlic Chicken Rice Bowls (30-Minutes) are a family favorite in my house. They combine juicy chicken pieces with a sticky honey garlic glaze that leaves everyone asking for seconds. Plus, they’re perfect for those busy weeknights when you need to whip up something delicious in no time.

What makes this recipe special is its versatility. You can easily customize it to cater to your family’s tastes or whatever veggies you have on hand. Whether it’s a cozy dinner after a long day or a fun family gathering, these rice bowls bring everyone together around the table.


Why You’ll Love This Recipe
- Quick and Easy: Ready in just 30 minutes—perfect for busy weeknights.
- Family-Friendly: Kids love the sweet and savory flavors; it’s always a hit!
- Customizable: Use your favorite vegetables and adjust the spice level to suit your taste.
- Meal Prep Friendly: Make a big batch ahead of time for delicious lunches throughout the week.
- Deliciously Flavorful: The honey garlic sauce is irresistible and adds zing to every bite!
Ingredients You’ll Need
Gathering the ingredients for these Honey Garlic Chicken Rice Bowls is easy! You’ll find that they are simple, wholesome, and likely already in your pantry or fridge. Let’s take a look at what you’ll need:
For the Chicken
- 1 lb boneless skinless chicken thighs or breasts, cut into bite-sized pieces
- 1 tablespoon vegetable oil, for sautéing
- Salt and pepper, to taste
For the Honey Garlic Sauce
- 1/3 cup honey
- 1/4 cup soy sauce, low-sodium preferred
- 2 tablespoons rice vinegar
- 3-4 cloves garlic, minced
- 1 teaspoon cornstarch + 1 tablespoon water, mixed to make a slurry
For the Bowl
- 2 cups cooked jasmine or brown rice
- 2 cups mixed vegetables, such as broccoli, bell peppers, snap peas, and carrots
- 1 tablespoon sesame oil or olive oil, optional for stir-frying vegetables
- Sliced green onions
- Toasted sesame seeds
- Red pepper flakes or sriracha, for some heat if desired
Variations
The beauty of this recipe lies in its flexibility! Feel free to mix things up based on your preferences or what you have available at home. Here are some fun ideas:
- Swap the protein: Use chicken breast instead of thighs for leaner options, or try tofu for a vegetarian twist!
- Change up the veggies: Toss in whatever vegetables you enjoy—zucchini, cauliflower, or snap peas work great!
- Add some crunch: Top with crushed peanuts or cashews for an added texture.
- Make it spicy: Add chili paste or fresh chilies into the sauce if you like heat!
How to Make Honey Garlic Chicken Rice Bowls (30-Minutes)
Step 1: Prepare the Rice
Start by cooking your rice according to package instructions. Jasmine rice gives a fragrant base while brown rice offers more fiber. Having your rice ready first ensures everything comes together smoothly!
Step 2: Sauté the Chicken
In a large skillet over medium-high heat, add vegetable oil. Once hot, season your chicken pieces with salt and pepper before adding them to the pan. Sauté until golden brown and cooked through—this usually takes about 5-7 minutes. Cooking them well ensures every bite is juicy and flavorful.
Step 3: Make the Honey Garlic Sauce
In a separate bowl, combine honey, soy sauce, rice vinegar, minced garlic, and cornstarch slurry. Pour this mixture over the cooked chicken in your skillet. Stir well and let it simmer for about 2-3 minutes until everything thickens nicely. This step creates that delicious sticky glaze we all love!
Step 4: Stir-Fry the Veggies
In another pan (or right after cooking chicken if there’s space), heat sesame oil over medium heat. Add mixed vegetables and stir-fry for about 3-5 minutes until they are vibrant and tender-crisp. This not only brings out their sweetness but also adds color to your dish!
Step 5: Assemble Your Bowls
Now comes the fun part! In serving bowls, layer cooked rice first, followed by sautéed veggies and glazed chicken on top. Finish with sliced green onions, toasted sesame seeds, and a sprinkle of red pepper flakes or sriracha if you like it spicy.
And there you go! Your Honey Garlic Chicken Rice Bowls are ready to be enjoyed—perfectly balanced between sweet and savory flavors that will have everyone coming back for more!
Pro Tips for Making Honey Garlic Chicken Rice Bowls (30-Minutes)
Creating a delicious Honey Garlic Chicken Rice Bowl is a breeze with these handy tips!
Prep Your Ingredients First: Having all your ingredients chopped and ready to go saves time and helps you avoid any last-minute scrambling. This allows you to focus on cooking and ensures everything cooks evenly.
Use High Heat for Searing: When sautéing the chicken, make sure your pan is hot enough. This will give the chicken a nice sear and lock in the juices, resulting in tender and flavorful pieces.
Customize Your Veggies: Feel free to swap out vegetables based on what you have on hand or prefer. Zucchini, green beans, or bok choy are excellent alternatives that can add variety to your meal.
Make Extra Sauce: If you’re a fan of saucy dishes, consider doubling the honey garlic sauce. This way, you can drizzle more over your bowl or save it for future meals.
Serve Immediately for Best Flavor: For the best taste and texture, serve the bowls right after cooking. The freshness of the ingredients shines through when enjoyed immediately.
How to Serve Honey Garlic Chicken Rice Bowls (30-Minutes)
Presenting your Honey Garlic Chicken Rice Bowls can turn an everyday meal into a delightful dining experience. Here are some ideas to elevate your dish!
Garnishes
- Sliced Green Onions: These add a fresh crunch and vibrant color to your bowl.
- Toasted Sesame Seeds: A sprinkle of these provides a nutty flavor that complements the sweetness of the sauce.
- Red Pepper Flakes or Sriracha: For those who enjoy a little heat, adding these can enhance the overall flavor profile of your dish.
Side Dishes
- Steamed Edamame: Lightly salted edamame makes a great protein-packed side that’s simple to prepare.
- Cucumber Salad: A refreshing cucumber salad adds a crispness that balances the sticky sweetness of the chicken.
- Miso Soup: This warm soup is comforting and pairs nicely with Asian-inspired dishes like this rice bowl.
- Fruit Salad: A light fruit salad with seasonal fruits can cleanse the palate after this savory meal and adds a touch of sweetness.
With these serving suggestions, your Honey Garlic Chicken Rice Bowl will be both satisfying and visually appealing! Enjoy the delightful combination of flavors while making it your own.
Make Ahead and Storage
This Honey Garlic Chicken Rice Bowl is not only quick to prepare but also makes for an excellent meal prep option! You can easily cook a batch ahead of time, ensuring that you have a delicious and nutritious meal ready to go throughout the week.
Storing Leftovers
- Allow the chicken and rice to cool completely before storing.
- Place the chicken, rice, and vegetables in an airtight container.
- Store in the refrigerator for up to 3-4 days.
- To keep flavors fresh, consider storing the sauce separately if possible.
Freezing
- Portion out the chicken, rice, and vegetables into freezer-safe containers or bags.
- Make sure to remove as much air as possible before sealing to prevent freezer burn.
- Freeze for up to 2-3 months. Label with the date for easy tracking.
Reheating
- Thaw overnight in the refrigerator if frozen.
- Reheat in a microwave-safe bowl for about 2-3 minutes or until heated through, stirring halfway.
- For best results, reheat on the stovetop over medium heat until hot, adding a splash of water or broth to keep it moist.
FAQs
Have questions? You’re in the right place! Here are some common queries about Honey Garlic Chicken Rice Bowls (30-Minutes):
Can I make Honey Garlic Chicken Rice Bowls (30-Minutes) with other proteins?
Absolutely! This recipe works wonderfully with tofu, shrimp, or even beef. Just adjust cooking times accordingly based on your choice of protein.
What vegetables can I use for Honey Garlic Chicken Rice Bowls (30-Minutes)?
Feel free to mix and match your favorite veggies! Options like bell peppers, snap peas, carrots, and zucchini all work beautifully in this dish.
How can I make Honey Garlic Chicken Rice Bowls (30-Minutes) spicier?
For an extra kick, add red pepper flakes or a dash of sriracha when cooking. You can also serve it with sliced jalapeños on top for added heat!
Is it necessary to use jasmine rice?
Not at all! You can substitute jasmine rice with brown rice or any grain of your choice like quinoa or cauliflower rice for a lower-carb option.
Final Thoughts
I hope you enjoy making these delightful Honey Garlic Chicken Rice Bowls as much as I do! They are quick, customizable, and bursting with flavor – perfect for busy weeknights or meal prepping. Enjoy this dish with your loved ones and feel free to experiment with different ingredients. Happy cooking!

Honey Garlic Chicken Rice Bowls (30-Minutes)
Prep Time:
10 minutesCook Time:
20 minutesTotal Time:
30 minutesYield:
Serves 4Category:
DinnerMethod:
SautéingCuisine:
Asian
Description
If you’re on the hunt for a delicious meal that can be whipped up in just 30 minutes, these Honey Garlic Chicken Rice Bowls are the perfect solution! This dish features tender chicken pieces glazed in a sweet and savory honey garlic sauce, accompanied by vibrant mixed vegetables and fluffy rice. It’s a family favorite that not only satisfies hunger but also brings everyone together at the dinner table. Customizable and quick to prepare, this recipe is ideal for busy weeknights or meal prepping for the week ahead. Enjoy a flavorful and balanced meal that pleases both kids and adults alike!
Ingredients
Scale
- 1 lb boneless skinless chicken thighs or breasts
- 1 tablespoon vegetable oil
- Salt and pepper to taste
- 1/3 cup honey
- 1/4 cup low-sodium soy sauce
- 2 tablespoons rice vinegar
- 3–4 cloves garlic, minced
- 1 teaspoon cornstarch + 1 tablespoon water (slurry)
- 2 cups cooked jasmine or brown rice
- 2 cups mixed vegetables (broccoli, bell peppers, snap peas, carrots)
- 1 tablespoon sesame oil or olive oil (optional)
- Sliced green onions
- Toasted sesame seeds
- Red pepper flakes or sriracha (optional)
Instructions
- Cook the rice according to package instructions.
- Heat vegetable oil in a large skillet over medium-high heat. Season chicken with salt and pepper; sauté for 5-7 minutes until golden brown.
- In a bowl, mix honey, soy sauce, rice vinegar, minced garlic, and cornstarch slurry. Pour over cooked chicken and simmer for 2-3 minutes until thickened.
- Stir-fry mixed vegetables in sesame oil until tender-crisp (about 3-5 minutes).
- Assemble bowls with rice as the base, topped with veggies and glazed chicken. Garnish as desired.
Nutrition
- Serving Size: 1 bowl (approx. 350g)
- Calories: 450
- Sugar: 20g
- Sodium: 800mg
- Fat: 10g
- Saturated Fat: 2g
- Unsaturated Fat: 8g
- Trans Fat: 0g
- Carbohydrates: 60g
- Fiber: 4g
- Protein: 30g
- Cholesterol: 80mg
window.trCommon={“minRating”:6,”ajaxurl”:”https:\/\/www.easycookinspo.com\/wp-admin\/admin-ajax.php”,”ratingNonce”:”d6999d9e8c”,”postId”:1549};
window.TastyRecipes = window.TastyRecipes || {};
window.TastyRecipes.smoothScroll = {
init() {
document.addEventListener( ‘click’, ( e ) => {
let anchor = e.target;
if ( anchor.tagName !== ‘A’ ) {
anchor = anchor.closest( ‘a.tasty-recipes-scrollto’ );
}
if ( ! anchor || ! anchor.classList.contains( ‘tasty-recipes-scrollto’ ) ) {
return;
}
const elementHref = anchor.getAttribute( ‘href’ );
if ( ! elementHref ) {
return;
}
e.preventDefault();
this.goToSelector( elementHref );
});
},
goToSelector( selector ) {
const element = document.querySelector( selector );
if ( ! element ) {
return;
}
element.scrollIntoView( { behavior: ‘smooth’ } );
}
};
document.addEventListener(
‘DOMContentLoaded’,
() => window.TastyRecipes.smoothScroll.init()
);
(function(){
var bothEquals = function( d1, d2, D ) {
var ret = 0;
if (d1<=D) {
ret++;
}
if (d2<=D) {
ret++;
}
return ret === 2;
};
var frac =function frac(x,D,mixed){var n1=Math.floor(x),d1=1;var n2=n1+1,d2=1;if(x!==n1){while(bothEquals(d1,d2,D)){var m=(n1+n2)/(d1+d2);if(x===m){if(d1+d2d2){d2=D+1;}else {d1=D+1;}break}else if(xD){d1=d2;n1=n2}if(!mixed){return[0,n1,d1];}var q=Math.floor(n1/d1);return[q,n1-q*d1,d1]};frac.cont=function cont(x,D,mixed){var sgn=x<0?-1:1;var B=x*sgn;var P_2=0,P_1=1,P=0;var Q_2=1,Q_1=0,Q=0;var A=Math.floor(B);while(Q_1<D){A=Math.floor(B);P=A*P_1+P_2;Q=A*Q_1+Q_2;if(B-AD){if(Q_1>D){Q=Q_2;P=P_2}else{Q=Q_1;P=P_1}}if(!mixed){return[0,sgn*P,Q];}var q=Math.floor(sgn*P/Q);return[q,sgn*P-q*Q,Q]};
window.tastyRecipesVulgarFractions = JSON.parse(decodeURIComponent(“%7B%22%C2%BC%22%3A%221%2F4%22%2C%22%C2%BD%22%3A%221%2F2%22%2C%22%C2%BE%22%3A%223%2F4%22%2C%22%E2%85%93%22%3A%221%2F3%22%2C%22%E2%85%94%22%3A%222%2F3%22%2C%22%E2%85%95%22%3A%221%2F5%22%2C%22%E2%85%96%22%3A%222%2F5%22%2C%22%E2%85%97%22%3A%223%2F5%22%2C%22%E2%85%98%22%3A%224%2F5%22%2C%22%E2%85%99%22%3A%221%2F6%22%2C%22%E2%85%9A%22%3A%225%2F6%22%2C%22%E2%85%9B%22%3A%221%2F8%22%2C%22%E2%85%9C%22%3A%223%2F8%22%2C%22%E2%85%9D%22%3A%225%2F8%22%2C%22%E2%85%9E%22%3A%227%2F8%22%7D”));
window.tastyRecipesFormatAmount = function(amount, el) {
if ( parseFloat( amount ) === parseInt( amount ) ) {
return amount;
}
var roundType = ‘frac’;
if (typeof el.dataset.amountShouldRound !== ‘undefined’) {
if (‘false’ !== el.dataset.amountShouldRound) {
if ( ‘number’ === el.dataset.amountShouldRound ) {
roundType = ‘number’;
} else if (‘frac’ === el.dataset.amountShouldRound) {
roundType = ‘frac’;
} else if (‘vulgar’ === el.dataset.amountShouldRound) {
roundType = ‘vulgar’;
} else {
roundType = ‘integer’;
}
}
}
if (‘number’ === roundType) {
amount = Number.parseFloat(amount).toPrecision(2);
} else if (‘integer’ === roundType) {
amount = Math.round(amount);
} else if (‘frac’ === roundType || ‘vulgar’ === roundType) {
var denom = 8;
if (typeof el.dataset.unit !== ‘undefined’) {
var unit = el.dataset.unit;
if ([‘cups’,’cup’,’c’].includes(unit)) {
denom = 4;
if (0.125 === amount) {
denom = 8;
}
if (“0.1667″ === Number.parseFloat( amount ).toPrecision(4)) {
denom = 6;
}
}
if ([‘tablespoons’,’tablespoon’,’tbsp’].includes(unit)) {
denom = 2;
}
if ([‘teaspoons’,’teaspoon’,’tsp’].includes(unit)) {
denom = 8;
}
}
var amountArray = frac.cont( amount, denom, true );
var newAmount = ”;
if ( amountArray[1] !== 0 ) {
newAmount = amountArray[1] + ‘/’ + amountArray[2];
if (‘vulgar’ === roundType) {
Object.keys(window.tastyRecipesVulgarFractions).forEach(function(vulgar) {
if (newAmount === window.tastyRecipesVulgarFractions[vulgar]) {
newAmount = vulgar;
}
});
}
}
if ( newAmount ) {
newAmount = ‘ ‘ + newAmount;
}
if ( amountArray[0] ) {
newAmount = amountArray[0] + newAmount;
}
amount = newAmount;
}
return amount;
};
window.tastyRecipesUpdatePrintLink = () => {
const printButton = document.querySelector( ‘.tasty-recipes-print-button’ );
if ( ! printButton ) {
return;
}
const printURL = new URL( printButton.href );
const searchParams = new URLSearchParams( printURL.search );
const unitButton = document.querySelector( ‘.tasty-recipes-convert-button-active’ );
const scaleButton = document.querySelector( ‘.tasty-recipes-scale-button-active’ );
let unit = ”;
let scale = ”;
if ( unitButton ) {
unit = unitButton.dataset.unitType;
searchParams.delete(‘unit’);
searchParams.set( ‘unit’, unit );
}
if ( scaleButton ) {
scale = scaleButton.dataset.amount;
searchParams.set( ‘scale’, scale );
}
const paramString = searchParams.toString();
const newURL = ” === paramString ? printURL.href : printURL.origin + printURL.pathname + ‘?’ + paramString;
const printLinks = document.querySelectorAll( ‘.tasty-recipes-print-link’ );
printLinks.forEach( ( el ) => {
el.href = newURL;
});
const printButtons = document.querySelectorAll( ‘.tasty-recipes-print-button’ );
printButtons.forEach( ( el ) => {
el.href = newURL;
});
};
document.addEventListener( ‘DOMContentLoaded’, () => {
if ( ! window.location.href.includes( ‘/print/’ ) ) {
return;
}
const searchParams = new URLSearchParams( window.location.search );
const unit = searchParams.get( ‘unit’ );
const scale = searchParams.get( ‘scale’ );
if ( unit && ( ‘metric’ === unit || ‘usc’ === unit ) ) {
document.querySelector( ‘.tasty-recipes-convert-button[data-unit-type=”‘ + unit + ‘”]’ ).click();
}
if ( scale && Number(scale) > 0 ) {
document.querySelector( ‘.tasty-recipes-scale-button[data-amount=”‘ + Number(scale) + ‘”]’ ).click();
}
});
}());
(function(){
var buttonClass = ‘tasty-recipes-scale-button’,
buttonActiveClass = ‘tasty-recipes-scale-button-active’,
buttons = document.querySelectorAll(‘.tasty-recipes-scale-button’);
if ( ! buttons ) {
return;
}
buttons.forEach(function(button){
button.addEventListener(‘click’, function(event){
event.preventDefault();
var recipe = event.target.closest(‘.tasty-recipes’);
if ( ! recipe ) {
return;
}
var otherButtons = recipe.querySelectorAll(‘.’ + buttonClass);
otherButtons.forEach(function(bt){
bt.classList.remove(buttonActiveClass);
});
button.classList.add(buttonActiveClass);
var scalables = recipe.querySelectorAll(‘span[data-amount]’);
var buttonAmount = parseFloat( button.dataset.amount );
scalables.forEach(function(scalable){
if (typeof scalable.dataset.amountOriginalType === ‘undefined’
&& typeof scalable.dataset.nfOriginal === ‘undefined’) {
if (-1 !== scalable.innerText.indexOf(‘/’)) {
scalable.dataset.amountOriginalType = ‘frac’;
}
if (-1 !== scalable.innerText.indexOf(‘.’)) {
scalable.dataset.amountOriginalType = ‘number’;
}
Object.keys(window.tastyRecipesVulgarFractions).forEach(function(vulgar) {
if (-1 !== scalable.innerText.indexOf(vulgar)) {
scalable.dataset.amountOriginalType = ‘vulgar’;
}
});
if (typeof scalable.dataset.amountOriginalType !== ‘undefined’) {
scalable.dataset.amountShouldRound = scalable.dataset.amountOriginalType;
}
}
var amount = parseFloat( scalable.dataset.amount ) * buttonAmount;
amount = window.tastyRecipesFormatAmount(amount, scalable);
if ( typeof scalable.dataset.unit !== ‘undefined’ ) {
if ( ! scalable.classList.contains(‘nutrifox-quantity’) ) {
if ( ! scalable.classList.contains(‘nutrifox-second-quantity’) ) {
amount += ‘ ‘ + scalable.dataset.unit;
}
}
}
scalable.innerText = amount;
});
var nonNumerics = recipe.querySelectorAll(‘[data-has-non-numeric-amount]’);
nonNumerics.forEach(function(nonNumeric){
var indicator = nonNumeric.querySelector(‘span[data-non-numeric-label]’);
if ( indicator ) {
nonNumeric.removeChild(indicator);
}
if ( 1 !== buttonAmount ) {
indicator = document.createElement(‘span’);
indicator.setAttribute(‘data-non-numeric-label’, true);
var text = document.createTextNode(‘ (x’ + buttonAmount + ‘)’);
indicator.appendChild(text);
nonNumeric.appendChild(indicator);
}
});
window.tastyRecipesUpdatePrintLink();
});
});
}());
window.TastyRecipes = window.TastyRecipes || {};
window.TastyRecipes.cookMode = {
wakeLockApi: false,
wakeLock: false,
cookModeSelector: ‘.tasty-recipes-cook-mode’,
init() {
if (“wakeLock” in navigator && “request” in navigator.wakeLock) {
this.wakeLockApi = navigator.wakeLock;
}
const cookModes = document.querySelectorAll(this.cookModeSelector);
if (cookModes.length > 0) {
for (const cookMode of cookModes) {
if (this.wakeLockApi) {
cookMode.querySelector(‘input[type=”checkbox”]’).addEventListener(“change”, event => {
this.checkboxChange(event.target);
}, false);
} else {
cookMode.style.display = “none”;
}
}
}
},
checkboxChange(checkbox) {
if (checkbox.checked) {
this.lock();
} else {
this.unlock();
}
},
setCheckboxesState(state) {
const checkboxes = document.querySelectorAll(this.cookModeSelector + ‘ input[type=”checkbox”]’);
for (const checkbox of checkboxes) {
checkbox.checked = state;
}
},
async lock() {
try {
this.wakeLock = await this.wakeLockApi.request(“screen”);
this.wakeLock.addEventListener(“release”, () => {
this.wakeLock = false;
this.setCheckboxesState(false);
});
this.setCheckboxesState(true);
} catch (error) {
this.setCheckboxesState(false);
}
},
unlock() {
if (this.wakeLock) {
this.wakeLock.release();
this.wakeLock = false;
}
this.setCheckboxesState(false);
}
};
(function(callback) {
if (document.readyState !== “loading”) {
callback();
} else {
document.addEventListener(“DOMContentLoaded”, callback);
}
})(() => {
window.TastyRecipes.cookMode.init();
});
window.TastyRecipes = window.TastyRecipes || {};
window.TastyRecipes.staticTooltip = {
element: null,
tooltipElement: null,
deleting: false,
init( element ) {
if ( this.deleting ) {
return;
}
this.element = element;
this.buildElements();
},
destroy() {
if ( ! this.tooltipElement || this.deleting ) {
return;
}
this.deleting = true;
this.tooltipElement.classList.remove( ‘opened’ );
setTimeout( () => {
this.tooltipElement.remove();
this.deleting = false;
}, 500 );
},
buildElements() {
const tooltipElement = document.createElement( ‘div’ );
tooltipElement.classList.add( ‘tasty-recipes-static-tooltip’);
tooltipElement.setAttribute( ‘id’, ‘tasty-recipes-tooltip’ );
const currentTooltipElement = document.getElementById( ‘tasty-recipes-tooltip’ );
if ( currentTooltipElement ) {
document.body.replaceChild( tooltipElement, currentTooltipElement );
} else {
document.body.appendChild( tooltipElement );
}
this.tooltipElement = document.getElementById( ‘tasty-recipes-tooltip’ );
},
show() {
if ( ! this.tooltipElement ) {
return;
}
const tooltipTop = this.element.getBoundingClientRect().top
+ window.scrollY
– 10 // 10px offset.
– this.tooltipElement.getBoundingClientRect().height;
const tooltipLeft = this.element.getBoundingClientRect().left
– ( this.tooltipElement.getBoundingClientRect().width / 2 )
+ ( this.element.getBoundingClientRect().width / 2 ) – 1;
const posLeft = Math.max( 10, tooltipLeft );
this.maybeRemoveTail( posLeft !== tooltipLeft );
this.tooltipElement.setAttribute( ‘style’, ‘top:’ + tooltipTop + ‘px;left:’ + posLeft + ‘px;’ );
this.tooltipElement.classList.add( ‘opened’ );
},
maybeRemoveTail( removeTail ) {
if ( removeTail ) {
this.tooltipElement.classList.add( ‘tr-hide-tail’ );
} else {
this.tooltipElement.classList.remove( ‘tr-hide-tail’ );
}
},
changeMessage( message ) {
if ( ! this.tooltipElement ) {
return;
}
this.tooltipElement.innerHTML = message;
}
};
window.TastyRecipes.ajax = {
sendPostRequest( url, data, success, failure ) {
const xhr = new XMLHttpRequest();
xhr.open( ‘POST’, url, true );
xhr.send( this.preparePostData( data ) );
xhr.onreadystatechange = () => {
if ( 4 !== xhr.readyState ) {
return;
}
if ( xhr.status === 200 ) {
success( JSON.parse( xhr.responseText ) );
return;
}
failure( xhr );
};
xhr.onerror = () => {
failure( xhr );
};
},
preparePostData( data ) {
const formData = new FormData();
for ( const key in data ) {
formData.append( key, data[key] );
}
return formData;
},
};
window.TastyRecipes.ratings = {
defaultRating: 0,
currentRatingPercentage: 100,
savingRating: false,
init( minRating ) {
this.minRating = minRating;
this.formWatchRating();
this.closeTooltipWhenClickOutside();
this.addBodyClassBasedOnSelectedRating();
this.backwardCompFormRatingPosition();
},
formWatchRating() {
const ratings = document.querySelectorAll(‘.tasty-recipes-no-ratings-buttons [data-rating]’);
if ( ratings.length {
event.preventDefault();
this.defaultRating = event.target.closest( ‘.checked’ ).dataset.rating;
this.setCheckedStar( event.target );
this.maybeSendRating( this.defaultRating, event.target );
this.setRatingInForm( this.defaultRating );
} );
}
},
closeTooltipWhenClickOutside() {
window.addEventListener( ‘click’, e => {
// Bailout (don’t remove the tooltip) when the clicked element is a rating star, or it’s the tooltip itself.
if ( e.target.closest( ‘.tasty-recipes-rating’ ) || e.target.classList.contains( ‘tasty-recipes-static-tooltip’ ) ) {
return;
}
window.TastyRecipes.staticTooltip.destroy();
} );
},
setRatingInForm( rating ) {
const ratingInput = document.querySelector( ‘#respond .tasty-recipes-rating[value=”‘ + rating + ‘”]’ );
if ( ! ratingInput ) {
return;
}
ratingInput.click();
},
addBodyClassBasedOnSelectedRating() {
const ratingInputs = document.querySelectorAll( ‘input.tasty-recipes-rating’ );
if ( ! ratingInputs ) {
return;
}
for ( const ratingInput of ratingInputs ) {
ratingInput.addEventListener( ‘click’, currentEvent => {
const selectedRating = currentEvent.target.getAttribute( ‘value’ );
this.handleBodyClassByRating( selectedRating );
this.toggleCommentTextareaRequired( selectedRating );
} );
}
},
handleBodyClassByRating( rating ) {
if ( rating < this.minRating ) {
document.body.classList.remove( 'tasty-recipes-selected-minimum-rating' );
return;
}
document.body.classList.add( 'tasty-recipes-selected-minimum-rating' );
},
toggleCommentTextareaRequired( rating ) {
const commentTextarea = document.getElementById( 'comment' );
if ( ! commentTextarea ) {
return;
}
if ( rating {
window.TastyRecipes.staticTooltip.changeMessage( response.data.message );
window.TastyRecipes.staticTooltip.show();
this.updateAverageText( response.data, recipeCardElement );
this.maybeFillCommentForm( response.data );
// Hide the tooltip after 5 seconds.
setTimeout( () => {
this.maybeResetTooltip( recipeCardElement, response.data, rating );
}, 5000 );
},
() => {
this.resetTooltip( recipeCardElement );
}
);
},
updateAverageText( data, recipeCardElement ) {
if ( ! data.average ) {
return;
}
this.setRatingPercent( data );
if ( ! data.count ) {
return;
}
const quickLink = document.querySelector( ‘.tasty-recipes-rating-link’ );
if ( quickLink ) {
this.setTextInContainer( quickLink, data );
this.setPartialStar( quickLink );
}
const cardStars = recipeCardElement.querySelector( ‘.tasty-recipes-ratings-buttons’ );
cardStars.dataset.trDefaultRating = data.average;
this.setTextInContainer( recipeCardElement.querySelector( ‘.tasty-recipes-rating’ ), data );
},
setTextInContainer( container, data ) {
if ( ! container ) {
return;
}
if ( data.label ) {
const ratingLabelElement = container.querySelector( ‘.rating-label’ );
if ( ratingLabelElement ) {
ratingLabelElement.innerHTML = data.label;
}
return;
}
const averageElement = container.querySelector( ‘.average’ );
if ( averageElement ) {
averageElement.textContent = data.average;
}
const countElement = container.querySelector( ‘.count’ );
if ( countElement ) {
countElement.textContent = data.count;
}
},
setPartialStar( container ) {
const highestStar = container.querySelector( ‘[data-rating=”‘ + Math.ceil( this.defaultRating ) + ‘”]’ );
if ( highestStar ) {
highestStar.dataset.trClip = this.currentRatingPercentage;
}
},
setRatingPercent( data ) {
this.defaultRating = data.average.toFixed( 1 );
const parts = data.average.toFixed( 2 ).toString().split( ‘.’ );
this.currentRatingPercentage = parts[1] ? parts[1] : 100;
if ( this.currentRatingPercentage === ’00’ ) {
this.currentRatingPercentage = 100;
}
},
setCheckedStar( target ) {
const cardRatingContainer = target.closest( ‘.tasty-recipes-ratings-buttons’ );
const selectedRatingElement = cardRatingContainer.querySelector( ‘[data-tr-checked]’ );
if ( selectedRatingElement ) {
delete selectedRatingElement.dataset.trChecked;
}
const thisStar = target.closest( ‘.tasty-recipes-rating’ );
thisStar.dataset.trChecked = 1;
thisStar.querySelector( ‘[data-tr-clip]’ ).dataset.trClip = 100;
},
maybeFillCommentForm( data ) {
if ( ! data.comment || ! data.comment.content ) {
return;
}
const commentForm = document.querySelector( ‘#commentform’ );
if ( ! commentForm ) {
return;
}
const commentBox = commentForm.querySelector( ‘[name=comment]’ );
if ( ! commentBox || commentBox.value ) {
return;
}
// Add comment details for editing.
commentBox.innerHTML = data.comment.content;
if ( data.comment.name ) {
commentForm.querySelector( ‘[name=author]’ ).value = data.comment.name;
commentForm.querySelector( ‘[name=email]’ ).value = data.comment.email;
}
},
maybeResetTooltip( recipeCardElement, data, rating ) {
if ( this.savingRating === rating ) {
this.resetTooltip( recipeCardElement, data );
}
},
resetTooltip( recipeCardElement, data ) {
window.TastyRecipes.staticTooltip.destroy();
this.savingRating = false;
// Reset the default rating.
const cardRatingContainer = recipeCardElement.querySelector( ‘.tasty-recipes-ratings-buttons’ );
if ( cardRatingContainer ) {
this.defaultRating = ( data && data.average ) ? data.average.toFixed(1) : cardRatingContainer.dataset.trDefaultRating;
cardRatingContainer.dataset.trDefaultRating = this.defaultRating;
this.resetSelectedStar( cardRatingContainer, data );
}
},
resetSelectedStar( cardRatingContainer ) {
const selectedRatingElement = cardRatingContainer.querySelector( ‘[data-rating=”‘ + Math.ceil( this.defaultRating ) + ‘”]’ );
if ( selectedRatingElement ) {
selectedRatingElement.querySelector( ‘[data-tr-clip]’ ).dataset.trClip = this.currentRatingPercentage;
selectedRatingElement.parentNode.dataset.trChecked = 1;
}
const previousSelectedElement= cardRatingContainer.querySelector( ‘[data-tr-checked]’ );
if ( previousSelectedElement ) {
const currentSelectedRating = previousSelectedElement.querySelector(‘[data-rating]’);
if ( currentSelectedRating !== selectedRatingElement ) {
delete previousSelectedElement.dataset.trChecked;
}
}
},
backwardCompFormRatingPosition() {
const ratingsButtons = document.querySelector( ‘#respond .tasty-recipes-ratings-buttons, #tasty-recipes-comment-rating .tasty-recipes-ratings-buttons’ );
if ( ! ratingsButtons ) {
return;
}
const ratingsButtonsStyles = window.getComputedStyle(ratingsButtons);
if ( ! ratingsButtonsStyles.display.includes( ‘flex’ ) ) {
ratingsButtons.style.direction = ‘rtl’;
}
if ( typeof tastyRecipesRating !== ‘undefined’ ) {
// Select the rating that was previously selected in admin.
ratingsButtons.querySelector( ‘.tasty-recipes-rating[value=”‘ + tastyRecipesRating + ‘”]’ ).checked = true;
}
const ratingSpans = ratingsButtons.querySelectorAll( ‘.tasty-recipes-rating’ );
for (const ratingSpan of ratingSpans) {
ratingSpan.addEventListener( ‘click’, event => {
if ( ratingSpan === event.target ) {
return;
}
ratingSpan.previousElementSibling.click();
} );
}
}
};
(function(callback) {
if (document.readyState !== “loading”) {
callback();
} else {
window.addEventListener( ‘load’, callback );
}
})(() => {
window.TastyRecipes.ratings.init( window.trCommon ? window.trCommon.minRating : 4 );
});



Leave a Comment