Skip to content

Commit 302bd1c

Browse files
committed
fix: share blog sidebar widgets
1 parent 690dc85 commit 302bd1c

File tree

3 files changed

+59
-129
lines changed

3 files changed

+59
-129
lines changed

src/components/LibrariesWidget.tsx

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { libraries } from '~/libraries'
2+
3+
const featuredLibraries = libraries
4+
.filter((library) => library.visible !== false)
5+
.slice(0, 8)
6+
.map((library) => ({
7+
id: library.id,
8+
name: library.name,
9+
}))
10+
11+
export function LibrariesWidget() {
12+
return (
13+
<div className="p-4">
14+
<div className="mb-3">
15+
<a href="/#libraries" className="font-semibold text-sm">
16+
Libraries
17+
</a>
18+
</div>
19+
<div className="grid grid-cols-2 gap-2">
20+
{featuredLibraries.map((library) => (
21+
<a
22+
key={library.id}
23+
href={`/${library.id}/latest`}
24+
className="text-xs opacity-70 hover:opacity-100 hover:underline"
25+
>
26+
{library.name.replace('TanStack ', '')}
27+
</a>
28+
))}
29+
</div>
30+
</div>
31+
)
32+
}

src/routes/blog.$.tsx

Lines changed: 16 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,19 @@
1-
import {
2-
notFound,
3-
redirect,
4-
createFileRoute,
5-
Link,
6-
} from '@tanstack/react-router'
1+
import { notFound, redirect, createFileRoute } from '@tanstack/react-router'
72
import { seo } from '~/utils/seo'
83
import { PostNotFound } from './blog'
94
import { createServerFn } from '@tanstack/react-start'
10-
import { formatAuthors, getPublishedPosts } from '~/utils/blog'
5+
import { formatAuthors } from '~/utils/blog'
116
import { format } from '~/utils/dates'
127
import * as v from 'valibot'
138
import { setResponseHeaders } from '@tanstack/react-start/server'
149
import { allPosts } from 'content-collections'
1510
import * as React from 'react'
1611
import { MarkdownContent } from '~/components/markdown'
1712
import { Card } from '~/components/Card'
18-
import { libraries } from '~/libraries'
13+
import { LibrariesWidget } from '~/components/LibrariesWidget'
1914
import { partners } from '~/utils/partners'
2015
import { PartnersRail, RightRail } from '~/components/RightRail'
16+
import { RecentPostsWidget } from '~/components/RecentPostsWidget'
2117

2218
import { Toc } from '~/components/Toc'
2319
import { Breadcrumbs } from '~/components/Breadcrumbs'
@@ -59,22 +55,6 @@ const fetchBlogPost = createServerFn({ method: 'GET' })
5955
const now = new Date()
6056
const publishDate = new Date(post.published)
6157
const isUnpublished = post.draft || publishDate > now
62-
const recentPosts = getPublishedPosts()
63-
.filter((entry) => entry.slug !== docsPath)
64-
.slice(0, 5)
65-
.map((entry) => ({
66-
slug: entry.slug,
67-
title: entry.title,
68-
}))
69-
70-
const featuredLibraries = libraries
71-
.filter((library) => library.visible !== false)
72-
.slice(0, 8)
73-
.map((library) => ({
74-
id: library.id,
75-
name: library.name,
76-
}))
77-
7858
return {
7959
title: post.title,
8060
description: post.excerpt,
@@ -84,8 +64,6 @@ const fetchBlogPost = createServerFn({ method: 'GET' })
8464
headerImage: post.headerImage,
8565
filePath,
8666
isUnpublished,
87-
recentPosts,
88-
featuredLibraries,
8967
}
9068
})
9169

@@ -128,15 +106,7 @@ export const Route = createFileRoute('/blog/$')({
128106
})
129107

