PNG %k25u25%fgd5n!
/home/mkuwqnjx/palaknaturals.com/wp-content/plugins/echo-rewards/react-app/utils/api.js
/**
 * API utility functions for Echo Rewards React app
 * 
 * This file contains helper functions for making AJAX requests
 * to WordPress backend following WordPress coding standards.
 */

// Get config from global variables
let config = {};
if (window.ecreAdmin) {
    config = Object.assign({}, window.ecreAdmin);
} else if (window.ecreFrontend) {
    config = Object.assign({}, window.ecreFrontend);
} else {
    // Fallback configuration
    console.warn('WordPress globals not found, using fallback configuration');
    config = {
        ajaxurl: window.ajaxurl || '/wp-admin/admin-ajax.php',
        nonce: '' // This will cause a warning but won't break the request
    };
}

/**
 * Make an AJAX request to WordPress backend
 * 
 * @param {string} action - The WordPress AJAX action name
 * @param {Object} data - Additional data to send with the request
 * @param {Object} options - Request options (method, headers, etc.)
 * @returns {Promise} - Promise that resolves with the response data
 */
export const makeAjaxRequest = async (action, data = {}, options = {}) => {
    // Check if we have the required WordPress globals
    if (!config.ajaxurl && !window.ajaxurl) {
        throw new Error('WordPress AJAX URL not found. Make sure wp_localize_script is properly configured.');
    }
    
    if (!config.nonce) {
        console.warn('WordPress nonce not found. This may cause security issues.');
    }

    const defaultOptions = {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
    };

    const requestOptions = { ...defaultOptions, ...options };

    // Prepare form data
    const formData = new URLSearchParams();
    formData.append('action', action);
    formData.append('nonce', config.nonce || '');

    // Add additional data
    Object.keys(data).forEach(key => {
        if (data[key] !== null && data[key] !== undefined) {
            formData.append(key, data[key]);
        }
    });

    // Use config.ajaxurl first, then fallback to window.ajaxurl, then default
    const ajaxUrl = config.ajaxurl || window.ajaxurl || '/wp-admin/admin-ajax.php';

    try {
        const response = await fetch(ajaxUrl, {
            ...requestOptions,
            body: formData,
        });

        if (!response.ok) {
            const errorText = await response.text();
            console.error('HTTP Error Response:', errorText);
            throw new Error(`HTTP error! status: ${response.status} - ${errorText.substring(0, 200)}`);
        }

        const responseText = await response.text();
    
        let result;
        try {
            result = JSON.parse(responseText);
        } catch (parseError) {
            console.error('JSON Parse Error:', parseError);
            console.error('Response text:', responseText);
            throw new Error(`Invalid JSON response: ${responseText.substring(0, 200)}`);
        }

        if (!result.success) {
            const errorMessage = result.data?.message || result.data || 'Request failed';
            console.error('AJAX Error:', errorMessage);
            throw new Error(errorMessage);
        }

        return result.data;
    } catch (error) {
        console.error('AJAX request failed:', error);
        throw error;
    }
};

/**
 * Get all referrers data with pagination and filtering
 * 
 * @param {Object} params - Request parameters
 * @param {number} params.limit - Number of records to fetch (default: 50)
 * @param {number} params.offset - Offset for pagination (default: 0)
 * @param {string} params.search - Search term (default: '')
 * @param {string} params.time_filter - Time filter (default: 'all')
 * @param {Object} params.filters - Additional filters (default: {})
 * @returns {Promise} - Promise that resolves with referrers data
 */
export const getAllReferrers = async (params = {}) => {
    const {
        limit = 50,
        offset = 0,
        search = '',
        time_filter = 'all',
        filters = {}
    } = params;

    return makeAjaxRequest('ecre_get_all_referrers', {
        limit,
        offset,
        search,
        time_filter,
        filters: JSON.stringify(filters)
    });
};

/**
 * Get detailed information for a specific referrer
 * 
 * @param {number} referrerId - The ID of the referrer
 * @returns {Promise} - Promise that resolves with referrer details
 */
export const getReferrerDetails = async (referrerId) => {
    if (!referrerId || referrerId <= 0) {
        throw new Error('Invalid referrer ID');
    }

    return makeAjaxRequest('ecre_get_referrer_details', {
        referrer_id: referrerId
    });
};

/**
 * Get dashboard summary data
 * 
 * @returns {Promise} - Promise that resolves with dashboard summary
 */
export const getDashboardSummary = async () => {
    return makeAjaxRequest('ecre_get_dashboard_summary');
};

/**
 * Convert time filter from React format to PHP format
 * 
 * @param {string} reactTimeFilter - Time filter from React component
 * @returns {string} - PHP-compatible time filter
 */
export const convertTimeFilter = (reactTimeFilter) => {
    const filterMap = {
        'All Time': 'all',
        '1 Month': '1_month',
        '3 Month': '3_month',
        '5 Month': '6_month', // Mapping 5 Month to 6 Month for consistency
        '1 Year': '1_year'
    };

    return filterMap[reactTimeFilter] || 'all';
};

/**
 * Handle API errors consistently
 * 
 * @param {Error} error - The error object
 * @param {string} context - Context where the error occurred
 * @returns {Object} - Formatted error object
 */
export const handleApiError = (error, context = 'API request') => {
    console.error(`${context} failed:`, error);
    
    return {
        success: false,
        error: error.message || 'An unexpected error occurred',
        context
    };
};

/**
 * Debounce function for search inputs
 * 
 * @param {Function} func - Function to debounce
 * @param {number} wait - Wait time in milliseconds
 * @returns {Function} - Debounced function
 */
export const debounce = (func, wait) => {
    let timeout;
    return function executedFunction(...args) {
        const later = () => {
            clearTimeout(timeout);
            func(...args);
        };
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
    };
};