Skip to content

Commit 11cadfc

Browse files
committed
user feedback on claim rewards and display claim status
1 parent bd9bea4 commit 11cadfc

38 files changed

Lines changed: 2711 additions & 4492 deletions

packages/dapp/src/components/projects/pathways/PathwayCard.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ function PathwayCard({
175175
title: "Pathway approved!",
176176
description: `Approval vote submitted successfully!`,
177177
status: "success",
178-
position: "top-right",
178+
position: "bottom-right",
179179
duration: 6000,
180180
isClosable: true,
181181
variant: "subtle",
@@ -255,7 +255,7 @@ function PathwayCard({
255255
title: "Pathway minted!",
256256
description: `Pathway minted and created successfully!`,
257257
status: "success",
258-
position: "top-right",
258+
position: "bottom-right",
259259
duration: 6000,
260260
isClosable: true,
261261
variant: "subtle",

packages/dapp/src/components/projects/pathways/PathwayFormWrapper.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ function PathwayFormWrapper() {
121121
title: "Insufficient funds",
122122
description: `You don't have enough funds to provide the pathway rewards in this currency`,
123123
status: "error",
124-
position: "top-right",
124+
position: "bottom-right",
125125
duration: 6000,
126126
isClosable: true,
127127
variant: "subtle",
@@ -140,7 +140,7 @@ function PathwayFormWrapper() {
140140
title: "Insufficient funds",
141141
description: "You don't have enough funds to provide pathway rewards",
142142
status: "error",
143-
position: "top-right",
143+
position: "bottom-right",
144144
duration: 6000,
145145
isClosable: true,
146146
variant: "subtle",

packages/dapp/src/components/projects/quests/QuestCard.tsx

Lines changed: 27 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ function QuestCard({
8989
}) {
9090
const [isApproving, setIsApproving] = useState<boolean>(false);
9191
const [isCreatingToken, setIsCreatingToken] = useState<boolean>(false);
92+
const [claimedBy, setClaimedBy] = useState<string[]>();
93+
9294
const toast = useToast();
9395
const router = useRouter();
9496
const { getRewardCurrency } = useTokenList();
@@ -125,6 +127,14 @@ function QuestCard({
125127
const isMinted = await contracts.BadgeNFT.badgeMinted(quest.streamId);
126128
const statusString = await contracts.BadgeNFT.statusStrings(statusInt);
127129
setStatus(isMinted ? "MINTED" : statusString);
130+
const claimedByAddresses =
131+
await contracts.BadgeNFT.getAllAddrsByBadgeIDVersion(
132+
quest.streamId,
133+
0
134+
);
135+
136+
console.log({ claimedByAddresses });
137+
return setClaimedBy(claimedByAddresses);
128138
}
129139
null;
130140
}
@@ -193,7 +203,7 @@ function QuestCard({
193203
title: "Quest approved!",
194204
description: `Approval vote submitted successfully!`,
195205
status: "success",
196-
position: "top-right",
206+
position: "bottom-right",
197207
duration: 6000,
198208
isClosable: true,
199209
variant: "subtle",
@@ -270,73 +280,7 @@ function QuestCard({
270280
title: "Quest minted!",
271281
description: `Quest minted and created successfully!`,
272282
status: "success",
273-
position: "top-right",
274-
duration: 6000,
275-
isClosable: true,
276-
variant: "subtle",
277-
});
278-
};
279-
280-
const handleClaimRewards = async () => {
281-
const signatureInput = {
282-
id: quest.id,
283-
pathwayId: quest.pathwayId,
284-
};
285-
const signature = await library.provider.send("personal_sign", [
286-
JSON.stringify(signatureInput),
287-
account,
288-
]);
289-
290-
const formData = new FormData();
291-
const ogFile = await fetch(`https://ipfs.io/ipfs/${quest.image}`);
292-
const questImage = await ogFile.blob();
293-
formData.append("image", questImage);
294-
formData.append(
295-
"metadata",
296-
JSON.stringify({
297-
...quest,
298-
})
299-
);
300-
301-
const nftCidRes = await fetch("/api/quest-nft-storage", {
302-
method: "POST",
303-
body: formData,
304-
});
305-
const { url } = await nftCidRes.json();
306-
307-
const { data } = await claimQuestRewardsMutation({
308-
variables: {
309-
input: {
310-
questId: quest.id,
311-
did: self.id,
312-
questAdventurerSignature: signature.result,
313-
chainId,
314-
},
315-
},
316-
});
317-
318-
const [, tokenAddressOrSymbol] = quest.rewardCurrency.split(":");
319-
const isNativeToken = tokenAddressOrSymbol ? false : true;
320-
321-
const [metadataVerify] = data.claimQuestRewards.expandedServerSignatures;
322-
323-
console.log({ metadataVerify });
324-
const claimRewardsTx = await contracts.BadgeNFT.claimBadgeRewards(
325-
quest.streamId,
326-
isNativeToken,
327-
isNativeToken ? account : tokenAddressOrSymbol,
328-
metadataVerify.r,
329-
metadataVerify.s,
330-
metadataVerify.v,
331-
true,
332-
url
333-
);
334-
await claimRewardsTx.wait(1);
335-
return toast({
336-
title: "Congratulations!",
337-
description: `Rewards claimed successfully!`,
338-
status: "success",
339-
position: "top-right",
283+
position: "bottom-right",
340284
duration: 6000,
341285
isClosable: true,
342286
variant: "subtle",
@@ -363,6 +307,7 @@ function QuestCard({
363307
);
364308
};
365309
const isCompleted = (quest.completedBy || []).includes(self?.id);
310+
const isClaimed = account && claimedBy?.includes(account);
366311
return (
367312
<Card position="relative" h="xl" spacing="6" py="4">
368313
{!unlocked && <LockedScreen />}
@@ -382,8 +327,15 @@ function QuestCard({
382327

383328
<Spacer />
384329
<Flex align="end" direction="column" w="full">
385-
<Tag variant="subtle">
386-
{isCompleted ? "COMPLETED" : "UNCOMPLETED"}
330+
<Tag
331+
variant={isClaimed ? "outline" : "subtle"}
332+
colorScheme={isClaimed || isCompleted ? "accentDark" : "purple"}
333+
>
334+
{isCompleted
335+
? isClaimed
336+
? "CLAIMED"
337+
: "COMPLETED"
338+
: "UNCOMPLETED"}
387339
</Tag>
388340
<Tag my="2">
389341
{quest.rewardAmount} {getRewardCurrency(quest.rewardCurrency)}
@@ -431,7 +383,9 @@ function QuestCard({
431383
Claimed
432384
</Text>
433385
</HStack>
434-
<Tag variant="outline">0/{quest.rewardUserCap}</Tag>
386+
<Tag variant="outline">
387+
{claimedBy?.length || 0}/{quest.rewardUserCap}
388+
</Tag>
435389
</HStack>
436390
<Divider />
437391
<HStack justifyContent="space-between">
@@ -564,24 +518,13 @@ function QuestCard({
564518

565519
<Flex w="full" justify="space-between">
566520
<Button
521+
w="full"
567522
leftIcon={<GiSwordwoman />}
568523
fontSize="md"
569524
onClick={() => openQuest(quest.id)}
570525
>
571-
Start
526+
Start quest
572527
</Button>
573-
574-
{!quest.isPending && (
575-
<Button
576-
fontSize="md"
577-
variant="outline"
578-
leftIcon={<RiHandCoinFill />}
579-
disabled={!isCompleted}
580-
onClick={handleClaimRewards}
581-
>
582-
Claim
583-
</Button>
584-
)}
585528
</Flex>
586529
</>
587530
)}

packages/dapp/src/components/projects/quests/QuestCompletedByList.tsx

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,51 @@ import {
1212
import { useContext, useEffect, useState } from "react";
1313
import { Web3Context } from "../../../contexts/Web3Context";
1414

15-
function QuestCompletedByList({ completedBy }: { completedBy: string[] }) {
16-
const { core } = useContext(Web3Context);
15+
function QuestCompletedByList({
16+
completedBy,
17+
streamId,
18+
claimedByAddrs = [],
19+
}: {
20+
completedBy: string[];
21+
claimedByAddrs?: string[];
22+
streamId: string;
23+
}) {
24+
const { core, contracts } = useContext(Web3Context);
25+
const [claimedBy, setClaimedBy] = useState<string[]>(claimedByAddrs);
26+
1727
const [completedByWithUsername, setCompletedByWithUsername] = useState<
1828
{
1929
did: string;
2030
name: string | undefined;
31+
cryptoAccounts: string[];
2132
}[]
2233
>();
34+
35+
useEffect(() => {
36+
async function getClaimedBy() {
37+
if (contracts?.BadgeNFT) {
38+
const claimedByAddresses =
39+
await contracts.BadgeNFT.getAllAddrsByBadgeIDVersion(streamId, 0);
40+
41+
console.log({ claimedByAddresses });
42+
43+
return setClaimedBy([
44+
...new Set([...claimedByAddrs, ...claimedByAddresses]),
45+
]);
46+
}
47+
}
48+
getClaimedBy();
49+
}, [contracts, streamId, claimedByAddrs]);
50+
2351
useEffect(() => {
2452
async function getBasicProfilesByDids(dids: string[]): Promise<void> {
2553
const basicProfiles = await Promise.all(
2654
dids.map(async (did: string) => ({
2755
did,
2856
name: (await core.get("basicProfile", did))?.name,
57+
cryptoAccounts: Object.keys(
58+
await core.get("cryptoAccounts", did)
59+
).map((account) => account.split("@")[0]),
2960
}))
3061
);
3162
return setCompletedByWithUsername(basicProfiles);
@@ -45,15 +76,22 @@ function QuestCompletedByList({ completedBy }: { completedBy: string[] }) {
4576
</Thead>
4677
<Tbody>
4778
{completedByWithUsername &&
48-
completedByWithUsername.map(({ did, name }) => (
49-
<Tr key={did}>
50-
<Td>{name || "Anonymous"}</Td>
51-
<Td>{did}</Td>
52-
<Td>
53-
<Tag colorScheme="orange">Unclaimed</Tag>
54-
</Td>
55-
</Tr>
56-
))}
79+
completedByWithUsername.map(({ did, name, cryptoAccounts }) => {
80+
const isClaimed =
81+
claimedBy &&
82+
claimedBy.some((address) => cryptoAccounts.includes(address));
83+
return (
84+
<Tr key={did}>
85+
<Td>{name || "Anonymous"}</Td>
86+
<Td>{did}</Td>
87+
<Td>
88+
<Tag colorScheme={isClaimed ? "accentDark" : "orange"}>
89+
{isClaimed ? "Claimed" : "Unclaimed"}
90+
</Tag>
91+
</Td>
92+
</Tr>
93+
);
94+
})}
5795
</Tbody>
5896
<Tfoot>
5997
<Tr>

0 commit comments

Comments
 (0)