130108
function BlogPost() {
131-
const {
132-
title,
133-
content,
134-
filePath,
135-
authors,
136-
published,
137-
recentPosts,
138-
featuredLibraries,
139-
} = Route.useLoaderData()
109+
const { title, content, filePath, authors, published } = Route.useLoaderData()
140110

141111
const blogContent = `<small>_by ${formatAuthors(authors)} on ${format(
142112
new Date(published || 0),
@@ -201,14 +171,12 @@ ${content}`
201171
const branch = 'main'
202172
const activePartners = React.useMemo(
203173
() =>
204-
partners
205-
.filter(
206-
(d) =>
207-
d.status === 'active' &&
208-
d.name !== 'Nozzle.io' &&
209-
d.id !== 'fireship',
210-
)
211-
.slice(0, 8),
174+
partners.filter(
175+
(d) =>
176+
d.status === 'active' &&
177+
d.name !== 'Nozzle.io' &&
178+
d.id !== 'fireship',
179+
),
212180
[],
213181
)
214182

@@ -274,42 +242,11 @@ ${content}`
274242
</div>
275243
<RightRail breakpoint="md">
276244
<PartnersRail partners={activePartners} />
277-
<Card className="p-4">
278-
<div className="mb-3 flex items-center justify-between">
279-
<Link to="/blog" className="font-semibold text-sm">
280-
Blog Posts
281-
</Link>
282-
</div>
283-
<div className="flex flex-col gap-2">
284-
{recentPosts.map((post) => (
285-
<a
286-
key={post.slug}
287-
href={`/blog/${post.slug}`}
288-
className="text-xs opacity-70 hover:opacity-100 hover:underline"
289-
>
290-
{post.title}
291-
</a>
292-
))}
293-
</div>
294-
</Card>
295-
296-
<Card className="p-4">
297-
<div className="mb-3">
298-
<a href="/#libraries" className="font-semibold text-sm">
299-
Libraries
300-
</a>
301-
</div>
302-
<div className="grid grid-cols-2 gap-2">
303-
{featuredLibraries.map((library) => (
304-
<a
305-
key={library.id}
306-
href={`/${library.id}/latest`}
307-
className="text-xs opacity-70 hover:opacity-100 hover:underline"
308-
>
309-
{library.name.replace('TanStack ', '')}
310-
</a>
311-
))}
312-
</div>
245+
<div className="hidden md:block border border-gray-500/20 rounded-l-lg overflow-hidden w-full">
246+
<RecentPostsWidget />
247+
</div>
248+
<Card>
249+
<LibrariesWidget />
313250
</Card>
314251
</RightRail>
315252
</div>

src/routes/blog.index.tsx

Lines changed: 11 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ import { PostNotFound } from './blog'
88
import { createServerFn } from '@tanstack/react-start'
99
import { setResponseHeaders } from '@tanstack/react-start/server'
1010
import { RssIcon } from 'lucide-react'
11-
import { libraries } from '~/libraries'
11+
import { LibrariesWidget } from '~/components/LibrariesWidget'
1212
import { partners } from '~/utils/partners'
1313
import { PartnersRail, RightRail } from '~/components/RightRail'
14+
import { RecentPostsWidget } from '~/components/RecentPostsWidget'
1415

1516
type BlogFrontMatter = {
1617
slug: string
@@ -66,20 +67,10 @@ export const Route = createFileRoute('/blog/')({
6667

6768
function BlogIndex() {
6869
const frontMatters = Route.useLoaderData() as BlogFrontMatter[]
69-
const recentPosts = frontMatters.slice(0, 5)
70-
const featuredLibraries = libraries
71-
.filter((library) => library.visible !== false)
72-
.slice(0, 8)
73-
.map((library) => ({
74-
id: library.id,
75-
name: library.name,
76-
}))
77-
const activePartners = partners
78-
.filter(
79-
(d) =>
80-
d.status === 'active' && d.name !== 'Nozzle.io' && d.id !== 'fireship',
81-
)
82-
.slice(0, 8)
70+
const activePartners = partners.filter(
71+
(d) =>
72+
d.status === 'active' && d.name !== 'Nozzle.io' && d.id !== 'fireship',
73+
)
8374

8475
return (
8576
<div className="flex flex-col max-w-full min-h-screen gap-12 p-4 md:p-8 pb-0">
@@ -164,41 +155,11 @@ function BlogIndex() {
164155
</div>
165156
<RightRail breakpoint="md">
166157
<PartnersRail partners={activePartners} />
167-
<Card className="p-4">
168-
<div className="mb-3 flex items-center justify-between">
169-
<Link to="/blog" className="font-semibold text-sm">
170-
Latest Posts
171-
</Link>
172-
</div>
173-
<div className="flex flex-col gap-2">
174-
{recentPosts.map((post) => (
175-
<a
176-
key={post.slug}
177-
href={`/blog/${post.slug}`}
178-
className="text-xs opacity-70 hover:opacity-100 hover:underline"
179-
>
180-
{post.title}
181-
</a>
182-
))}
183-
</div>
184-
</Card>
185-
<Card className="p-4">
186-
<div className="mb-3">
187-
<a href="/#libraries" className="font-semibold text-sm">
188-
Libraries
189-
</a>
190-
</div>
191-
<div className="grid grid-cols-2 gap-2">
192-
{featuredLibraries.map((library) => (
193-
<a
194-
key={library.id}
195-
href={`/${library.id}/latest`}
196-
className="text-xs opacity-70 hover:opacity-100 hover:underline"
197-
>
198-
{library.name.replace('TanStack ', '')}
199-
</a>
200-
))}
201-
</div>
158+
<div className="hidden md:block border border-gray-500/20 rounded-l-lg overflow-hidden w-full">
159+
<RecentPostsWidget />
160+
</div>
161+
<Card>
162+
<LibrariesWidget />
202163
</Card>
203164
</RightRail>
204165
</div>

0 commit comments

Comments
 (0)