Skip to content

Commit 9d7d513

Browse files
committed
[Dashboard] PrimarySaleRecipient to v5 (#4098)
<!-- start pr-codex --> ## PR-Codex overview This PR focuses on updating the contract UI settings for primary sale recipient address handling. ### Detailed summary - Updated handling of primary sale recipient address in contract settings UI - Refactored usage of Thirdweb SDK functions - Added error handling for invalid recipient address - Improved transaction handling and form reset functionality > ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}` <!-- end pr-codex -->
1 parent 10de271 commit 9d7d513

File tree

2 files changed

+63
-59
lines changed

2 files changed

+63
-59
lines changed

apps/dashboard/src/contract-ui/tabs/settings/components/primary-sale.tsx

Lines changed: 55 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,51 @@
1-
import { thirdwebClient } from "@/constants/client";
21
import { AdminOnly } from "@3rdweb-sdk/react/components/roles/admin-only";
32
import { Flex, FormControl } from "@chakra-ui/react";
43
import { zodResolver } from "@hookform/resolvers/zod";
5-
import {
6-
usePrimarySaleRecipient,
7-
useUpdatePrimarySaleRecipient,
8-
} from "@thirdweb-dev/react";
9-
import {
10-
CommonPrimarySaleSchema,
11-
type ValidContractInstance,
12-
} from "@thirdweb-dev/sdk";
134
import type { ExtensionDetectedState } from "components/buttons/ExtensionDetectButton";
145
import { TransactionButton } from "components/buttons/TransactionButton";
6+
import { AddressOrEnsSchema } from "constants/schemas";
157
import { SolidityInput } from "contract-ui/components/solidity-inputs";
168
import { useTrack } from "hooks/analytics/useTrack";
179
import { useTxNotifications } from "hooks/useTxNotifications";
18-
import { useV5DashboardChain } from "lib/v5-adapter";
1910
import { useForm } from "react-hook-form";
20-
import { getContract } from "thirdweb";
21-
import { useActiveAccount } from "thirdweb/react";
11+
import { toast } from "sonner";
12+
import { type ThirdwebContract, ZERO_ADDRESS } from "thirdweb";
13+
import {
14+
primarySaleRecipient,
15+
setPrimarySaleRecipient,
16+
} from "thirdweb/extensions/common";
17+
import {
18+
useActiveAccount,
19+
useReadContract,
20+
useSendAndConfirmTransaction,
21+
} from "thirdweb/react";
2222
import {
2323
Card,
2424
FormErrorMessage,
2525
FormLabel,
2626
Heading,
2727
Text,
2828
} from "tw-components";
29-
import type { z } from "zod";
29+
import { z } from "zod";
3030
import { SettingDetectedState } from "./detected-state";
3131

32-
export const SettingsPrimarySale = <
33-
TContract extends ValidContractInstance | undefined,
34-
>({
32+
const CommonPrimarySaleSchema = z.object({
33+
primary_sale_recipient: AddressOrEnsSchema.default(ZERO_ADDRESS),
34+
});
35+
36+
export const SettingsPrimarySale = ({
3537
contract,
3638
detectedState,
3739
}: {
38-
contract: TContract;
40+
contract: ThirdwebContract;
3941
detectedState: ExtensionDetectedState;
4042
}) => {
4143
const address = useActiveAccount()?.address;
4244
const trackEvent = useTrack();
43-
const query = usePrimarySaleRecipient(contract);
44-
const mutation = useUpdatePrimarySaleRecipient(contract);
45+
const query = useReadContract(primarySaleRecipient, {
46+
contract,
47+
});
48+
const mutation = useSendAndConfirmTransaction();
4549

4650
const transformedQueryData = {
4751
primary_sale_recipient: query.data,
@@ -53,20 +57,10 @@ export const SettingsPrimarySale = <
5357
values: transformedQueryData,
5458
});
5559

56-
const chain = useV5DashboardChain(contract?.chainId);
57-
const contractV5 =
58-
contract && chain
59-
? getContract({
60-
address: contract.getAddress(),
61-
chain: chain,
62-
client: thirdwebClient,
63-
})
64-
: null;
65-
6660
const { onSuccess, onError } = useTxNotifications(
6761
"Primary sale address updated",
6862
"Error updating primary sale address",
69-
contractV5,
63+
contract,
7064
);
7165

7266
return (
@@ -80,15 +74,25 @@ export const SettingsPrimarySale = <
8074
action: "set-primary-sale",
8175
label: "attempt",
8276
});
77+
const saleRecipient = d.primary_sale_recipient;
78+
if (!saleRecipient) {
79+
return toast.error(
80+
"Please enter a valid primary sale recipient address",
81+
);
82+
}
83+
const transaction = setPrimarySaleRecipient({
84+
contract,
85+
saleRecipient,
86+
});
8387
// if we switch back to mutateAsync then *need* to catch errors
84-
mutation.mutate(d.primary_sale_recipient as string, {
85-
onSuccess: (_data, variables) => {
88+
mutation.mutate(transaction, {
89+
onSuccess: () => {
8690
trackEvent({
8791
category: "settings",
8892
action: "set-primary-sale",
8993
label: "success",
9094
});
91-
form.reset({ primary_sale_recipient: variables });
95+
form.reset({ primary_sale_recipient: saleRecipient });
9296
onSuccess();
9397
},
9498
onError: (error) => {
@@ -112,15 +116,15 @@ export const SettingsPrimarySale = <
112116
</Text>
113117
<Flex gap={4} direction={{ base: "column", md: "row" }}>
114118
<FormControl
115-
isDisabled={mutation.isLoading || !address}
119+
isDisabled={mutation.isPending || !address}
116120
isInvalid={
117121
!!form.getFieldState("primary_sale_recipient", form.formState)
118122
.error
119123
}
120124
>
121125
<FormLabel>Recipient Address</FormLabel>
122126
<SolidityInput
123-
isDisabled={mutation.isLoading || !address}
127+
isDisabled={mutation.isPending || !address}
124128
solidityType="address"
125129
formContext={form}
126130
variant="filled"
@@ -135,24 +139,22 @@ export const SettingsPrimarySale = <
135139
</FormControl>
136140
</Flex>
137141
</Flex>
138-
{contractV5 && (
139-
<AdminOnly contract={contractV5}>
140-
<TransactionButton
141-
colorScheme="primary"
142-
transactionCount={1}
143-
isDisabled={query.isLoading || !form.formState.isDirty}
144-
type="submit"
145-
isLoading={mutation.isLoading}
146-
loadingText="Saving..."
147-
size="md"
148-
borderRadius="xl"
149-
borderTopLeftRadius="0"
150-
borderTopRightRadius="0"
151-
>
152-
Update Primary Sale Settings
153-
</TransactionButton>
154-
</AdminOnly>
155-
)}
142+
<AdminOnly contract={contract}>
143+
<TransactionButton
144+
colorScheme="primary"
145+
transactionCount={1}
146+
isDisabled={query.isLoading || !form.formState.isDirty}
147+
type="submit"
148+
isLoading={mutation.isPending}
149+
loadingText="Saving..."
150+
size="md"
151+
borderRadius="xl"
152+
borderTopLeftRadius="0"
153+
borderTopRightRadius="0"
154+
>
155+
Update Primary Sale Settings
156+
</TransactionButton>
157+
</AdminOnly>
156158
</Flex>
157159
</Card>
158160
);

apps/dashboard/src/contract-ui/tabs/settings/page.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,14 @@ export const ContractSettingsPage: React.FC<ContractSettingsPageProps> = ({
6161
detectedState={detectedMetadata}
6262
/>
6363
</GridItem>
64-
<GridItem order={detectedPrimarySale === "enabled" ? 2 : 101}>
65-
<SettingsPrimarySale
66-
contract={contractQuery.contract}
67-
detectedState={detectedPrimarySale}
68-
/>
69-
</GridItem>
64+
{contract && (
65+
<GridItem order={detectedPrimarySale === "enabled" ? 2 : 101}>
66+
<SettingsPrimarySale
67+
contract={contract}
68+
detectedState={detectedPrimarySale}
69+
/>
70+
</GridItem>
71+
)}
7072

7173
{contract && (
7274
<GridItem order={detectedRoyalties === "enabled" ? 3 : 102}>

0 commit comments

Comments
 (0)