- 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();