Skip to content

Commit 30093b2

Browse files
authored
Merge pull request #182 from jo-elimu/24-paired-sponsorship
feat(frontend): paired sponsorship
2 parents 5941877 + 592b72b commit 30093b2

File tree

4 files changed

+86
-11
lines changed

4 files changed

+86
-11
lines changed

frontend/src/components/PairedDistribution.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,10 @@ export default function PairedDistribution({ sponsorshipQueueNumber }: { sponsor
4141
}
4242

4343
// Iterate processed queue pairs and look for matching queue number
44-
let distributionQueueNumber = undefined
45-
events.forEach(event => {
46-
console.debug("event.blockNumber:", event.blockNumber)
47-
if (event.args.sponsorshipQueueNumber == sponsorshipQueueNumber) {
48-
distributionQueueNumber = event.args.distributionQueueNumber
49-
return
50-
}
51-
})
44+
const matchingEvent = events.find(
45+
event => event.args.sponsorshipQueueNumber == sponsorshipQueueNumber
46+
)
47+
const distributionQueueNumber = matchingEvent?.args.distributionQueueNumber
5248
console.debug("distributionQueueNumber:", distributionQueueNumber)
5349

5450
if (!distributionQueueNumber) {
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { Address, createPublicClient, http } from "viem";
2+
import { abi as abi_queue_handler } from "../../../backend/ignition/deployments/chain-11155111/artifacts/QueueHandlerModule#QueueHandler.json"
3+
import deployed_addresses from "../../../backend/ignition/deployments/chain-11155111/deployed_addresses.json"
4+
import LoadingIndicator from "@/components/LoadingIndicator";
5+
import { sepolia } from "viem/chains";
6+
import { useEffect, useState } from "react";
7+
import Link from "next/link";
8+
9+
export default function PairedSponsorship({ distributionQueueNumber }: { distributionQueueNumber: number }) {
10+
console.debug("PairedSponsorship")
11+
12+
console.debug("distributionQueueNumber:", distributionQueueNumber)
13+
14+
const deploymentAddress: Address = deployed_addresses["QueueHandlerModule#QueueHandler"] as `0x${string}`
15+
console.debug("deploymentAddress:", deploymentAddress)
16+
17+
const publicClient = createPublicClient({
18+
chain: sepolia,
19+
transport: http("https://0xrpc.io/sep")
20+
})
21+
22+
const [events, setEvents] = useState(Array(0))
23+
useEffect(() => {
24+
async function fetchContractEvents() {
25+
const logs = await publicClient.getContractEvents({
26+
abi: abi_queue_handler,
27+
address: deploymentAddress,
28+
fromBlock: BigInt(9_760_219), // https://sepolia.etherscan.io/tx/0x01ea5a02fc320619f391757c038666722837e908c5094bef55b8a16824fb96e5
29+
eventName: "QueuePairProcessed"
30+
})
31+
console.debug("logs:", logs)
32+
setEvents(logs)
33+
}
34+
fetchContractEvents()
35+
}, [])
36+
console.debug("events.length:", events.length)
37+
console.debug("events:", events)
38+
39+
if (events.length == 0) {
40+
return <LoadingIndicator />
41+
}
42+
43+
// Iterate processed queue pairs and look for matching queue number
44+
const matchingEvent = events.find(
45+
event => event.args.distributionQueueNumber == distributionQueueNumber
46+
)
47+
const sponsorshipQueueNumber = matchingEvent?.args.sponsorshipQueueNumber
48+
console.debug("sponsorshipQueueNumber:", sponsorshipQueueNumber)
49+
50+
if (!sponsorshipQueueNumber) {
51+
return (
52+
<span className="p-2 text-sm text-gray-300 border-gray-400 bg-gray-600 border-2 rounded-xl">
53+
Pairing not yet <Link href="/process" className="text-purple-300" id="processLink">processed</Link>
54+
</span>
55+
)
56+
} else {
57+
return (
58+
<Link href={`/sponsorships/${sponsorshipQueueNumber}`} className="text-indigo-600">
59+
<div className="skew-y-3 p-4 text-2xl bg-indigo-200 dark:bg-indigo-950 rounded-lg border-indigo-400 border-r-4 border-b-4 hover:border-r-8 hover:border-b-8 hover:-translate-y-1">
60+
<div className="mb-4 text-center text-4xl">
61+
🛵💨
62+
</div>
63+
Sponsorship #{sponsorshipQueueNumber}
64+
</div>
65+
</Link>
66+
)
67+
}
68+
}

frontend/src/pages/distributions/[queueNumber].tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Verifications from "@/components/Verifications";
77
import deployed_addresses from "../../../../backend/ignition/deployments/chain-11155111/deployed_addresses.json";
88
import { Address } from "viem";
99
import Link from "next/link";
10+
import PairedSponsorship from "@/components/PairedSponsorship";
1011

1112
export default function DistributionDetails() {
1213
console.debug("DistributionDetails");
@@ -59,6 +60,15 @@ export default function DistributionDetails() {
5960
<Verifications queueNumber={queueNumber} eventName="DistributionRejected" />
6061
</div>
6162
</div>
63+
64+
<div className="mt-8 border-purple-100 dark:border-purple-950 border-t-2 pt-8">
65+
<h2 className="text-2xl text-center">
66+
Paired Sponsorship 🔗
67+
</h2>
68+
<div className="mt-4 text-center">
69+
<PairedSponsorship distributionQueueNumber={queueNumber} />
70+
</div>
71+
</div>
6272
</main>
6373
<MainFooter />
6474
</>

frontend/src/pages/distributors/[ethereumAddress].tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { sepolia } from "viem/chains";
99
import { useEffect, useState } from "react";
1010
import LoadingIndicator from "@/components/LoadingIndicator";
1111
import Link from "next/link";
12+
import PairedSponsorship from "@/components/PairedSponsorship";
1213

1314
export default function Distributor() {
1415
console.debug("Distributor");
@@ -98,7 +99,6 @@ export function LoadDistributionAddedEvents({ ethereumAddress }: {ethereumAddres
9899
<th className="bg-zinc-700 text-zinc-300 p-4 rounded-md">Queue Number</th>
99100
<th className="bg-zinc-700 text-zinc-300 p-4 rounded-md">Language Code</th>
100101
<th className="bg-zinc-700 text-zinc-300 p-4 rounded-md">Paired Sponsorship</th>
101-
<th className="bg-zinc-700 text-zinc-300 p-4 rounded-md">Student ID</th>
102102
</tr>
103103
</thead>
104104
<tbody>
@@ -116,8 +116,9 @@ export function LoadDistributionAddedEvents({ ethereumAddress }: {ethereumAddres
116116
</Link>
117117
</td>
118118
<td className="bg-zinc-800 text-zinc-400 p-2 rounded-md">???</td>
119-
<td className="bg-zinc-800 text-zinc-400 p-2 rounded-md">#???</td>
120-
<td className="bg-zinc-800 text-zinc-400 p-2 rounded-md">Student #???</td>
119+
<td className="bg-zinc-800 text-zinc-400 p-2 rounded-md">
120+
<PairedSponsorship distributionQueueNumber={el.args.queueNumber} />
121+
</td>
121122
</tr>
122123
)}
123124
</tbody>

0 commit comments

Comments
 (0)