Files
formipay/src/admin/api/client.js
dwindown d8c81a4022 fix: consolidate backend changes and fix icon imports
- Add standard .gitignore patterns (node_modules, .env, IDE files)
- Coupon.php: fix data structure for DataTable, add status filter
- Order.php: fix data structure to match OrderListItem expectations
- Product.php: add multi-currency prices array, unify nonce to 'formipay-admin'
- client.js: fix AJAX action names to match PHP (underscores → hyphens)
- OrderList.js: fix icon import (Icons.list), add response handling
- OrderListItem.js: fix icon import (Icons.seen)
2026-04-19 06:04:10 +07:00

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 }),
};