Skip to content

Commit 982a5ff

Browse files
committed
Chore: updated hall of fame to show graduates
1 parent 4c68474 commit 982a5ff

File tree

2 files changed

+42
-17
lines changed

2 files changed

+42
-17
lines changed

packages/nextjs/app/hall-of-fame/_components/GraduateCard.tsx

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
"use client";
22

33
import { useEffect, useState } from "react";
4+
import Image from "next/image";
45
import Link from "next/link";
5-
import { Address } from "@scaffold-ui/components";
66
import { useScaffoldReadContract } from "~~/hooks/scaffold-eth";
77

88
export const GraduateCard = ({ tokenId, graduateAddress }: { tokenId: bigint; graduateAddress: string }) => {
@@ -40,22 +40,18 @@ export const GraduateCard = ({ tokenId, graduateAddress }: { tokenId: bigint; gr
4040
}
4141

4242
return (
43-
<div className="card w-full bg-base-100 shadow-xl hover:shadow-2xl transition-all duration-300 hover:-translate-y-1 border border-base-300">
43+
<div className="">
4444
<Link href={`/builders/${graduateAddress}`} className="w-full">
4545
<figure className="bg-base-200 cursor-pointer">
46-
<img src={metadata.image} alt={metadata.name} className="rounded-t-xl shadow-lg w-full object-cover h-64" />
46+
<Image src={metadata.image} alt={metadata.name} className="" />
4747
</figure>
4848
</Link>
4949
<div className="card-body items-center text-center pt-2.5">
5050
<Link href={`/builders/${graduateAddress}`} className="hover:underline cursor-pointer">
51-
<h2 className="card-title text-2xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-primary to-secondary dark:text-white dark:bg-none">
52-
{metadata.name}
51+
<h2 className="card-title truncate text-2xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-primary to-primary dark:text-white dark:bg-none">
52+
{metadata.name.replaceAll("Graduate", "")}
5353
</h2>
5454
</Link>
55-
<p className="text-sm text-gray-500 italic mb-2 mt-0">{metadata.description}</p>
56-
<div className="w-full flex justify-center">
57-
<Address address={graduateAddress} />
58-
</div>
5955
</div>
6056
</div>
6157
);

packages/nextjs/app/hall-of-fame/page.tsx

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,48 @@
11
"use client";
22

3+
import { useEffect, useState } from "react";
34
import { GraduateCard } from "./_components/GraduateCard";
5+
import { parseAbiItem } from "viem";
6+
import { usePublicClient } from "wagmi";
47
import { TrophyIcon } from "@heroicons/react/24/outline";
5-
import { useScaffoldEventHistory } from "~~/hooks/scaffold-eth";
8+
import { useScaffoldReadContract } from "~~/hooks/scaffold-eth";
69

710
export default function HallOfFame() {
8-
const { data: transferEvents, isLoading } = useScaffoldEventHistory({
9-
contractName: "BatchGraduationNFT",
10-
eventName: "Transfer",
11-
fromBlock: 0n,
12-
filters: { from: "0x0000000000000000000000000000000000000000" },
11+
const { data: nftAddress } = useScaffoldReadContract({
12+
contractName: "BatchRegistry",
13+
functionName: "batchGraduationNFT",
1314
});
1415

16+
const publicClient = usePublicClient();
17+
const [transferEvents, setTransferEvents] = useState<any[]>([]);
18+
const [isLoading, setIsLoading] = useState(true);
19+
20+
useEffect(() => {
21+
const fetchEvents = async () => {
22+
if (!nftAddress || !publicClient) return;
23+
24+
setIsLoading(true);
25+
try {
26+
const logs = await publicClient.getLogs({
27+
address: nftAddress,
28+
event: parseAbiItem("event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)"),
29+
args: { from: "0x0000000000000000000000000000000000000000" },
30+
fromBlock: 0n,
31+
toBlock: "latest",
32+
});
33+
setTransferEvents(logs);
34+
} catch (e) {
35+
console.error(e);
36+
} finally {
37+
setIsLoading(false);
38+
}
39+
};
40+
41+
fetchEvents();
42+
}, [nftAddress, publicClient]);
43+
1544
// I use this to sort events by tokenId (descending) to show newest graduates first
16-
const sortedEvents = transferEvents?.slice().sort((a, b) => {
45+
const sortedEvents = transferEvents?.slice().sort((a: any, b: any) => {
1746
const tokenIdA = a.args.tokenId || 0n;
1847
const tokenIdB = b.args.tokenId || 0n;
1948
return Number(tokenIdB - tokenIdA);
@@ -36,7 +65,7 @@ export default function HallOfFame() {
3665
<span className="loading loading-spinner loading-lg text-primary"></span>
3766
</div>
3867
) : (
39-
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8 p-6 max-w-7xl w-full">
68+
<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-8 p-6 max-w-7xl w-full">
4069
{sortedEvents?.map((event: any) => (
4170
<GraduateCard
4271
key={event.args.tokenId?.toString()}

0 commit comments

Comments
 (0)