/
kreyndelHam
/
Konstructorium
Обзор
Документация
Войти
/
kreyndelHam
/
Konstructorium
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
1
CI/CD
Аналитика
Безопасность
dev
frontend/src/utils/adminPaginatedList.js
73 строки
2 KB
MihahamYT
Docs + notifications + SMTP emails
25 май 2026, 14:46
25 май 2026, 14:46
c95f449
Код
Авторство
О чём код?
/** * Utilities for loading full DRF-paginated admin lists (PAGE_SIZE=50). */ /** * Extract list items from a DRF page or plain array payload. * * @param {unknown} payload - Response body (`data` from axios). * @returns {unknown[]} */ export function extractAdminListPage(payload) { if (Array.isArray(payload)) { return payload } if (payload && typeof payload === 'object' && Array.isArray(payload.results)) { return payload.results } return [] } /** * Resolve admin API path from DRF `next` URL (absolute or relative). * * @param {string|null|undefined} nextUrl - DRF pagination `next` link. * @returns {string|null} Path relative to admin API base (e.g. `/notifications/?page=2`). */ export function adminListPathFromNextUrl(nextUrl) { if (!nextUrl || typeof nextUrl !== 'string') { return null } try { const parsed = new URL(nextUrl, window.location.origin) const marker = '/api/admin' const markerIndex = parsed.pathname.indexOf(marker) if (markerIndex >= 0) { return `${parsed.pathname.slice(markerIndex + marker.length)}${parsed.search}` } if (nextUrl.startsWith('/')) { return nextUrl } } catch { if (nextUrl.startsWith('/')) { return nextUrl } } return null } /** * Fetch every page of a paginated admin list. * * @param {(params?: Record<string, unknown>) => Promise<{ data: unknown }>} fetchFirstPage - Loads page 1 with query params. * @param {Record<string, unknown>} [params] - Query params for the first request. * @param {(path: string) => Promise<{ data: unknown }>} fetchByPath - Follow-up GET for `next` URLs (path under `/api/admin`). * @returns {Promise<unknown[]>} Concatenated `results` from all pages. */ export async function fetchAllAdminListPages(fetchFirstPage, params = {}, fetchByPath) { let response = await fetchFirstPage(params) let items = [...extractAdminListPage(response.data)] let nextUrl = response.data && typeof response.data === 'object' ? response.data.next : null while (nextUrl) { const path = adminListPathFromNextUrl(nextUrl) if (!path) { break } response = await fetchByPath(path) items = items.concat(extractAdminListPage(response.data)) nextUrl = response.data && typeof response.data === 'object' ? response.data.next : null } return items }