Skip to content

Commit 6b1b98d

Browse files
switch to GQL
1 parent bb9d7a5 commit 6b1b98d

5 files changed

Lines changed: 100 additions & 96 deletions

File tree

apps/landing-page/src/app/(home)/download/page.client.tsx

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@
33
import { Avatar, Tabs } from '@skeletonlabs/skeleton-react';
44
import { DownloadIcon, MonitorIcon, TerminalIcon } from 'lucide-react';
55
import { useState } from 'react';
6-
import type { Octokit } from 'octokit';
7-
8-
type OctokitRelease = Awaited<
9-
ReturnType<Octokit['rest']['repos']['listReleases']>
10-
>['data'][number];
6+
import type { GithubRelease, GithubAsset } from './types';
117

128
export default function DownloadView({
139
releases,
1410
}: {
15-
releases: OctokitRelease[];
11+
releases: GithubRelease[];
1612
}) {
1713
const [tabOS, setTabOS] = useState('windows');
1814
const [selectedReleaseIndex, setSelectedReleaseIndex] = useState(0);
@@ -23,7 +19,7 @@ export default function DownloadView({
2319

2420
const release = releases[selectedReleaseIndex];
2521

26-
const assets = release.assets ?? [];
22+
const assets = release.releaseAssets?.nodes ?? [];
2723
const windows = assets.filter((a) =>
2824
a.name.toLowerCase().includes('windows'),
2925
);
@@ -72,7 +68,7 @@ export default function DownloadView({
7268
>
7369
{releases.map((rel, index) => (
7470
<option key={rel.id} value={index}>
75-
{rel.name ?? rel.tag_name ?? `#${rel.id}`}
71+
{rel.name ?? rel.tagName ?? `#${rel.id}`}
7672
</option>
7773
))}
7874
</select>
@@ -81,7 +77,7 @@ export default function DownloadView({
8177
<div className="mt-4 flex items-center justify-center gap-4 text-surface-800-200">
8278
<Avatar className="size-10">
8379
<Avatar.Image
84-
src={release.author?.avatar_url ?? ''}
80+
src={release.author?.avatarUrl ?? ''}
8581
alt={release.author?.login ?? 'author'}
8682
/>
8783
<Avatar.Fallback>
@@ -96,9 +92,9 @@ export default function DownloadView({
9692
</span>
9793
<span className="opacity-60">
9894
Published on{' '}
99-
{release.published_at
95+
{release.publishedAt
10096
? new Date(
101-
release.published_at,
97+
release.publishedAt,
10298
).toLocaleDateString()
10399
: 'Unknown'}
104100
</span>
@@ -157,17 +153,7 @@ export default function DownloadView({
157153
);
158154
}
159155

160-
function AssetGrid({
161-
assets,
162-
}: {
163-
assets: {
164-
id: number;
165-
name: string;
166-
size: number;
167-
download_count: number;
168-
browser_download_url: string;
169-
}[];
170-
}) {
156+
function AssetGrid({ assets }: { assets: GithubAsset[] }) {
171157
if (!assets || assets.length === 0) {
172158
return (
173159
<div className="card preset-filled-surface-100-900 mx-auto flex max-w-xl flex-col items-center justify-center p-12 text-center opacity-70">
@@ -191,12 +177,12 @@ function AssetGrid({
191177
{(asset.size / 1024 / 1024).toFixed(2)} MB
192178
</span>
193179
<span className="badge preset-tonal-surface rounded-lg py-1 text-xs">
194-
{asset.download_count} Downloads
180+
{asset.downloadCount} Downloads
195181
</span>
196182
</div>
197183
</div>
198184
<a
199-
href={asset.browser_download_url}
185+
href={asset.downloadUrl}
200186
className="btn preset-filled w-full font-bold"
201187
>
202188
<DownloadIcon className="mr-2 size-4" /> Download

apps/landing-page/src/app/(home)/download/page.tsx

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,49 @@
11
import { AlertTriangle } from 'lucide-react';
22
import DownloadView from './page.client';
33
import { RequestError } from 'octokit';
4-
import type { Octokit } from 'octokit';
54
import { octokit } from '@/server/providers/octokit.server';
6-
7-
type OctokitRelease = Awaited<
8-
ReturnType<Octokit['rest']['repos']['listReleases']>
9-
>['data'][number];
5+
import type { GithubRelease } from './types';
106

117
export default async function DownloadPage() {
12-
let allReleases: OctokitRelease[] = [];
8+
let allReleases: GithubRelease[] = [];
139
try {
14-
const octokitReleases = await octokit.paginate(
15-
octokit.rest.repos.listReleases,
16-
{
17-
owner: 'chithi-dev',
18-
repo: 'chithi',
19-
per_page: 100,
20-
},
21-
);
22-
allReleases = octokitReleases as OctokitRelease[];
10+
const data = await octokit.graphql<{
11+
repository: {
12+
releases: {
13+
nodes: GithubRelease[];
14+
};
15+
};
16+
}>(`
17+
query {
18+
repository(owner: "chithi-dev", name: "chithi") {
19+
releases(first: 100, orderBy: {field: CREATED_AT, direction: DESC}) {
20+
nodes {
21+
id
22+
name
23+
tagName
24+
publishedAt
25+
author {
26+
login
27+
avatarUrl
28+
}
29+
releaseAssets(first: 100) {
30+
nodes {
31+
id
32+
name
33+
size
34+
downloadCount
35+
downloadUrl
36+
}
37+
}
38+
}
39+
}
40+
}
41+
}
42+
`);
43+
44+
if (data?.repository?.releases?.nodes) {
45+
allReleases = data.repository.releases.nodes;
46+
}
2347
} catch (error: unknown) {
2448
const isRateLimited =
2549
error instanceof RequestError && error.status === 403;
Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
1-
// Define minimal types for the GitHub Release and Assets
2-
export type Asset = {
3-
id: number;
1+
export type GithubAsset = {
2+
id: string;
43
name: string;
54
size: number;
6-
download_count: number;
7-
browser_download_url: string;
5+
downloadCount: number;
6+
downloadUrl: string;
87
};
98

10-
export type Release = {
11-
id: number;
9+
export type GithubRelease = {
10+
id: string;
1211
name: string;
1312
tagName: string;
14-
published_at: string;
15-
author: { login: string; avatar_url: string };
16-
assets: Asset[];
13+
publishedAt: string;
14+
author: {
15+
login: string;
16+
avatarUrl: string;
17+
};
18+
releaseAssets: {
19+
nodes: GithubAsset[];
20+
};
1721
};

apps/landing-page/src/app/(home)/layout.client.tsx

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,20 @@ import Image from 'next/image';
55
import Link from 'next/link';
66
import { GithubIcon as Github } from '@/icons/github';
77
import { Star, GitBranch } from 'lucide-react';
8-
import type { Octokit } from 'octokit';
98

10-
type OctokitRelease = Awaited<
11-
ReturnType<Octokit['rest']['repos']['getLatestRelease']>
12-
>['data'];
13-
type OctokitRepo = Awaited<ReturnType<Octokit['rest']['repos']['get']>>['data'];
9+
type GithubRepoData = {
10+
stargazerCount: number;
11+
forkCount: number;
12+
latestRelease: {
13+
tagName: string;
14+
} | null;
15+
} | null;
1416

1517
type Props = {
16-
release?: OctokitRelease | null;
17-
repo?: OctokitRepo | null;
18+
repo?: GithubRepoData;
1819
};
1920

20-
export function Navbar({ release, repo }: Props) {
21+
export function Navbar({ repo }: Props) {
2122
return (
2223
<div className="sticky top-0 z-50 border-surface-200-800/50 border-b bg-transparent backdrop-blur-md">
2324
<AppBar className="mx-auto w-full max-w-7xl bg-transparent">
@@ -43,9 +44,9 @@ export function Navbar({ release, repo }: Props) {
4344
className="btn btn-sm hover:preset-tonal flex items-center gap-2 rounded-full border border-surface-200-800 px-4 transition-colors"
4445
>
4546
<Github size={16} />
46-
{release?.tag_name && (
47+
{repo?.latestRelease?.tagName && (
4748
<span className="opacity-50">
48-
{release.tag_name}
49+
{repo.latestRelease.tagName}
4950
</span>
5051
)}
5152
</a>
@@ -55,7 +56,7 @@ export function Navbar({ release, repo }: Props) {
5556
>
5657
<Star size={14} />
5758
<span className="opacity-60 text-sm">
58-
{repo?.stargazers_count ?? 0}
59+
{repo?.stargazerCount ?? 0}
5960
</span>
6061
</a>
6162

@@ -65,7 +66,7 @@ export function Navbar({ release, repo }: Props) {
6566
>
6667
<GitBranch size={14} />
6768
<span className="opacity-60 text-sm">
68-
{repo?.forks_count ?? 0}
69+
{repo?.forkCount ?? 0}
6970
</span>
7071
</a>
7172
</AppBar.Trail>
@@ -109,16 +110,14 @@ export function Footer() {
109110

110111
export default function HomeLayoutClient({
111112
children,
112-
release,
113113
repo = null,
114114
}: Readonly<{
115115
children: React.ReactNode;
116-
release?: OctokitRelease | null;
117-
repo?: OctokitRepo | null;
116+
repo?: GithubRepoData | null;
118117
}>) {
119118
return (
120119
<div className="min-h-screen overflow-x-hidden font-sans text-surface-900-100">
121-
<Navbar release={release} repo={repo} />
120+
<Navbar repo={repo} />
122121
{children}
123122
<Footer />
124123
</div>

apps/landing-page/src/app/(home)/layout.tsx

Lines changed: 22 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,44 +7,35 @@ export default async function HomeLayout({
77
children: React.ReactNode;
88
}>) {
99
// Inline concurrent fetch of latest release and repo data
10-
let release = null;
1110
let repoData = null;
1211

1312
try {
14-
const releasePromise = octokit.rest.repos.getLatestRelease({
15-
owner: 'chithi-dev',
16-
repo: 'chithi',
17-
});
13+
const data = await octokit.graphql<{
14+
repository: {
15+
stargazerCount: number;
16+
forkCount: number;
17+
latestRelease: {
18+
tagName: string;
19+
} | null;
20+
};
21+
}>(`
22+
query {
23+
repository(owner: "chithi-dev", name: "chithi") {
24+
stargazerCount
25+
forkCount
26+
latestRelease {
27+
tagName
28+
}
29+
}
30+
}
31+
`);
1832

19-
const repoPromise = octokit.rest.repos.get({
20-
owner: 'chithi-dev',
21-
repo: 'chithi',
22-
});
23-
24-
const [releaseRes, repoRes] = await Promise.allSettled([
25-
releasePromise,
26-
repoPromise,
27-
]);
28-
29-
if (releaseRes.status === 'fulfilled') {
30-
release = releaseRes.value.data;
31-
} else {
32-
// Not fatal: repository may have no releases or request may fail
33-
console.warn('getLatestRelease failed', releaseRes.reason);
34-
}
35-
36-
if (repoRes.status === 'fulfilled') {
37-
repoData = repoRes.value.data;
38-
} else {
39-
console.error('Failed to fetch repository data', repoRes.reason);
33+
if (data?.repository) {
34+
repoData = data.repository;
4035
}
4136
} catch (err) {
4237
console.error('Unexpected error fetching GitHub data', err);
4338
}
4439

45-
return (
46-
<HomeLayoutClient release={release} repo={repoData}>
47-
{children}
48-
</HomeLayoutClient>
49-
);
40+
return <HomeLayoutClient repo={repoData}>{children}</HomeLayoutClient>;
5041
}

0 commit comments

Comments
 (0)