111 lines
2.9 KiB
JavaScript
111 lines
2.9 KiB
JavaScript
/**
|
|
* 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);
|
|
}
|