# learnpress/4.4.8/assets/src/js/admin/statistics/api.js

LearnPress – WordPress LMS Plugin for Create and Sell Online Courses, version 4.4.8. 76 lines.

- Page: https://pluginprobe.com/plugins/learnpress/4.4.8/code/assets/src/js/admin/statistics/api.js
- Raw: https://pluginprobe.com/plugins/learnpress/4.4.8/raw/assets/src/js/admin/statistics/api.js
- Modified: 2026-09-18T11:22:50+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/learnpress/4.4.8/code/assets/src/js/admin/statistics/api.js#L10-L20`.

```javascript
/**
 * Statistics dashboard fetch wrapper + escaping helper.
 *
 * Every statistics request goes through lpStatsFetch so the localized globals
 * (lpDataAdmin for REST root/nonce, lpAdminStatisticSettings for config) are
 * read in exactly one file, and lpFetchAPI's blind spots are normalized here:
 * it never rejects on HTTP error codes, so anything but status 'success'
 * is routed to the error callback.
 *
 * @since 4.4.2
 * @version 1.0.0
 */

import * as lpUtils from 'lpAssetsJsPath/utils.js';
import { lpStatsState, LP_STATS_RANGE_RESOLVED } from './state.js';

export const getStatsConfig = () => window.lpAdminStatisticSettings || {};

export const getStatsI18n = ( key, fallback = '' ) => {
	const { i18n = {} } = getStatsConfig();
	return i18n[ key ] || fallback;
};

/**
 * Fetch a statistics endpoint with the global filter state applied.
 *
 * @param {string} endpoint  Route below the statistics namespace, e.g. 'filter-options'.
 * @param {Object} extraArgs Query args merged over the state (tab-specific params).
 * @param {Object} functions { before, success, error, completed } — success only
 *                           fires on status 'success'; error receives an Error.
 */
export const lpStatsFetch = ( endpoint, extraArgs = {}, functions = {} ) => {
	const lpDataAdmin = window.lpDataAdmin || {};
	const restNamespace = getStatsConfig().restNamespace || 'lp/v1/statistics';
	const url = lpUtils.lpAddQueryArgs(
		`${ lpDataAdmin.lp_rest_url || '/wp-json/' }${ restNamespace }/${ endpoint }`,
		{ ...lpStatsState.get(), ...extraArgs }
	);

	const onError =
		'function' === typeof functions.error
			? functions.error
			: ( err ) => console.error( 'LP Statistics:', err );

	lpUtils.lpFetchAPI(
		url,
		{ headers: { 'X-WP-Nonce': lpDataAdmin.nonce || '' } },
		{
			...functions,
			success: ( response ) => {
				if ( response && 'success' === response.status ) {
					// Broadcast the server-resolved range so the filter bar can
					// reconcile its toggle label ( fixes the past-midnight case ).
					const range = response.data && response.data.range;
					if ( range && range.label ) {
						document.dispatchEvent(
							new CustomEvent( LP_STATS_RANGE_RESOLVED, { detail: range } )
						);
					}
					if ( 'function' === typeof functions.success ) {
						functions.success( response );
					}
				} else {
					onError(
						new Error(
							( response && response.message ) ||
								getStatsI18n( 'loadError', 'Request failed.' )
						)
					);
				}
			},
			error: onError,
		}
	);
};

```
