Add coexistence checks to all enqueue methods to prevent loading both React and Grid.js assets simultaneously. Changes: - ReactAdmin.php: Only enqueue React assets when ?react=1 - Init.php: Skip Grid.js when React active on admin pages - Form.php, Coupon.php, Access.php: Restore classic assets when ?react=0 - Customer.php, Product.php, License.php: Add coexistence checks Now the toggle between Classic and React versions works correctly. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
147 lines
4.4 KiB
JavaScript
147 lines
4.4 KiB
JavaScript
/**
|
|
* API client for Formipay admin interface
|
|
* Handles nonce-secured requests to WordPress admin-ajax.php
|
|
*/
|
|
|
|
export const API_BASE = window.formipayAdmin?.ajaxUrl || '/wp-admin/admin-ajax.php';
|
|
export const NONCE = window.formipayAdmin?.nonce || '';
|
|
export const REST_BASE = window.formipayAdmin?.restUrl || '/wp-json/formipay/v1';
|
|
|
|
/**
|
|
* Generic AJAX request handler with nonce
|
|
*/
|
|
export async function ajaxRequest(action, data = {}) {
|
|
const formData = new FormData();
|
|
|
|
formData.append('action', action);
|
|
formData.append('_wpnonce', NONCE);
|
|
|
|
Object.keys(data).forEach(key => {
|
|
if (typeof data[key] === 'object') {
|
|
formData.append(key, JSON.stringify(data[key]));
|
|
} else {
|
|
formData.append(key, data[key]);
|
|
}
|
|
});
|
|
|
|
console.log(`[AJAX] Sending request: ${action}`, { nonce: NONCE, data });
|
|
|
|
try {
|
|
const response = await fetch(API_BASE, {
|
|
method: 'POST',
|
|
credentials: 'same-origin',
|
|
body: formData,
|
|
});
|
|
|
|
console.log(`[AJAX] Response status: ${action}`, response.status);
|
|
|
|
const result = await response.json();
|
|
console.log(`[AJAX] Response data: ${action}`, result);
|
|
|
|
if (!response.ok || result.success === false) {
|
|
const errorMsg = result.data?.message || result.message || 'Request failed';
|
|
throw new Error(errorMsg);
|
|
}
|
|
|
|
return result;
|
|
} catch (error) {
|
|
console.error(`AJAX error [${action}]:`, error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* REST API request handler
|
|
*/
|
|
export async function apiRequest(endpoint, options = {}) {
|
|
const url = `${REST_BASE}${endpoint}`;
|
|
|
|
const defaultOptions = {
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'X-WP-Nonce': NONCE,
|
|
},
|
|
};
|
|
|
|
try {
|
|
const response = await fetch(url, { ...defaultOptions, ...options });
|
|
const result = await response.json();
|
|
|
|
if (!response.ok) {
|
|
throw new Error(result.message || 'API request failed');
|
|
}
|
|
|
|
return result;
|
|
} catch (error) {
|
|
console.error(`API error [${endpoint}]:`, error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Orders API
|
|
*/
|
|
export const ordersApi = {
|
|
list: (params = {}) => ajaxRequest('formipay-tabledata-orders', params),
|
|
get: (orderId) => ajaxRequest('formipay-get-order', { order_id: orderId }),
|
|
updateStatus: (orderId, status) => ajaxRequest('formipay-update-order-status', {
|
|
order_id: orderId,
|
|
status,
|
|
}),
|
|
delete: (orderIds) => ajaxRequest('formipay-bulk-delete-order', { ids: orderIds }),
|
|
};
|
|
|
|
/**
|
|
* Customers API
|
|
*/
|
|
export const customersApi = {
|
|
list: (params = {}) => ajaxRequest('formipay-tabledata-customers', params),
|
|
get: (customerId) => ajaxRequest('formipay-get-customer', { customer_id: customerId }),
|
|
};
|
|
|
|
/**
|
|
* Products API
|
|
*/
|
|
export const productsApi = {
|
|
list: (params = {}) => ajaxRequest('formipay_tabledata_products', params),
|
|
get: (productId) => ajaxRequest('formipay_get_product', { post_id: productId }),
|
|
getVariables: (productId) => ajaxRequest('get_product_variables', { post_id: productId }),
|
|
};
|
|
|
|
/**
|
|
* Forms API
|
|
*/
|
|
export const formsApi = {
|
|
list: (params = {}) => ajaxRequest('formipay-tabledata-forms', params),
|
|
get: (formId) => ajaxRequest('formipay-get-form', { post_id: formId }),
|
|
};
|
|
|
|
/**
|
|
* Coupons API
|
|
*/
|
|
export const couponsApi = {
|
|
list: (params = {}) => ajaxRequest('formipay-tabledata-coupons', params),
|
|
check: (code, formId) => ajaxRequest('formipay-check-coupon', { code, form_id: formId }),
|
|
create: (data) => ajaxRequest('formipay-create-coupon-post', data),
|
|
delete: (ids) => ajaxRequest('formipay-bulk-delete-coupon', { ids }),
|
|
};
|
|
|
|
/**
|
|
* Access Items API
|
|
*/
|
|
export const accessApi = {
|
|
list: (params = {}) => ajaxRequest('formipay-tabledata-access-items', params),
|
|
getProducts: () => ajaxRequest('formipay_access_items_get_products', {}),
|
|
create: (data) => ajaxRequest('formipay-create-access-item-post', data),
|
|
delete: (ids) => ajaxRequest('formipay-bulk-delete-access-item', { ids }),
|
|
};
|
|
|
|
/**
|
|
* License API
|
|
*/
|
|
export const licenseApi = {
|
|
verify: (key) => ajaxRequest('formipay_verify_license', { license_key: key }),
|
|
activate: (key) => ajaxRequest('formipay_activate_license', { license_key: key }),
|
|
deactivate: (key) => ajaxRequest('formipay_deactivate_license', { license_key: key }),
|
|
};
|