fix #49 enable loading more posts without JS

This commit is contained in:
2025-07-20 12:49:11 +02:00
parent 1533e9be98
commit afd7371cda
6 changed files with 46 additions and 20 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "moshing-mammut", "name": "moshing-mammut",
"version": "2.1.1", "version": "2.1.3",
"private": true, "private": true,
"license": "LGPL-3.0-or-later", "license": "LGPL-3.0-or-later",
"scripts": { "scripts": {

View File

@ -3,7 +3,7 @@
interface Props { interface Props {
account: Account; account: Account;
lazyLoadImages: Boolean; lazyLoadImages?: boolean;
} }
let { account, lazyLoadImages = true }: Props = $props(); let { account, lazyLoadImages = true }: Props = $props();

View File

@ -1,13 +1,15 @@
<script lang="ts"> <script lang="ts">
import LoadingSpinnerComponent from '$lib/components/LoadingSpinnerComponent.svelte'; import LoadingSpinnerComponent from '$lib/components/LoadingSpinnerComponent.svelte';
import { page } from '$app/stores';
interface Props { interface Props {
moreAvailable?: boolean; moreAvailable?: boolean;
isLoading?: boolean; isLoading?: boolean;
loadOlderPosts: any; loadOlderPosts: any;
lastPostId?: string;
} }
let { moreAvailable = false, isLoading = false, loadOlderPosts }: Props = $props(); let { moreAvailable = false, isLoading = false, loadOlderPosts, lastPostId }: Props = $props();
let displayText = $derived.by(() => { let displayText = $derived.by(() => {
if (isLoading) { if (isLoading) {
return 'Loading...'; return 'Loading...';
@ -19,23 +21,37 @@
let title = $derived(moreAvailable ? 'Load More' : 'There be dragons!'); let title = $derived(moreAvailable ? 'Load More' : 'There be dragons!');
let disabled: boolean = $derived(!moreAvailable || isLoading); let disabled: boolean = $derived(!moreAvailable || isLoading);
/*const dispatch = createEventDispatcher<{ const currentCount = $page.url.searchParams.get('count');
loadOlderPosts: string; let nextCount = 10;
}>(); if (currentCount) {
const countValue = parseInt(currentCount);
function loadOlderPosts() { if (!isNaN(countValue)) {
dispatch('loadOlderPosts'); nextCount = countValue + 5;
}*/ }
}
const nextPageUrl = `?count=${nextCount}#${lastPostId}`;
</script> </script>
<button onclick={() => loadOlderPosts()} {disabled} {title}> <a
href={nextPageUrl}
{disabled}
onclick={(event) => {
event.preventDefault();
loadOlderPosts();
}}
>
<button {disabled} {title}>
<div class="loading" class:collapsed={!isLoading}> <div class="loading" class:collapsed={!isLoading}>
<LoadingSpinnerComponent size="0.5em" thickness="6px" /> <LoadingSpinnerComponent size="0.5em" thickness="6px" />
</div> </div>
<span>{displayText}</span> <span>{displayText}</span>
</button> </button>
</a>
<style> <style>
a {
text-decoration: none;
}
button { button {
padding: 0.75em; padding: 0.75em;
border-radius: 3px; border-radius: 3px;

View File

@ -8,7 +8,7 @@
interface Props { interface Props {
post: Post; post: Post;
lazyLoadImages: Boolean; lazyLoadImages?: boolean;
} }
let { post, lazyLoadImages = true }: Props = $props(); let { post, lazyLoadImages = true }: Props = $props();
@ -116,7 +116,7 @@
}); });
</script> </script>
<div class="wrapper"> <div class="wrapper" id={post.id}>
<div class="avatar"><AvatarComponent account={post.account} {lazyLoadImages} /></div> <div class="avatar"><AvatarComponent account={post.account} {lazyLoadImages} /></div>
<div class="account"><AccountComponent account={post.account} /></div> <div class="account"><AccountComponent account={post.account} /></div>
<div class="meta"> <div class="meta">

View File

@ -18,6 +18,7 @@
let { data = $bindable() }: Props = $props(); let { data = $bindable() }: Props = $props();
let posts: Post[] = $state(data.posts); let posts: Post[] = $state(data.posts);
let lastPostId = $derived(posts.length > 0 ? posts[posts.length - 1].id : null);
interface FetchOptions { interface FetchOptions {
since?: string; since?: string;
@ -180,6 +181,7 @@
{loadOlderPosts} {loadOlderPosts}
moreAvailable={moreOlderPostsAvailable} moreAvailable={moreOlderPostsAvailable}
isLoading={loadingOlderPosts} isLoading={loadingOlderPosts}
{lastPostId}
/> />
</div> </div>
<div></div> <div></div>

View File

@ -1,8 +1,16 @@
import type { Post } from '$lib/mastodon/response'; import type { Post } from '$lib/mastodon/response';
import type { PageLoad } from './$types'; import type { PageLoad } from './$types';
export const load = (async ({ fetch, setHeaders }) => { export const load = (async ({ fetch, setHeaders, url }) => {
const p = await fetch('/api/posts?count=5'); let count = 5;
const countParam = url.searchParams.get('count');
if (countParam) {
const parsed = parseInt(countParam);
if (!isNaN(parsed)) {
count = parsed;
}
}
const p = await fetch('/api/posts?count=' + count);
setHeaders({ setHeaders({
'cache-control': 'public,max-age=300' 'cache-control': 'public,max-age=300'
}); });