/** * function that create an ajax post action * - PLGNTLS_data.ajax_nonce and PLGNTLS_data.ajax_url * are passed from the class PLGNTLS_class */ /* // OLD VERSION console.log("PLGNTLS_data"); console.log(PLGNTLS_data); function PLGNTLS_ajax(action, data_obj) { const data = new FormData(); data.append("action", action); data.append("_ajax_nonce", PLGNTLS_data.ajax_nonce); for (const key in data_obj) data.append(key, data_obj[key]); return fetch(PLGNTLS_data.ajax_url, { method: "POST", credentials: "same-origin", body: data, }); } */ // https://stackoverflow.com/q/52657814/9497573 function is_plain_object(obj) { if (!obj) return false; if (obj.constructor !== Object) return false; if (Object.getPrototypeOf(obj) !== Object.prototype) return false; return true; } function PLGNTLS_fetch(src = null, options = null) { if (src === null) return null; if (options === null) { const data = new FormData(); data.append('action', src); data.append('_ajax_nonce', PLGNTLS_data.ajax_nonce); options = { method: 'POST', credentials: 'same-origin', body: data, }; } else if (is_plain_object(options)) { // check for method, default POST if (!Object.hasOwn(options, 'method')) options.method = 'POST'; // check for credentials, default same-origin if (!Object.hasOwn(options, 'credentials')) options.credentials = 'same-origin'; // check for body, default contains action and nonce if (!Object.hasOwn(options, 'body')) options.body = new FormData(); // add action and nonce in options.body if (options.body instanceof FormData) { // dont check if action and nonce already exist, need new anyway options.body.set('action', src); options.body.set('_ajax_nonce', PLGNTLS_data.ajax_nonce); } else { // should think a better strategy : https://stackoverflow.com/q/20295080/9497573 // const data = {}; // if (is_plain_object(options.body)) // { // for (const key in options.body) // data[key] = options.body[key]; // } // else // data.data = options.body; // data.action = src; // data._ajax_nonce = PLGNTLS_data.ajax_nonce; // options.body = JSON.stringify(data); // cannot work if fetch use : // headers: {"Content-Type": "application/json"}, const data = new FormData( ); data.append( 'action', src ); data.append( '_ajax_nonce', PLGNTLS_data.ajax_nonce ); if ( is_plain_object( options.body ) ) { for ( const key in options.body ) data.append( key, JSON.stringify(options.body[key]) ); } // is string : https://stackoverflow.com/q/4059147/9497573 else if ( typeof options.body === 'string' || options.body instanceof String ) data.append( 'data', options.body ); else data.append('data', JSON.stringify(options.body)); options.body = data; } } else throw new Error('options not plain object or formData'); return fetch(PLGNTLS_data.ajax_url, options); }