Skip to content

Commit eb4f00b

Browse files
committed
Add sponsors endpoint
1 parent 90b8970 commit eb4f00b

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { fetchLatestSponsors } from "@/app/landing/sponsors"
2+
3+
export async function GET() {
4+
try {
5+
const sponsors = await fetchLatestSponsors(5)
6+
return Response.json(sponsors)
7+
} catch (error: any) {
8+
return Response.json(
9+
{ error: error.message || "Failed to fetch sponsors" },
10+
{ status: 500 }
11+
)
12+
}
13+
}

apps/web/app/landing/sponsors.tsx

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export function Pricing() {
8686
)
8787
}
8888

89-
export async function LatestSponsor({ className }: { className?: string }) {
89+
export async function fetchLatestSponsors(limit: number = 5) {
9090
const GITHUB_TOKEN = process.env.GITHUB_TOKEN
9191
if (!GITHUB_TOKEN) {
9292
throw new Error("Missing process.env.GITHUB_TOKEN")
@@ -110,20 +110,36 @@ export async function LatestSponsor({ className }: { className?: string }) {
110110
throw new Error("No sponsors found")
111111
}
112112

113-
const latest = sponsors[0].node
113+
return sponsors.slice(0, limit).map((edge: any) => {
114+
const node = edge.node
115+
const entity = node.sponsorEntity
116+
return {
117+
login: entity.login,
118+
name: entity.name || entity.login,
119+
avatarUrl: entity.avatarUrl,
120+
createdAt: node.createdAt,
121+
tierName: node.tier.name,
122+
websiteUrl: entity.websiteUrl,
123+
}
124+
})
125+
}
126+
127+
export async function LatestSponsor({ className }: { className?: string }) {
128+
const sponsors = await fetchLatestSponsors(1)
129+
const latest = sponsors[0]
114130

115131
return (
116132
<a
117-
href={`https://github.com/${latest.sponsorEntity.login}`}
133+
href={`https://github.com/${latest.login}`}
118134
className={cn(
119135
className,
120136
"rounded bg-zinc-50 dark:bg-zinc-900 p-3 flex gap-3 border border-zinc-200/50 dark:border-zinc-700/50 hover:border-zinc-200 dark:hover:border-zinc-700 transition-colors w-96 md:w-full mx-auto",
121137
)}
122138
>
123139
<Image
124140
className="rounded my-0 max-h-20"
125-
src={`${latest.sponsorEntity.avatarUrl}`}
126-
alt={latest.sponsorEntity.name}
141+
src={latest.avatarUrl}
142+
alt={latest.name}
127143
height={80}
128144
width={80}
129145
placeholder="empty"
@@ -133,11 +149,9 @@ export async function LatestSponsor({ className }: { className?: string }) {
133149
<div className="text-primary/70 text-sm">
134150
Latest sponsor · <TimeAgo date={latest.createdAt} />
135151
</div>
136-
<div className="text-2xl font-bold">
137-
{latest.sponsorEntity.name || latest.sponsorEntity.login}
138-
</div>
152+
<div className="text-2xl font-bold">{latest.name}</div>
139153
<div className="text-primary/90 text-sm">
140-
Sponsoring <strong>{latest.tier.name}</strong>{" "}
154+
Sponsoring <strong>{latest.tierName}</strong>{" "}
141155
</div>
142156
</div>
143157
{/* <pre>{JSON.stringify(latest, null, 2)}</pre> */}

0 commit comments

Comments
 (0)