From bf1926903403a77767efb8bbbcde6b32c8929179 Mon Sep 17 00:00:00 2001 From: tdro Date: Wed, 2 Nov 2022 11:08:22 -0400 Subject: themes/default/layouts/_default/index.json: Paginate Load feed in chunks on the client side. --- static/js/fixedsearch.ts | 47 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 15 deletions(-) (limited to 'static') diff --git a/static/js/fixedsearch.ts b/static/js/fixedsearch.ts index 4a24144..fafe5ee 100644 --- a/static/js/fixedsearch.ts +++ b/static/js/fixedsearch.ts @@ -33,7 +33,7 @@ } } - // DOWN (40) + // DOWN (40) if (event.keyCode == 40) { event.preventDefault(); if (document.activeElement == query) head.focus(); @@ -44,7 +44,7 @@ } } - // UP (38) + // UP (38) if (event.keyCode == 38) { event.preventDefault(); if (document.activeElement == query) tail.focus(); @@ -92,11 +92,30 @@ } }); - function fetchJson(url, callback) { + let data = {}; + + function isEmpty(obj) { + return Object.keys(obj).length === 0; + } + + function appendItemsTo(local, remote) { + const paginated = Object.keys(remote).includes("next_url"); + if (isEmpty(local)) { + local = remote; + } else { + local.items = local.items.concat(remote.items); + } + if (paginated) { + fetchJson(remote.next_url, local); + } + data = local; + } + + function fetchJson(url, store) { const httpRequest = new XMLHttpRequest(); httpRequest.onreadystatechange = function () { if (httpRequest.readyState === 4 && httpRequest.status === 200) { - if (callback) callback(JSON.parse(httpRequest.responseText)); + appendItemsTo(store, JSON.parse(httpRequest.responseText)); } }; httpRequest.open("GET", url); @@ -122,28 +141,26 @@ }); } - let firstRun = true; // allow us to delay loading json data unless search activated + let firstRun = true; function initialize() { if (firstRun) { loadScript(window.location.origin + "/js/fuzzysort.js") .then(() => { firstRun = false; - fetchJson("/index.json", function (data) { - const options = { - key: ["title"], - }; + fetchJson("/index.json", {}); - query.addEventListener("keyup", function () { - search(query.value, data.items, options); - }); + const options = { key: ["title"] }; - query.addEventListener("focusin", function () { - search(query.value, data.items, options); - }); + query.addEventListener("keyup", function () { + search(query.value, data.items, options); + }); + query.addEventListener("focusin", function () { search(query.value, data.items, options); }); + + search(query.value, data.items, options); }).catch((error) => { console.log("Error failed to load fuzzy sort: " + error); }); -- cgit v1.2.3