Skip to content

Commit 9722ec5

Browse files
committed
feat: separate tweet component and load tweets one by one
1 parent 095a0f5 commit 9722ec5

File tree

7 files changed

+65
-36
lines changed

7 files changed

+65
-36
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
"typescript": "^5.8.3",
5151
"typescript-svelte-plugin": "^0.3.47",
5252
"unocss": "^66.1.3",
53+
"valibot": "^1.1.0",
5354
"vite": "npm:rolldown-vite@latest",
5455
"vite-plugin-favicons": "^0.1.7"
5556
},

pnpm-lock.yaml

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/lib/Tweet/Tweet.svelte

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<script lang='ts'>
2+
import { Tweet as Sveltweet } from 'sveltweet';
3+
import { getTweet } from './getTweet.remote';
4+
5+
type Props = Parameters<typeof getTweet>[0];
6+
7+
const { id }: Props = $props();
8+
</script>
9+
10+
<svelte:boundary>
11+
{#snippet pending()} loading{/snippet}
12+
<!-- eslint-disable-next-line antfu/no-top-level-await -->
13+
<Sveltweet tweet={await getTweet({ id })} />
14+
</svelte:boundary>

src/lib/Tweet/getTweet.remote.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { prerender } from '$app/server';
2+
import { retry } from '@std/async';
3+
import { error } from '@sveltejs/kit';
4+
import * as sveltweet from 'sveltweet/api';
5+
import * as v from 'valibot';
6+
7+
const getTweetPropsSchema = v.object({
8+
id: v.string(),
9+
});
10+
11+
/**
12+
* tweet を取得するRemote function
13+
* https://svelte.dev/docs/kit/remote-functions#form
14+
*/
15+
export const getTweet = prerender(getTweetPropsSchema, async ({ id }) => {
16+
const tweet = await retry(async () => {
17+
const _tweet = await sveltweet.getTweet(id);
18+
19+
if (_tweet == null) {
20+
throw new Error(`Retry: Tweet not found: ${id}`);
21+
}
22+
return _tweet;
23+
});
24+
if (tweet == null) {
25+
error(404, `Tweet not found: ${id}`);
26+
}
27+
return tweet;
28+
});

src/lib/Tweet/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import Tweet from './Tweet.svelte';
2+
3+
export { Tweet };

src/routes/ListenersTweets.svelte

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
<script lang='ts'>
22
import { Heading } from '$/lib/Heading';
3-
import { Tweet } from 'sveltweet';
4-
import { getTweets } from './tweet.remote';
5-
6-
const tweets = getTweets();
3+
import { LISTENERS_TWEET_IDS } from '$/lib/links';
4+
import { Tweet } from '$/lib/Tweet';
75
</script>
86

97
<section>
108
<Heading title='リスナーの声' />
119
<svelte:boundary>
1210
<div data-theme='dark'>
13-
{#each tweets.current as tweet (tweet.id_str)}
14-
<Tweet {tweet} />
11+
{#each LISTENERS_TWEET_IDS as id (id)}
12+
<Tweet {id} />
1513
{/each}
1614
</div>
1715
</svelte:boundary>

src/routes/tweet.remote.ts

Lines changed: 0 additions & 30 deletions
This file was deleted.

0 commit comments

Comments
 (0)