JSFiddle - React, Tailwind, and code Playground

by Laurens Maneschijn

HTML

gitlab api scribbles

JavaScript

async function get_projects() {
	var projects = [];
	projects = await gitlab_api_all_pages('//orange.dev/api/v4/projects?per_page=100');
	return projects;
}

async function gitlab_api_all_pages(url) {
	var results = [];
	var page = 1;
	var per_page = 100;
	var result;
	var next_page, total_pages, total;
	while (true) {
		try {

			result = await gitlab_api_page_call(url, per_page, page);


			if (result && result.data && Array.isArray(result.data)) {
				results = results.concat(result.data);
			} else {
				console.log(result);
//				throw Error('result.data was not an array.');
				break;
			}

			nextpage = false;
			if (result && result.response && result.response.headers && result.response.headers.get) {
				total       = result.response.headers.get('X-Total');
				total_pages = result.response.headers.get('X-Total-Pages');
				if (result.response.headers.get('X-Next-Page') > page) {
					nextpage    = result.response.headers.get('X-Next-Page');
				} else if (total_pages && page < total_pages) {
					nextpage = page + 1;
				}
			}
			if (result && result.headers) {
				total       = result.headers['x-total'];
				total_pages = result.headers['x-total-pages'];
				if (result.headers['x-next-page'] > page) {
					nextpage    = result.headers['x-next-page'];
				} else if (total_pages && page < total_pages) {
					nextpage = page + 1;
				}
			}

			if (nextpage) {
				page = nextpage;
			} else {
				break;
			}
		} catch(e) {
			console.log(e);
			break;
		}
		break;
	}
	return results;
}


async function gitlab_api_page_call(url, per_page=100, page=1) {
	if (!per_page) {
		per_page = 100;
	}
	if (!page) {
		page = 100;
	}

	// NB: new URL() does not work for '//...' urls
	url = getSameProtocolUrlOrHttps(''+url);
	var url_obj = new URL(url);
	url_obj.searchParams.set('per_page', per_page);
	url_obj.searchParams.set('page', page);
	url = url_obj.toString();

	// https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
	//...