diff --git a/src/lib/FrogHeader.svelte b/src/lib/FrogHeader.svelte index d7376c4..51105eb 100644 --- a/src/lib/FrogHeader.svelte +++ b/src/lib/FrogHeader.svelte @@ -1,10 +1,17 @@ - vod frog + vod frog diff --git a/src/lib/VideoCard.svelte b/src/lib/VideoCard.svelte index ec74c3c..2732f57 100644 --- a/src/lib/VideoCard.svelte +++ b/src/lib/VideoCard.svelte @@ -325,6 +325,7 @@ margin: 0; font-family: 'Fang', system-ui, sans-serif; font-size: 0.9rem; + font-weight: 700; color: #0A182B; line-height: 1.3; display: -webkit-box; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 0e19daa..45c44ab 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -13,29 +13,50 @@ import FrogHeader from "$lib/FrogHeader.svelte"; import WavyBorder from "$lib/WavyBorder.svelte"; + const PAGE_SIZE = 10; + let videos: VideoRecord[] = $state([]); - let cursor: string | undefined = $state(); let loading = $state(false); - let hasMore = $state(true); let selectedVideo: VideoRecord | null = $state(null); let selectedHandle = $state(""); let error = $state(""); + // Pagination state + let cursorHistory: (string | undefined)[] = $state([undefined]); + let pageIndex = $state(0); + let hasMore = $state(true); + async function loadPage() { - if (loading || !hasMore) return; loading = true; error = ""; try { - const res = await listVideos(cursor, 24); - videos = [...videos, ...res.records]; - cursor = res.cursor; - hasMore = !!res.cursor && res.records.length > 0; + const res = await listVideos(cursorHistory[pageIndex], PAGE_SIZE); + videos = res.records; + hasMore = !!res.cursor && res.records.length === PAGE_SIZE; + // Store the next cursor if we haven't been to this page before + if (hasMore && cursorHistory.length <= pageIndex + 1) { + cursorHistory = [...cursorHistory, res.cursor]; + } } catch (e: any) { error = e.message; } loading = false; } + function nextPage() { + if (!hasMore || loading) return; + pageIndex++; + loadPage(); + window.scrollTo({ top: 0, behavior: "smooth" }); + } + + function prevPage() { + if (pageIndex <= 0 || loading) return; + pageIndex--; + loadPage(); + window.scrollTo({ top: 0, behavior: "smooth" }); + } + function selectVideo(video: VideoRecord) { selectedVideo = video; resolveHandle(video.value.creator).then((h) => (selectedHandle = h)); @@ -53,7 +74,7 @@ window.history.pushState({}, "", url.toString()); } - // On mount: load videos, then check URL for a selected video + // On mount: load first page, then check URL for a selected video onMount(async () => { await loadPage(); const params = new URLSearchParams(window.location.search); @@ -91,7 +112,7 @@ - + {#if selectedVideo} @@ -124,13 +145,19 @@ {/each} - {#if hasMore} - - - {loading ? "loading..." : "load more"} + + {#if pageIndex > 0} + + ← previous - - {/if} + {/if} + page {pageIndex + 1} + {#if hasMore} + + next → + + {/if} +