diff --git a/src/apps/copilots/src/services/projects.ts b/src/apps/copilots/src/services/projects.ts index 45b26131e..85b32f9cf 100644 --- a/src/apps/copilots/src/services/projects.ts +++ b/src/apps/copilots/src/services/projects.ts @@ -11,6 +11,8 @@ const baseUrl = `${EnvironmentConfig.API.V5}/projects` export type ProjectsResponse = SWRResponse +const sleep = (ms: number): Promise<()=> void> => new Promise(resolve => { setTimeout(resolve, ms) }) + /** * Custom hook to fetch and manage projects data. * @@ -24,13 +26,26 @@ export const useProjects = (search?: string, config?: {isPaused?: () => boolean, const params = { name: search, ...config?.filter } const url = buildUrl(baseUrl, params) - const fetcher = (): Promise => { - if (config?.filter?.id && Array.isArray(config.filter.id)) { - const chunks = chunk(config.filter.id, 20) - return Promise.all( - chunks.map(page => xhrGetAsync(buildUrl(baseUrl, { ...params, id: page }))), - ) - .then(responses => responses.flat()) + const fetcher = async (): Promise => { + const ids = config?.filter?.id + + if (Array.isArray(ids)) { + const idChunks = chunk(ids, 20) + const allResults: Project[] = [] + + for (const chunkIds of idChunks) { + // eslint-disable-next-line no-await-in-loop + const response = await xhrGetAsync( + buildUrl(baseUrl, { ...params, id: chunkIds }), + ) + allResults.push(...response) + + // Rate limit: delay 200ms between calls + // eslint-disable-next-line no-await-in-loop + await sleep(200) + } + + return allResults } return xhrGetAsync(url)