test
1 month ago
analyticsApi.js
1 month ago
classnames.js
1 month ago
dateUtils.js
1 month ago
formatters.js
1 month ago
helpers.js
1 month ago
icons.js
1 month ago
index.js
1 month ago
pluginUtils.js
1 month ago
transformers.js
1 month ago
viewportBoundary.js
1 month ago
analyticsApi.js
66 lines
| 1 | import wpApiFetch from "@wordpress/api-fetch"; |
| 2 | |
| 3 | /** |
| 4 | * IMPORTANT — never call `.toISOString()` on user-picked dates here, and |
| 5 | * never pass a bare "yyyy-MM-dd" date string. Always run user-picked dates |
| 6 | * through `toAnalyticsDate()` from `./dateUtils` first. The REST endpoints |
| 7 | * declare every start/end arg as `format: date-time` and reject anything |
| 8 | * else with 400; `.toISOString()` also silently shifts midnight-local back |
| 9 | * to the previous UTC day, masking today's records for users east of UTC. |
| 10 | */ |
| 11 | |
| 12 | /** |
| 13 | * Fetches views analytics data for a given date range. |
| 14 | * |
| 15 | * @param {string} start - ISO date string for range start |
| 16 | * @param {string} end - ISO date string for range end |
| 17 | * @param {Object} [options] - Optional apiFetch options (e.g. { signal }) |
| 18 | * @returns {Promise<{ total: number, chartData: Array }>} |
| 19 | */ |
| 20 | export const fetchViews = async (start, end, options = {}) => { |
| 21 | const response = await wpApiFetch({ |
| 22 | path: wp.url.addQueryArgs(window.prestoPlayer.api.analyticsViews, { |
| 23 | start, |
| 24 | end, |
| 25 | }), |
| 26 | parse: false, |
| 27 | ...options, |
| 28 | }); |
| 29 | |
| 30 | const chartData = await response.json(); |
| 31 | const total = parseInt(response.headers?.get("X-WP-Total"), 10) || 0; |
| 32 | |
| 33 | return { total, chartData: chartData || [] }; |
| 34 | }; |
| 35 | |
| 36 | /** |
| 37 | * Fetches watch-time analytics data for a given date range. |
| 38 | * |
| 39 | * @param {string} start - ISO date string for range start |
| 40 | * @param {string} end - ISO date string for range end |
| 41 | * @param {Object} [options] - Optional apiFetch options (e.g. { signal }) |
| 42 | * @returns {Promise<{ total: number, chartData: Array, average: number }>} |
| 43 | */ |
| 44 | export const fetchWatchTime = async (start, end, options = {}) => { |
| 45 | const response = await wpApiFetch({ |
| 46 | path: wp.url.addQueryArgs(window.prestoPlayer.api.analyticsWatchTime, { |
| 47 | start, |
| 48 | end, |
| 49 | }), |
| 50 | parse: false, |
| 51 | ...options, |
| 52 | }); |
| 53 | |
| 54 | const responseData = await response.json(); |
| 55 | const chartData = responseData?.data || []; |
| 56 | // Watch-time endpoint doesn't provide X-WP-Total header (unlike views), |
| 57 | // so total must be computed client-side. |
| 58 | const total = chartData.reduce( |
| 59 | (sum, item) => sum + (parseInt(item.total, 10) || 0), |
| 60 | 0 |
| 61 | ); |
| 62 | const average = parseFloat(responseData?.average) || 0; |
| 63 | |
| 64 | return { total, chartData, average }; |
| 65 | }; |
| 66 |