File: /var/www/html/wp-content/plugins/wp-recipe-maker/assets/js/public/manager.js
window.WPRecipeMaker = typeof window.WPRecipeMaker === "undefined" ? {} : window.WPRecipeMaker;
window.WPRecipeMaker.manager = {
init: () => {
},
recipes: {},
findRecipesOnPage: () => {
let recipes = [];
const potentialRecipes = document.querySelectorAll( '*[data-recipe-id]' );
for ( let potentialRecipe of potentialRecipes ) {
const id = parseInt( potentialRecipe.dataset.recipeId );
if ( id ) {
recipes.push( id );
}
}
// Return unique IDs.
return [ ...new Set( recipes ) ];
},
resetRecipe: ( id ) => {
if ( window.WPRecipeMaker.manager.recipes.hasOwnProperty( `recipe-${id}` ) ) {
delete window.WPRecipeMaker.manager.recipes[ `recipe-${id}` ];
}
},
getRecipe: ( id, loadDifferentId = false ) => {
id = 'preview' === id ? id : parseInt( id );
if ( ! window.WPRecipeMaker.manager.recipes.hasOwnProperty( `recipe-${id}` ) ) {
return window.WPRecipeMaker.manager.loadRecipe( id, loadDifferentId );
}
return Promise.resolve( window.WPRecipeMaker.manager.recipes[ `recipe-${id}` ] );
},
getRecipeImmediately: ( id ) => {
id = 'preview' === id ? id : parseInt( id );
let recipe = window.WPRecipeMaker.manager.recipes.hasOwnProperty( `recipe-${id}` ) ? window.WPRecipeMaker.manager.recipes[ `recipe-${id}` ] : false;
// Check if data does not need to be loaded through API.
if ( ! recipe ) {
if ( window.hasOwnProperty( 'wprm_recipes' ) && window.wprm_recipes.hasOwnProperty( `recipe-${id}` ) ) {
const recipeData = window.wprm_recipes[ `recipe-${id}` ];
recipe = window.WPRecipeMaker.manager.loadRecipeObject( id, recipeData );
window.WPRecipeMaker.manager.recipes[ `recipe-${id}` ] = recipe;
}
}
return recipe;
},
loadRecipe: ( id, loadDifferentId = false ) => {
return new Promise((resolveRecipe, rejectRecipe) => {
// Check for data added in PHP of try loading through API.
const getRecipeData = new Promise((resolveData, rejectData) => {
const idToGetDataFor = loadDifferentId ? loadDifferentId : id;
if ( window.hasOwnProperty( 'wprm_recipes' ) && window.wprm_recipes.hasOwnProperty( `recipe-${idToGetDataFor}` ) ) {
resolveData( window.wprm_recipes[ `recipe-${idToGetDataFor}` ] );
} else {
window.WPRecipeMaker.manager.loadRecipeDataFromAPI( idToGetDataFor ).then( ( result ) => {
resolveData( result );
});
}
});
getRecipeData.then( ( recipeData ) => {
// Create recipe object from recipe data.
let recipe = false;
if ( recipeData ) {
recipe = window.WPRecipeMaker.manager.loadRecipeObject( id, recipeData );
}
window.WPRecipeMaker.manager.recipes[ `recipe-${id}` ] = recipe;
resolveRecipe( recipe );
});
});
},
loadRecipeDataFromAPI: ( id ) => {
let headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
};
// Only require nonce when logged in to prevent caching problems for regular visitors.
if ( 0 < parseInt( wprm_public.user ) ) {
headers['X-WP-Nonce'] = wprm_public.api_nonce;
}
return new Promise((resolve, reject) => {
fetch(`${wprm_public.endpoints.manage}/recipe/${ id }`, {
method: 'POST',
headers,
credentials: 'same-origin',
body: JSON.stringify({
format: 'frontend',
}),
}).then( (response) => {
if ( response.ok ) {
return response.json();
}
return false;
}).then( ( result ) => {
resolve( result );
});
});
},
loadRecipeObject: ( id, data ) => {
let recipe = {
id,
data,
// Functions to be overwritten. Define here to prevent errors.
setServings: ( ...args ) => {},
setAdvancedServings: ( ...args ) => {},
setUnitSystem: ( ...args ) => {},
addRating: ( ...args ) => {},
}
// Check if premium is active and should add functionality.
if ( window.WPRecipeMaker.hasOwnProperty( 'managerPremium' ) ) {
recipe = window.WPRecipeMaker.managerPremium.loadRecipeObject( id, recipe );
}
return recipe;
},
triggerChangeEvent: ( id, type ) => {
document.dispatchEvent( new CustomEvent( 'wprm-recipe-change', { detail: { id, type } } ) );
},
changeRecipeData: ( id, data ) => {
if ( window.WPRecipeMaker.manager.recipes.hasOwnProperty( `recipe-${id}` ) ) {
window.WPRecipeMaker.manager.recipes[ `recipe-${id}` ].data = {
...window.WPRecipeMaker.manager.recipes[ `recipe-${id}` ].data,
...data,
};
// Raw data change event.
document.dispatchEvent( new CustomEvent( 'wprm-recipe-change-data', { detail: { id } } ) );
}
},
};
ready(() => {
window.WPRecipeMaker.manager.init();
});
function ready( fn ) {
if (document.readyState != 'loading'){
fn();
} else {
document.addEventListener('DOMContentLoaded', fn);
}
}