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