Skip to content

Commit 39cac2c

Browse files
authored
Merge pull request #31 from byte-hedgy/dev-hedgy-issue-g
Add builders page.
2 parents 145607b + 7a0acdb commit 39cac2c

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import fs from "fs/promises";
2+
import path from "path";
3+
import BuildersGrid from "~~/components/builders/BuildersGrid";
4+
5+
export default async function BuildersPage() {
6+
const currentDir = path.join(process.cwd(), "app", "builders");
7+
const files = await fs.readdir(currentDir, { withFileTypes: true });
8+
const publishedBuilders = files.filter(file => file.isDirectory()).map(dir => dir.name);
9+
return (
10+
<div className="flex items-center flex-col flex-grow pt-10">
11+
<div className="text-center w-full lg:w-2/3">
12+
<h1 className="font-extrabold mb-2 bg-gradient-to-r from-purple-500 to-indigo-600 bg-clip-text text-transparent text-xl sm:text-2xl md:text-3xl lg:text-4xl leading-relaxed">
13+
Batch 18: Checked-in Builders
14+
</h1>
15+
<div>
16+
<BuildersGrid publishedBuilders={publishedBuilders} />
17+
</div>
18+
</div>
19+
</div>
20+
);
21+
}

packages/nextjs/components/Header.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import Image from "next/image";
55
import Link from "next/link";
66
import { usePathname } from "next/navigation";
77
import { hardhat } from "viem/chains";
8-
import { Bars3Icon, BugAntIcon } from "@heroicons/react/24/outline";
8+
import { Bars3Icon, BugAntIcon, UsersIcon } from "@heroicons/react/24/outline";
99
import { FaucetButton, RainbowKitCustomConnectButton } from "~~/components/scaffold-eth";
1010
import { useOutsideClick, useTargetNetwork } from "~~/hooks/scaffold-eth";
1111

@@ -20,6 +20,11 @@ export const menuLinks: HeaderMenuLink[] = [
2020
label: "Home",
2121
href: "/",
2222
},
23+
{
24+
label: "Builders",
25+
href: "/builders",
26+
icon: <UsersIcon className="h-4 w-4" />,
27+
},
2328
{
2429
label: "Debug Contracts",
2530
href: "/debug",
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
"use client";
2+
3+
import Link from "next/link";
4+
import { Address } from "~~/components/scaffold-eth";
5+
import { useScaffoldEventHistory } from "~~/hooks/scaffold-eth";
6+
7+
type Props = {
8+
publishedBuilders: string[];
9+
};
10+
11+
const CONTRACT_FROM_BLOCK: bigint = 355913556n;
12+
13+
export default function BuildersGrid({ publishedBuilders }: Props) {
14+
const { data: checkedInEvents, isLoading: isEventsLoading } = useScaffoldEventHistory({
15+
contractName: "BatchRegistry",
16+
eventName: "CheckedIn",
17+
fromBlock: CONTRACT_FROM_BLOCK,
18+
blocksBatchSize: 5000000, // default 500, so slowly.
19+
});
20+
const filteredEvents = checkedInEvents?.filter(event => event?.args?.first);
21+
22+
return isEventsLoading ? (
23+
<p>Loading checked-in events...</p>
24+
) : (
25+
<div className="grid grid-cols-1 lg:grid-cols-3 px-6 lg:px-10 lg:gap-4 w-full max-w-7xl">
26+
{filteredEvents?.map((event, index) => {
27+
return (
28+
<div
29+
key={index}
30+
className="bg-base-100 border-base-300 border shadow-md shadow-secondary rounded-3xl px-6 lg:px-8 py-4"
31+
>
32+
<div className="flex">
33+
<div className="flex flex-col gap-1 w-full">
34+
<div className="flex gap-3 items-center">
35+
<span className="font-bold w-1/4">Builder</span>
36+
<Address address={event.args.builder} onlyEnsOrAddress />
37+
</div>
38+
<div className="flex gap-3 items-center">
39+
<span className="font-bold w-1/4">Contract</span>
40+
<Address address={event.args.checkInContract} format="short" onlyEnsOrAddress />
41+
</div>
42+
<div className="flex gap-3 items-center">
43+
<span className="font-bold w-1/4">Profile</span>
44+
{publishedBuilders.includes(event.args.builder ?? "") ? (
45+
<div className="flex gap-3 items-center">
46+
<Link href={`builders/${event.args.builder}`} target="_blank">
47+
<button className="btn btn-secondary btn-xs self-end md:self-start">View 🧑‍💻</button>
48+
</Link>
49+
</div>
50+
) : (
51+
<span className="text-sm">N/A</span>
52+
)}
53+
</div>
54+
</div>
55+
</div>
56+
</div>
57+
);
58+
})}
59+
</div>
60+
);
61+
}

0 commit comments

Comments
 (0)