plutopluto

git clone https://git.ce9e.org/plutopluto.git

commit
71e69016f8d67428804d482b8ca12ab51eb79001
parent
01d366c2e72bcc565941284e432a041e8eff65c3
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-12-21 12:52
refactor js

Diffstat

M plutopluto/static/plutopluto.js 120 ++++++++++++++++++++++++++++++++-----------------------------

1 files changed, 63 insertions, 57 deletions


diff --git a/plutopluto/static/plutopluto.js b/plutopluto/static/plutopluto.js

@@ -2,6 +2,17 @@ var template = document.querySelector('template');
    2     2 var stream = document.querySelector('#stream');
    3     3 var loading = document.querySelector('.loading');
    4     4 
   -1     5 var locked = function(fn) {
   -1     6 	var lock = false;
   -1     7 	return async function() {
   -1     8 		if (!lock) {
   -1     9 			lock = true;
   -1    10 			await fn();
   -1    11 			lock = false;
   -1    12 		}
   -1    13 	};
   -1    14 };
   -1    15 
    5    16 var formatDate = function(text) {
    6    17 	var date = new Date(parseInt(text, 10) * 1000);
    7    18 	var format = 'YYYY-MM-dd hh:mm';
@@ -57,76 +68,69 @@ var appendEntries = function(entries) {
   57    68 	});
   58    69 };
   59    70 
   60    -1 var fetchJSON = function(url) {
   61    -1 	return fetch(url).then(r => {
   62    -1 		if (r.ok) {
   63    -1 			return r.json();
   64    -1 		} else {
   65    -1 			throw r;
   66    -1 		}
   67    -1 	});
   -1    71 var fetchJSON = async function(url) {
   -1    72 	var r = await fetch(url);
   -1    73 	if (r.ok) {
   -1    74 		return r.json();
   -1    75 	} else {
   -1    76 		throw r;
   -1    77 	}
   68    78 };
   69    79 
   70    -1 var getConfig = function() {
   -1    80 var getInitialUrls = async function() {
   71    81 	var q = new URLSearchParams(location.search);
   72    82 	var urls = q.getAll('url');
   73    83 	if (urls.length) {
   74    -1 		return Promise.resolve({'urls': urls});
   -1    84 		return urls;
   75    85 	} else {
   76    -1 		return fetchJSON('/config');
   -1    86 		var config = await fetchJSON('/config');
   -1    87 		return config.urls;
   77    88 	}
   78    -1 }
   -1    89 };
   -1    90 
   -1    91 var page = 0;
   -1    92 var next = [];
   -1    93 var entries = [];
   79    94 
   80    -1 getConfig().then(config => {
   81    -1 	var entries = [];
   82    -1 	var page = 0;
   83    -1 	var next = config.urls;
   -1    95 var loadNextPage = async function() {
   -1    96 	var current = next;
   -1    97 	next = [];
   84    98 
   85    -1 	var loadNextPageLock = false;
   86    -1 	var loadNextPage = function() {
   87    -1 		if (loadNextPageLock) {
   88    -1 			return;
   -1    99 	await Promise.allSettled(current.map(async raw => {
   -1   100 		var url = raw.replace('{page}', page);
   -1   101 		var feed = await fetchJSON('/parse?' + new URLSearchParams({url: url}));
   -1   102 
   -1   103 		if (feed.next) {
   -1   104 			next.push(feed.next);
   -1   105 		} else if (raw.includes('{page}')) {
   -1   106 			next.push(raw);
   89   107 		}
   90   108 
   91    -1 		loadNextPageLock = true;
   92    -1 
   93    -1 		var current = next;
   94    -1 		next = [];
   95    -1 
   96    -1 		var promises = current.map(raw => {
   97    -1 			var url = raw.replace('{page}', page);
   98    -1 
   99    -1 			return fetchJSON('/parse?' + new URLSearchParams({url: url})).then(data => {
  100    -1 				if (data.next) {
  101    -1 					next.push(data.next);
  102    -1 				} else if (raw.includes('{page}')) {
  103    -1 					next.push(raw);
  104    -1 				}
  105    -1 				data.entries.forEach(entry => {
  106    -1 					entry.feed_link = '?' + new URLSearchParams({url: raw});
  107    -1 					entries.push(entry);
  108    -1 				});
  109    -1 			});
   -1   109 		feed.entries.forEach(entry => {
   -1   110 			entry.feed_link = '/?' + new URLSearchParams({url: raw});
   -1   111 			entries.push(entry);
  110   112 		});
   -1   113 	}));
  111   114 
  112    -1 		Promise.all(promises).finally(() => {
  113    -1 			// now that we have entries, we can show some
  114    -1 			renderMore();
  115    -1 			loadNextPageLock = false;
  116    -1 		});
   -1   115 	entries.sort((a, b) => b.dt - a.dt);
   -1   116 	page++;
   -1   117 };
  117   118 
  118    -1 		page++;
  119    -1 	};
   -1   119 var renderMore = locked(async function() {
   -1   120 	if (entries.length === 0) {
   -1   121 		await loadNextPage();
   -1   122 	}
   -1   123 	if (entries.length === 0) {
   -1   124 		return;
   -1   125 	}
   -1   126 	appendEntries(entries.splice(0, 10));
   -1   127 	if (entries.length < 30) {
   -1   128 		await loadNextPage();
   -1   129 	}
   -1   130 });
  120   131 
  121    -1 	var renderMore = function() {
  122    -1 		entries.sort((a, b) => {
  123    -1 			return b.dt - a.dt;
  124    -1 		});
  125    -1 		appendEntries(entries.splice(0, 10));
  126    -1 		if (entries.length < 30) {
  127    -1 			loadNextPage();
  128    -1 		}
  129    -1 	};
   -1   132 var main = async function() {
   -1   133 	next = await getInitialUrls();
  130   134 
  131   135 	document.addEventListener('scroll', () => {
  132   136 		if (bottomDistance() < 4000) {
@@ -137,5 +141,7 @@ getConfig().then(config => {
  137   141 	loading.addEventListener('click', renderMore);
  138   142 
  139   143 	// load initial content
  140    -1 	loadNextPage();
  141    -1 });
   -1   144 	renderMore();
   -1   145 };
   -1   146 
   -1   147 main();