Compare commits

..

No commits in common. "fee1475779796224b2528d1a98cd273819ec9d77" and "2409fa2b8d5a63c81bac840125da132607ac3d2a" have entirely different histories.

View File

@ -13,44 +13,22 @@ let interval: NodeJS.Timer | null = null;
let moreOlderPostsAvailable = true; let moreOlderPostsAvailable = true;
let loadingOlderPosts = false; let loadingOlderPosts = false;
interface FetchOptions {
since?: string,
before?: string,
count?: number
}
async function fetchPosts(options: FetchOptions): Promise<Post[]> {
const params = new URLSearchParams();
if (options?.since !== undefined) {
params.set('since', options.since);
}
if (options?.before !== undefined) {
params.set('before', options.before);
}
if (options?.count !== undefined) {
params.set('count', options.count.toFixed(0));
}
const response = await fetch(`/api/posts?${params}`);
return await response.json();
}
function filterDuplicates(posts: Post[]): Post[] {
return posts.filter((obj, index, arr) => {
return arr.map(mapObj => mapObj.url).indexOf(obj.url) === index;
});
}
function refresh() { function refresh() {
let filter: FetchOptions = {}; const params = new URLSearchParams();
if (data.posts.length > 0) { if (data.posts.length > 0) {
filter = { since: data.posts[0].created_at }; params.set('since', data.posts[0].created_at);
} }
fetchPosts(filter).then(resp => { fetch(`/api/posts?${params}`)
.then(r => r.json())
.then((resp: Post[]) => {
if (resp.length > 0) { if (resp.length > 0) {
// Prepend new posts, filter dupes // Prepend new posts, filter dupes
// There shouldn't be any duplicates, but better be safe than sorry // There shouldn't be any duplicates, but better be safe than sorry
data.posts = filterDuplicates(resp.concat(data.posts)); const combined = resp.concat(data.posts);
const filteredPosts = combined.filter((obj, index, arr) => {
return arr.map(mapObj => mapObj.url).indexOf(obj.url) === index;
});
data.posts = filteredPosts;
} }
}) })
.catch(e => { .catch(e => {
@ -79,21 +57,24 @@ onMount(async () => {
} }
}); });
function loadOlderPosts() { async function loadOlderPosts() {
loadingOlderPosts = true; loadingOlderPosts = true;
const filter: FetchOptions = { count: 20 }; const params = new URLSearchParams();
if (data.posts.length > 0) { if (data.posts.length > 0) {
filter.before = data.posts[data.posts.length - 1].created_at; params.set('before', data.posts[data.posts.length - 1].created_at);
} }
await fetch(`/api/posts?${params}`)
.then(r => r.json())
fetchPosts(filter).then(resp => { .then((resp: Post[]) => {
if (resp.length > 0) { if (resp.length > 0) {
// Append old posts, filter dupes // Append old posts, filter dupes
// There shouldn't be any duplicates, but better be safe than sorry // There shouldn't be any duplicates, but better be safe than sorry
data.posts = filterDuplicates(data.posts.concat(resp)); const combined = data.posts.concat(resp);
// If we got less than we expected, there are no older posts available const filteredPosts = combined.filter((obj, index, arr) => {
moreOlderPostsAvailable = resp.length < (filter.count ?? 20); return arr.map(mapObj => mapObj.url).indexOf(obj.url) === index;
});
data.posts = filteredPosts;
moreOlderPostsAvailable = true;
} else { } else {
moreOlderPostsAvailable = false; moreOlderPostsAvailable = false;
} }