fix #49 enable loading more posts without JS
This commit is contained in:
@ -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": {
|
||||||
|
@ -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();
|
||||||
|
@ -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
|
||||||
<div class="loading" class:collapsed={!isLoading}>
|
href={nextPageUrl}
|
||||||
<LoadingSpinnerComponent size="0.5em" thickness="6px" />
|
{disabled}
|
||||||
</div>
|
onclick={(event) => {
|
||||||
<span>{displayText}</span>
|
event.preventDefault();
|
||||||
</button>
|
loadOlderPosts();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<button {disabled} {title}>
|
||||||
|
<div class="loading" class:collapsed={!isLoading}>
|
||||||
|
<LoadingSpinnerComponent size="0.5em" thickness="6px" />
|
||||||
|
</div>
|
||||||
|
<span>{displayText}</span>
|
||||||
|
</button>
|
||||||
|
</a>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
button {
|
button {
|
||||||
padding: 0.75em;
|
padding: 0.75em;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
|
@ -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">
|
||||||
|
@ -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>
|
||||||
|
@ -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'
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user