From ee7fff88ba896dee5f347b5cdce65ea23bc0acce Mon Sep 17 00:00:00 2001 From: Nacho Iacovino Date: Wed, 17 Aug 2022 11:48:17 +0200 Subject: [PATCH 1/8] Add react import --- src/contexts/thirdweb-auth.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/contexts/thirdweb-auth.tsx b/src/contexts/thirdweb-auth.tsx index b3944b7..eee2b09 100644 --- a/src/contexts/thirdweb-auth.tsx +++ b/src/contexts/thirdweb-auth.tsx @@ -1,4 +1,9 @@ -import { PropsWithChildren, createContext, useContext, useMemo } from "react"; +import React, { + PropsWithChildren, + createContext, + useContext, + useMemo, +} from "react"; /** * The configuration to use the react SDK with an [auth](https://portal.thirdweb.com/auth) server. From 7afe9ed9f7274c4dc0bc7139f28f791c22cdcead Mon Sep 17 00:00:00 2001 From: Nacho Iacovino Date: Wed, 17 Aug 2022 11:48:41 +0200 Subject: [PATCH 2/8] v2.6.5-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 345d2fc..0be863d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thirdweb-dev/react", - "version": "2.6.4", + "version": "2.6.5-0", "repository": { "type": "git", "url": "git+https://github.com:thirdweb-dev/react.git" From 9911071e60a37e17be7c4e66065e04e652ce0e99 Mon Sep 17 00:00:00 2001 From: Nacho Iacovino Date: Wed, 17 Aug 2022 11:52:48 +0200 Subject: [PATCH 3/8] v2.6.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0be863d..5d1ac12 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thirdweb-dev/react", - "version": "2.6.5-0", + "version": "2.6.5", "repository": { "type": "git", "url": "git+https://github.com:thirdweb-dev/react.git" From e5110132799b05aa160eacfa29b50aa2ed94db27 Mon Sep 17 00:00:00 2001 From: Nacho Iacovino Date: Thu, 18 Aug 2022 01:46:37 +0200 Subject: [PATCH 4/8] wip --- package.json | 2 +- src/hooks/async/claim-conditions.ts | 37 ++++++++++++++++++++--------- src/hooks/async/contracts.ts | 4 ++++ yarn.lock | 18 +++++++------- 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 5d1ac12..2728c35 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@microsoft/api-extractor": "^7.19.4", "@microsoft/tsdoc": "^0.14.1", "@swc/core": "^1.2.177", - "@thirdweb-dev/sdk": "^2.3.35", + "@thirdweb-dev/sdk": "^2.3.36", "@trivago/prettier-plugin-sort-imports": "^3.2.0", "@types/mime": "^2.0.3", "@types/react": "^18.0.5", diff --git a/src/hooks/async/claim-conditions.ts b/src/hooks/async/claim-conditions.ts index 204fd13..661672e 100644 --- a/src/hooks/async/claim-conditions.ts +++ b/src/hooks/async/claim-conditions.ts @@ -1,11 +1,14 @@ import { RequiredParam, WalletAddress } from "../../types"; import { cacheKeys } from "../../utils/cache-keys"; import { useQueryWithNetwork } from "../query-utils/useQueryWithNetwork"; +import { SmartContractReturnType } from "./contracts"; import { + DropErc1155ClaimConditions, EditionDrop, Erc1155, NFTDrop, SignatureDrop, + SmartContract, TokenDrop, } from "@thirdweb-dev/sdk/dist/browser"; import { BigNumberish } from "ethers"; @@ -15,6 +18,8 @@ type ActiveClaimConditionParams = TContract extends Erc1155 ? [contract: RequiredParam, tokenId: RequiredParam] : [contract: RequiredParam]; +type DropContract = NFTDrop | EditionDrop | TokenDrop | SignatureDrop; + /** **********************/ /** READ HOOKS **/ /** **********************/ @@ -42,23 +47,28 @@ type ActiveClaimConditionParams = TContract extends Erc1155 * @beta */ export function useActiveClaimCondition< - TContract extends NFTDrop | EditionDrop | TokenDrop | SignatureDrop, + TContract extends DropContract | SmartContractReturnType, >(...[contract, tokenId]: ActiveClaimConditionParams) { const contractAddress = contract?.getAddress(); + const claimConditions = + contract instanceof SmartContract + ? (contract as SmartContract).nft?.drop?.claim?.conditions + : contract?.claimConditions; + return useQueryWithNetwork( cacheKeys.extensions.claimConditions.getActive(contractAddress, tokenId), () => { invariant(contract, "No Contract instance provided"); invariant( - contract.claimConditions.getActive, + claimConditions?.getActive, "Contract instance does not support claimConditions.getActive", ); - if (contract instanceof Erc1155) { + if (claimConditions instanceof DropErc1155ClaimConditions) { invariant(tokenId, "tokenId is required for ERC1155 claim conditions"); - return contract.claimConditions.getActive(tokenId); + return claimConditions?.getActive(tokenId); } - return contract.claimConditions.getActive(); + return claimConditions?.getActive(); }, { // Checks that happen here: @@ -92,27 +102,32 @@ export function useActiveClaimCondition< * @beta */ export function useClaimConditions< - TContract extends NFTDrop | EditionDrop | TokenDrop | SignatureDrop, + TContract extends DropContract | SmartContractReturnType, >(...[contract, tokenId]: ActiveClaimConditionParams) { const contractAddress = contract?.getAddress(); + const claimConditions = + contract instanceof SmartContract + ? (contract as SmartContract).nft?.drop?.claim?.conditions + : contract?.claimConditions; + return useQueryWithNetwork( cacheKeys.extensions.claimConditions.getAll(contractAddress, tokenId), () => { invariant(contract, "No Contract instance provided"); invariant( - contract.claimConditions.getAll, + claimConditions?.getAll, "Contract instance does not support claimConditions.getAll", ); - if (contract instanceof Erc1155) { + if (claimConditions instanceof DropErc1155ClaimConditions) { invariant(tokenId, "tokenId is required for ERC1155 claim conditions"); - return contract.claimConditions.getAll(tokenId); + return claimConditions?.getAll(tokenId); } - return contract.claimConditions.getAll(); + return claimConditions?.getAll(); }, { // Checks that happen here: - // 1. if the contract is based on ERC1155 contract => tokenId cannot be `undefined` + // 1. if the contract is based on ERC1155 contract => tokenId cannot be `undefined` // 2. if the contract is NOT based on ERC1155 => contract has to still be provided enabled: contract instanceof Erc1155 ? tokenId !== undefined : !!contract, }, diff --git a/src/hooks/async/contracts.ts b/src/hooks/async/contracts.ts index c89f6c8..697237a 100644 --- a/src/hooks/async/contracts.ts +++ b/src/hooks/async/contracts.ts @@ -27,6 +27,10 @@ import { CallOverrides } from "ethers"; import { useEffect, useMemo } from "react"; import invariant from "tiny-invariant"; +export type SmartContractReturnType = ReturnType< + typeof useContract +>["contract"]; + async function fetchContractType( contractAddress: RequiredParam, sdk: RequiredParam, diff --git a/yarn.lock b/yarn.lock index f54e472..5552fec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1084,17 +1084,17 @@ "@types/use-sync-external-store" "^0.0.3" use-sync-external-store "^1.2.0" -"@thirdweb-dev/contracts@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@thirdweb-dev/contracts/-/contracts-3.0.3.tgz#ba83b7e28ab01a88358de479cf98cddbf835ff56" - integrity sha512-TQRrML5SwbTb0VA1nu7VLxqIXrqMfvaXOBFT//yA9Jdd7GNsG4zSQHlHpkU4KWG1r766poG/AuXwz8KQ1A9IBg== +"@thirdweb-dev/contracts@3.1.0-1": + version "3.1.0-1" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/contracts/-/contracts-3.1.0-1.tgz#8c4d068f0548f780a90cc723636bcc358cb946eb" + integrity sha512-v19UtKKIpd6ol7fXcAL24F7Jwew1jIAmxstogTw9MdX2k9McwaI0Ebxu/3SSkQq2AhmruwOPp+E2xq1SWKsBUw== -"@thirdweb-dev/sdk@^2.3.35": - version "2.3.35" - resolved "https://registry.yarnpkg.com/@thirdweb-dev/sdk/-/sdk-2.3.35.tgz#3a212aed78eec6e1ec2a00cdcb587ad075d8f165" - integrity sha512-jeoNjWe2AyPCmkMl6d7FJhk4Dpbb+T5OtItl8WCPkrqJh3/+Z3CfycLe0Pxm7urlfolgUL/O0LzPpQ2aVKiYFA== +"@thirdweb-dev/sdk@^2.3.36": + version "2.3.36" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/sdk/-/sdk-2.3.36.tgz#ae7c71e8cf9ff740ae32322d3ef4cb74df4dd535" + integrity sha512-eg2TTu8paJvcD1BMDm7L7Z40T6rShuGEhdsmR1LnGKdKsyWpvhtPCPB5NVfMWpYVMcQs38qm4geh4j0FMlXVgg== dependencies: - "@thirdweb-dev/contracts" "^3.0.0" + "@thirdweb-dev/contracts" "3.1.0-1" "@web-std/file" "^3.0.0" cbor "^8.1.0" cross-fetch "^3.1.5" From 28064a3cc101268240c8be82db3b34910d867b23 Mon Sep 17 00:00:00 2001 From: Nacho Iacovino Date: Thu, 18 Aug 2022 02:02:24 +0200 Subject: [PATCH 5/8] Accept NFTContract on claim conditions hooks --- package.json | 2 +- src/hooks/async/claim-conditions.ts | 69 ++++++++++------------------- src/hooks/async/contracts.ts | 4 -- yarn.lock | 4 +- 4 files changed, 26 insertions(+), 53 deletions(-) diff --git a/package.json b/package.json index 2728c35..5d7616c 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@microsoft/api-extractor": "^7.19.4", "@microsoft/tsdoc": "^0.14.1", "@swc/core": "^1.2.177", - "@thirdweb-dev/sdk": "^2.3.36", + "@thirdweb-dev/sdk": "file:.yalc/@thirdweb-dev/sdk", "@trivago/prettier-plugin-sort-imports": "^3.2.0", "@types/mime": "^2.0.3", "@types/react": "^18.0.5", diff --git a/src/hooks/async/claim-conditions.ts b/src/hooks/async/claim-conditions.ts index 661672e..8adff03 100644 --- a/src/hooks/async/claim-conditions.ts +++ b/src/hooks/async/claim-conditions.ts @@ -1,16 +1,7 @@ -import { RequiredParam, WalletAddress } from "../../types"; +import { NFTContract, RequiredParam, WalletAddress } from "../../types"; import { cacheKeys } from "../../utils/cache-keys"; import { useQueryWithNetwork } from "../query-utils/useQueryWithNetwork"; -import { SmartContractReturnType } from "./contracts"; -import { - DropErc1155ClaimConditions, - EditionDrop, - Erc1155, - NFTDrop, - SignatureDrop, - SmartContract, - TokenDrop, -} from "@thirdweb-dev/sdk/dist/browser"; +import { Erc1155 } from "@thirdweb-dev/sdk/dist/browser"; import { BigNumberish } from "ethers"; import invariant from "tiny-invariant"; @@ -18,8 +9,6 @@ type ActiveClaimConditionParams = TContract extends Erc1155 ? [contract: RequiredParam, tokenId: RequiredParam] : [contract: RequiredParam]; -type DropContract = NFTDrop | EditionDrop | TokenDrop | SignatureDrop; - /** **********************/ /** READ HOOKS **/ /** **********************/ @@ -46,29 +35,24 @@ type DropContract = NFTDrop | EditionDrop | TokenDrop | SignatureDrop; * * @beta */ -export function useActiveClaimCondition< - TContract extends DropContract | SmartContractReturnType, ->(...[contract, tokenId]: ActiveClaimConditionParams) { +export function useActiveClaimCondition( + ...[contract, tokenId]: ActiveClaimConditionParams +) { const contractAddress = contract?.getAddress(); - const claimConditions = - contract instanceof SmartContract - ? (contract as SmartContract).nft?.drop?.claim?.conditions - : contract?.claimConditions; - return useQueryWithNetwork( cacheKeys.extensions.claimConditions.getActive(contractAddress, tokenId), () => { invariant(contract, "No Contract instance provided"); invariant( - claimConditions?.getActive, - "Contract instance does not support claimConditions.getActive", + contract?.drop?.claim?.conditions?.getActive, + "Contract instance does not support contract?.drop?.claim?.conditions.getActive", ); - if (claimConditions instanceof DropErc1155ClaimConditions) { + if (contract instanceof Erc1155) { invariant(tokenId, "tokenId is required for ERC1155 claim conditions"); - return claimConditions?.getActive(tokenId); + return contract?.drop?.claim?.conditions?.getActive(tokenId); } - return claimConditions?.getActive(); + return contract?.drop?.claim?.conditions?.getActive(); }, { // Checks that happen here: @@ -101,29 +85,24 @@ export function useActiveClaimCondition< * * @beta */ -export function useClaimConditions< - TContract extends DropContract | SmartContractReturnType, ->(...[contract, tokenId]: ActiveClaimConditionParams) { +export function useClaimConditions( + ...[contract, tokenId]: ActiveClaimConditionParams +) { const contractAddress = contract?.getAddress(); - const claimConditions = - contract instanceof SmartContract - ? (contract as SmartContract).nft?.drop?.claim?.conditions - : contract?.claimConditions; - return useQueryWithNetwork( cacheKeys.extensions.claimConditions.getAll(contractAddress, tokenId), () => { invariant(contract, "No Contract instance provided"); invariant( - claimConditions?.getAll, - "Contract instance does not support claimConditions.getAll", + contract?.drop?.claim?.conditions?.getAll, + "Contract instance does not support drop.claim.conditions.getAll", ); - if (claimConditions instanceof DropErc1155ClaimConditions) { + if (contract instanceof Erc1155) { invariant(tokenId, "tokenId is required for ERC1155 claim conditions"); - return claimConditions?.getAll(tokenId); + return contract?.drop?.claim?.conditions?.getAll(tokenId); } - return claimConditions?.getAll(); + return contract?.drop?.claim?.conditions?.getAll(); }, { // Checks that happen here: @@ -179,9 +158,9 @@ type ClaimIneligibilityInputParams = TContract extends Erc1155 * * @beta */ -export function useClaimIneligibilityReasons< - TContract extends NFTDrop | EditionDrop | TokenDrop | SignatureDrop, ->(...[contract, params, tokenId]: ClaimIneligibilityInputParams) { +export function useClaimIneligibilityReasons( + ...[contract, params, tokenId]: ClaimIneligibilityInputParams +) { const contractAddress = contract?.getAddress(); return useQueryWithNetwork( @@ -193,7 +172,7 @@ export function useClaimIneligibilityReasons< () => { invariant(contract, "No Contract instance provided"); invariant( - contract.claimConditions.getClaimIneligibilityReasons, + contract?.drop?.claim?.conditions.getClaimIneligibilityReasons, "Contract instance does not support claimConditions.getClaimIneligibilityReasons", ); if (contract instanceof Erc1155) { @@ -201,13 +180,13 @@ export function useClaimIneligibilityReasons< tokenId, "tokenId is required for ERC1155 claim ineligibility reasons", ); - return contract.claimConditions.getClaimIneligibilityReasons( + return contract?.drop?.claim?.conditions.getClaimIneligibilityReasons( tokenId, params.quantity, params.walletAddress, ); } - return contract.claimConditions.getClaimIneligibilityReasons( + return contract?.drop?.claim?.conditions.getClaimIneligibilityReasons( params.quantity, params.walletAddress, ); diff --git a/src/hooks/async/contracts.ts b/src/hooks/async/contracts.ts index 697237a..c89f6c8 100644 --- a/src/hooks/async/contracts.ts +++ b/src/hooks/async/contracts.ts @@ -27,10 +27,6 @@ import { CallOverrides } from "ethers"; import { useEffect, useMemo } from "react"; import invariant from "tiny-invariant"; -export type SmartContractReturnType = ReturnType< - typeof useContract ->["contract"]; - async function fetchContractType( contractAddress: RequiredParam, sdk: RequiredParam, diff --git a/yarn.lock b/yarn.lock index 5552fec..13562fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1089,10 +1089,8 @@ resolved "https://registry.yarnpkg.com/@thirdweb-dev/contracts/-/contracts-3.1.0-1.tgz#8c4d068f0548f780a90cc723636bcc358cb946eb" integrity sha512-v19UtKKIpd6ol7fXcAL24F7Jwew1jIAmxstogTw9MdX2k9McwaI0Ebxu/3SSkQq2AhmruwOPp+E2xq1SWKsBUw== -"@thirdweb-dev/sdk@^2.3.36": +"@thirdweb-dev/sdk@file:.yalc/@thirdweb-dev/sdk": version "2.3.36" - resolved "https://registry.yarnpkg.com/@thirdweb-dev/sdk/-/sdk-2.3.36.tgz#ae7c71e8cf9ff740ae32322d3ef4cb74df4dd535" - integrity sha512-eg2TTu8paJvcD1BMDm7L7Z40T6rShuGEhdsmR1LnGKdKsyWpvhtPCPB5NVfMWpYVMcQs38qm4geh4j0FMlXVgg== dependencies: "@thirdweb-dev/contracts" "3.1.0-1" "@web-std/file" "^3.0.0" From 4c303414644a0621109429b707cfdca4c7b9be18 Mon Sep 17 00:00:00 2001 From: Nacho Iacovino Date: Thu, 18 Aug 2022 03:03:42 +0200 Subject: [PATCH 6/8] Add useSetClaimConditions hook --- src/hooks/async/claim-conditions.ts | 102 +++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 3 deletions(-) diff --git a/src/hooks/async/claim-conditions.ts b/src/hooks/async/claim-conditions.ts index 8adff03..c43b765 100644 --- a/src/hooks/async/claim-conditions.ts +++ b/src/hooks/async/claim-conditions.ts @@ -1,7 +1,8 @@ import { NFTContract, RequiredParam, WalletAddress } from "../../types"; import { cacheKeys } from "../../utils/cache-keys"; import { useQueryWithNetwork } from "../query-utils/useQueryWithNetwork"; -import { Erc1155 } from "@thirdweb-dev/sdk/dist/browser"; +import { useMutation } from "@tanstack/react-query"; +import { ClaimConditionInput, Erc1155 } from "@thirdweb-dev/sdk/dist/browser"; import { BigNumberish } from "ethers"; import invariant from "tiny-invariant"; @@ -56,7 +57,7 @@ export function useActiveClaimCondition( }, { // Checks that happen here: - // 1. if the contract is based on ERC1155 contract => tokenId cannot be `undefined` + // 1. if the contract is based on ERC1155 contract => tokenId cannot be `undefined` // 2. if the contract is NOT based on ERC1155 => contract has to still be provided enabled: contract instanceof Erc1155 ? tokenId !== undefined : !!contract, }, @@ -136,6 +137,20 @@ type ClaimIneligibilityInputParams = TContract extends Erc1155 eligibilityParams: ClaimIneligibilityParameters, ]; +type SetClaimConditionsInputParams = TContract extends Erc1155 + ? [contract: RequiredParam, tokenId: RequiredParam] + : [contract: RequiredParam]; + +/** + * The params for the {@link useSetClaimConditions} hook mutation. + * + * @beta + */ +export type SetClaimConditionsParams = { + phases: ClaimConditionInput[]; + reset?: boolean; +}; + /** * Use this to check for reasons that prevent claiming for either ERC20, ERC721 or ERC1155 based contracts. They need to extend the `claimCondition` extension for this hook to work. * @example @@ -193,7 +208,7 @@ export function useClaimIneligibilityReasons( }, { // Checks that happen here: - // 1. if the contract is based on ERC1155 contract => tokenId cannot be `undefined` + // 1. if the contract is based on ERC1155 contract => tokenId cannot be `undefined` // 2. if the contract is NOT based on ERC1155 => contract has to still be provided // 3. has a params object been passed? // 4. does params have an address in it? @@ -204,3 +219,84 @@ export function useClaimIneligibilityReasons( }, ); } + +/** **********************/ +/** WRITE HOOKS **/ +/** **********************/ + +/** + * Use this to mint a new NFT on your {@link NFTContract} + * + * @example + * ```jsx + * const Component = () => { + * const nftDrop = useNFTDrop(); + * const { + * mutate: mintNft, + * isLoading, + * error, + * } = useMintNFT(nftDrop); + * + * if (error) { + * console.error("failed to mint nft", error); + * } + * + * return ( + * + * ); + * }; + * ``` + * @example + * ```jsx + * const Component = () => { + * const { contract } = useContract(); + * const { + * mutate: mintNft, + * isLoading, + * error, + * } = useMintNFT(contract?.nft); + * + * if (error) { + * console.error("failed to mint nft", error); + * } + * + * return ( + * + * ); + * }; + * ``` + * + * @param contract - an instance of a {@link NFTContract} + * @returns a mutation object that can be used to set claim conditions + * @beta + */ +export function useSetClaimConditions( + ...[contract, tokenId]: SetClaimConditionsInputParams +) { + return useMutation( + async (data: SetClaimConditionsParams) => { + const { phases, reset = false } = data; + invariant(phases, 'No "phases" provided'); + if (contract instanceof Erc1155) { + invariant(tokenId, "tokenId is required for ERC1155 claim conditions"); + return contract?.drop?.claim?.conditions.set(tokenId, phases, reset); + } + return contract?.drop?.claim?.conditions.set(phases, reset); + }, + { + onSettled: () => { + // TODO: fix cache + }, + }, + ); +} From bb113059cc2d565b3a0427d4a17da5d35b9e0a8d Mon Sep 17 00:00:00 2001 From: Nacho Iacovino Date: Thu, 18 Aug 2022 21:55:44 +0200 Subject: [PATCH 7/8] Fix ts and docs --- docs/react.md | 3 + docs/react.setclaimconditionsparams.md | 19 ++ docs/react.useactiveclaimcondition.md | 4 +- docs/react.useclaimconditions.md | 4 +- docs/react.useclaimineligibilityreasons.md | 2 +- docs/react.useresetclaimconditions.md | 86 ++++++++ docs/react.usesetclaimconditions.md | 86 ++++++++ etc/react.api.md | 27 ++- package.json | 2 +- src/hooks/async/claim-conditions.ts | 231 ++++++++++++++++----- yarn.lock | 6 +- 11 files changed, 402 insertions(+), 68 deletions(-) create mode 100644 docs/react.setclaimconditionsparams.md create mode 100644 docs/react.useresetclaimconditions.md create mode 100644 docs/react.usesetclaimconditions.md diff --git a/docs/react.md b/docs/react.md index 15b729e..d6d2b9b 100644 --- a/docs/react.md +++ b/docs/react.md @@ -100,12 +100,14 @@ import { useNetworkMistmatch } from "@thirdweb-dev/react" | [usePack(contractAddress)](./react.usepack.md) | Hook for getting an instance of a Pack contract. This contract supports the creation of on-chain luck-based lootboxes. | | [usePlatformFees(contract)](./react.useplatformfees.md) | (BETA) Use this to get the platform fees settings of your | | [usePrimarySaleRecipient(contract)](./react.useprimarysalerecipient.md) | (BETA) | +| [useResetClaimConditions(\[contract, tokenId\])](./react.useresetclaimconditions.md) | (BETA) Use this to reset claim conditions on your [NFTContract](./react.nftcontract.md) | | [useResolvedMediaType(uri)](./react.useresolvedmediatype.md) | | | [useRevokeRole(contract)](./react.userevokerole.md) | (BETA) Use this to revoke a [WalletAddress](./react.walletaddress.md) a specific role on a | | [useRoleMembers(contract, role)](./react.userolemembers.md) | (BETA) Use this to get the members of a role on a | | [useRoyaltySettings(contract)](./react.useroyaltysettings.md) | (BETA) Use this to get the royalty settings of your | | [useSDK()](./react.usesdk.md) | | | [useSetAllRoleMembers(contract)](./react.usesetallrolemembers.md) | (BETA) Use this to OVERWRITE the list of addresses that are members of specific roles | +| [useSetClaimConditions(\[contract, tokenId\])](./react.usesetclaimconditions.md) | (BETA) Use this to set claim conditions on your [NFTContract](./react.nftcontract.md) | | [useSignatureDrop(contractAddress)](./react.usesignaturedrop.md) | Hook for getting an instance of an SignatureDrop contract. This contract is meant to interface with ERC721 compliant NFTs that can be lazily minted. | | [useSplit(contractAddress)](./react.usesplit.md) | Hook for getting an instance of a Split contract. This contract supports fund distribution to multiple parties. | | [useToken(contractAddress)](./react.usetoken.md) | Hook for getting an instance of an Token contract. This contract supports ERC20 compliant tokens. | @@ -175,6 +177,7 @@ import { useWalletConnect } from "@thirdweb-dev/react" | [NFT](./react.nft.md) | (BETA) A single NFT token | | [NFTContract](./react.nftcontract.md) | (BETA) The possible NFT contract types. | | [RequiredParam](./react.requiredparam.md) | (BETA) Makes a parameter required to be passed, but still allowes it to be undefined. | +| [SetClaimConditionsParams](./react.setclaimconditionsparams.md) | (BETA) The params for the [useSetClaimConditions()](./react.usesetclaimconditions.md) hook mutation. | | [TokenBurnParams](./react.tokenburnparams.md) | (BETA) The parameters to pass to the burn function. | | [TokenParams](./react.tokenparams.md) | (BETA) The parameters to pass to the mint and transfer functions. | | [TransferNFTParams](./react.transfernftparams.md) | (BETA) The params to pass to useTransferNFT. | diff --git a/docs/react.setclaimconditionsparams.md b/docs/react.setclaimconditionsparams.md new file mode 100644 index 0000000..b54e4d6 --- /dev/null +++ b/docs/react.setclaimconditionsparams.md @@ -0,0 +1,19 @@ + + +[Home](./index.md) > [@thirdweb-dev/react](./react.md) > [SetClaimConditionsParams](./react.setclaimconditionsparams.md) + +## SetClaimConditionsParams type + +> This API is provided as a preview for developers and may change based on feedback that we receive. Do not use this API in a production environment. +> + +The params for the [useSetClaimConditions()](./react.usesetclaimconditions.md) hook mutation. + +Signature: + +```typescript +export declare type SetClaimConditionsParams = { + phases: ClaimConditionInput[]; + reset?: boolean; +}; +``` diff --git a/docs/react.useactiveclaimcondition.md b/docs/react.useactiveclaimcondition.md index 030e8e4..5d06055 100644 --- a/docs/react.useactiveclaimcondition.md +++ b/docs/react.useactiveclaimcondition.md @@ -12,7 +12,7 @@ Use this to get the active claim conditon for ERC20, ERC721 or ERC1155 based con Signature: ```typescript -export declare function useActiveClaimCondition(...[contract, tokenId]: ActiveClaimConditionParams): import("@tanstack/react-query").UseQueryResult<{ +export declare function useActiveClaimCondition(...[contract, tokenId]: ClaimConditionsInputParams): import("@tanstack/react-query").UseQueryResult<{ snapshot?: { address: string; maxClaimable: string; @@ -40,7 +40,7 @@ export declare function useActiveClaimConditionReturns: diff --git a/docs/react.useclaimconditions.md b/docs/react.useclaimconditions.md index ecc63cb..fabf6a8 100644 --- a/docs/react.useclaimconditions.md +++ b/docs/react.useclaimconditions.md @@ -12,7 +12,7 @@ Use this to get all claim conditons for ERC20, ERC721 or ERC1155 based contracts Signature: ```typescript -export declare function useClaimConditions(...[contract, tokenId]: ActiveClaimConditionParams): import("@tanstack/react-query").UseQueryResult<{ +export declare function useClaimConditions(...[contract, tokenId]: ClaimConditionsInputParams): import("@tanstack/react-query").UseQueryResult<{ snapshot?: { address: string; maxClaimable: string; @@ -40,7 +40,7 @@ export declare function useClaimConditionsReturns: diff --git a/docs/react.useclaimineligibilityreasons.md b/docs/react.useclaimineligibilityreasons.md index d6d8ce2..96d7ec3 100644 --- a/docs/react.useclaimineligibilityreasons.md +++ b/docs/react.useclaimineligibilityreasons.md @@ -12,7 +12,7 @@ Use this to check for reasons that prevent claiming for either ERC20, ERC721 or Signature: ```typescript -export declare function useClaimIneligibilityReasons(...[contract, params, tokenId]: ClaimIneligibilityInputParams): import("@tanstack/react-query").UseQueryResult; +export declare function useClaimIneligibilityReasons(...[contract, params, tokenId]: ClaimIneligibilityInputParams): import("@tanstack/react-query").UseQueryResult; ``` ## Parameters diff --git a/docs/react.useresetclaimconditions.md b/docs/react.useresetclaimconditions.md new file mode 100644 index 0000000..b744b8d --- /dev/null +++ b/docs/react.useresetclaimconditions.md @@ -0,0 +1,86 @@ + + +[Home](./index.md) > [@thirdweb-dev/react](./react.md) > [useResetClaimConditions](./react.useresetclaimconditions.md) + +## useResetClaimConditions() function + +> This API is provided as a preview for developers and may change based on feedback that we receive. Do not use this API in a production environment. +> + +Use this to reset claim conditions on your [NFTContract](./react.nftcontract.md) + +Signature: + +```typescript +export declare function useResetClaimConditions(...[contract, tokenId]: ClaimConditionsInputParams): import("@tanstack/react-query").UseMutationResult Promise; +}, "data"> | undefined, unknown, void, unknown>; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| \[contract, tokenId\] | ClaimConditionsInputParams<TContract> | | + +Returns: + +import("@tanstack/react-query").UseMutationResult<Omit<{ receipt: import("@ethersproject/abstract-provider").TransactionReceipt; data: () => Promise<unknown>; }, "data"> \| undefined, unknown, void, unknown> + +a mutation object that can be used to reset claim conditions + +## Example 1 + + +```jsx +const Component = () => { + const nftDrop = useNFTDrop(); + const { + mutate: resetClaimConditions, + isLoading, + error, + } = useResetClaimConditions(nftDrop); + + if (error) { + console.error("failed to reset claim conditions", error); + } + + return ( + + ); +}; +``` + +## Example 2 + + +```jsx +const Component = () => { + const { contract } = useContract(); + const { + mutate: resetClaimConditions, + isLoading, + error, + } = useResetClaimConditions(contract?.nft); + + if (error) { + console.error("failed to reset claim conditions", error); + } + + return ( + + ); +}; +``` + diff --git a/docs/react.usesetclaimconditions.md b/docs/react.usesetclaimconditions.md new file mode 100644 index 0000000..dd62ba2 --- /dev/null +++ b/docs/react.usesetclaimconditions.md @@ -0,0 +1,86 @@ + + +[Home](./index.md) > [@thirdweb-dev/react](./react.md) > [useSetClaimConditions](./react.usesetclaimconditions.md) + +## useSetClaimConditions() function + +> This API is provided as a preview for developers and may change based on feedback that we receive. Do not use this API in a production environment. +> + +Use this to set claim conditions on your [NFTContract](./react.nftcontract.md) + +Signature: + +```typescript +export declare function useSetClaimConditions(...[contract, tokenId]: ClaimConditionsInputParams): import("@tanstack/react-query").UseMutationResult Promise; +}, "data"> | undefined, unknown, SetClaimConditionsParams, unknown>; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| \[contract, tokenId\] | ClaimConditionsInputParams<TContract> | | + +Returns: + +import("@tanstack/react-query").UseMutationResult<Omit<{ receipt: import("@ethersproject/abstract-provider").TransactionReceipt; data: () => Promise<unknown>; }, "data"> \| undefined, unknown, [SetClaimConditionsParams](./react.setclaimconditionsparams.md), unknown> + +a mutation object that can be used to set claim conditions + +## Example 1 + + +```jsx +const Component = () => { + const nftDrop = useNFTDrop(); + const { + mutate: setClaimConditions, + isLoading, + error, + } = useSetClaimConditions(nftDrop); + + if (error) { + console.error("failed to set claim conditions", error); + } + + return ( + + ); +}; +``` + +## Example 2 + + +```jsx +const Component = () => { + const { contract } = useContract(); + const { + mutate: setClaimConditions, + isLoading, + error, + } = useSetClaimConditions(contract?.nft); + + if (error) { + console.error("failed to set claim conditions", error); + } + + return ( + + ); +}; +``` + diff --git a/etc/react.api.md b/etc/react.api.md index 2b3f283..ac34084 100644 --- a/etc/react.api.md +++ b/etc/react.api.md @@ -15,6 +15,7 @@ import { CallOverrides } from 'ethers'; import { Chain } from './types'; import { ChainId } from '@thirdweb-dev/sdk/dist/browser'; import { ChainOrRpc } from '@thirdweb-dev/sdk/dist/browser'; +import { ClaimConditionInput } from '@thirdweb-dev/sdk/dist/browser'; import { ClaimEligibility } from '@thirdweb-dev/sdk/dist/browser'; import { CoinbaseWalletConnector } from 'wagmi/connectors/coinbaseWallet'; import { Connector } from './connectors'; @@ -267,6 +268,12 @@ export type RequiredParam = T | undefined; // @internal (undocumented) export type RolesForContract = TContract extends SmartContract ? Role | (string & {}) : NonNullable["roles"][number]; +// @beta +export type SetClaimConditionsParams = { + phases: ClaimConditionInput[]; + reset?: boolean; +}; + // @public (undocumented) export interface SharedMediaProps { // (undocumented) @@ -364,10 +371,10 @@ export { useAccount } // @internal (undocumented) export function useActiveChainId(): SUPPORTED_CHAIN_ID | undefined; -// Warning: (ae-forgotten-export) The symbol "ActiveClaimConditionParams" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "ClaimConditionsInputParams" needs to be exported by the entry point index.d.ts // // @beta -export function useActiveClaimCondition(...[contract, tokenId]: ActiveClaimConditionParams): UseQueryResult< { +export function useActiveClaimCondition(...[contract, tokenId]: ClaimConditionsInputParams): UseQueryResult< { snapshot?: { address: string; maxClaimable: string; @@ -464,7 +471,7 @@ type: ListingType.Auction; export function useChainId(): number | undefined; // @beta -export function useClaimConditions(...[contract, tokenId]: ActiveClaimConditionParams): UseQueryResult< { +export function useClaimConditions(...[contract, tokenId]: ClaimConditionsInputParams): UseQueryResult< { snapshot?: { address: string; maxClaimable: string; @@ -499,7 +506,7 @@ export function useClaimedNFTSupply(contract: RequiredParam): UseQ // Warning: (ae-forgotten-export) The symbol "ClaimIneligibilityInputParams" needs to be exported by the entry point index.d.ts // // @beta -export function useClaimIneligibilityReasons(...[contract, params, tokenId]: ClaimIneligibilityInputParams): UseQueryResult; +export function useClaimIneligibilityReasons(...[contract, params, tokenId]: ClaimIneligibilityInputParams): UseQueryResult; // @beta export function useClaimNFT(contract: RequiredParam): UseMutationResult, unknown, ClaimNFTParams, unknown>; @@ -1588,6 +1595,12 @@ export { useProvider } // @internal (undocumented) export function useReadonlySDK(readonlyRpcUrl: string, sdkOptions: SDKOptions, storageInterface?: IStorage): ThirdwebSDK; +// @beta +export function useResetClaimConditions(...[contract, tokenId]: ClaimConditionsInputParams): UseMutationResult Promise; +}, "data"> | undefined, unknown, void, unknown>; + // @public (undocumented) export function useResolvedMediaType(uri?: string): { url: string | undefined; @@ -1623,6 +1636,12 @@ export function useSDK(): ThirdwebSDK | undefined; // @beta export function useSetAllRoleMembers(contract: RequiredParam): UseMutationResult]: string[]; }, unknown>; +// @beta +export function useSetClaimConditions(...[contract, tokenId]: ClaimConditionsInputParams): UseMutationResult Promise; +}, "data"> | undefined, unknown, SetClaimConditionsParams, unknown>; + // @public export function useSignatureDrop(contractAddress?: string): SignatureDrop | undefined; diff --git a/package.json b/package.json index 5d7616c..a11f35a 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@microsoft/api-extractor": "^7.19.4", "@microsoft/tsdoc": "^0.14.1", "@swc/core": "^1.2.177", - "@thirdweb-dev/sdk": "file:.yalc/@thirdweb-dev/sdk", + "@thirdweb-dev/sdk": "^2.3.37", "@trivago/prettier-plugin-sort-imports": "^3.2.0", "@types/mime": "^2.0.3", "@types/react": "^18.0.5", diff --git a/src/hooks/async/claim-conditions.ts b/src/hooks/async/claim-conditions.ts index c43b765..3bb82fb 100644 --- a/src/hooks/async/claim-conditions.ts +++ b/src/hooks/async/claim-conditions.ts @@ -1,15 +1,56 @@ +import { useActiveChainId } from "../../Provider"; import { NFTContract, RequiredParam, WalletAddress } from "../../types"; -import { cacheKeys } from "../../utils/cache-keys"; +import { + cacheKeys, + invalidateContractAndBalances, +} from "../../utils/cache-keys"; import { useQueryWithNetwork } from "../query-utils/useQueryWithNetwork"; -import { useMutation } from "@tanstack/react-query"; -import { ClaimConditionInput, Erc1155 } from "@thirdweb-dev/sdk/dist/browser"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { + ClaimCondition, + ClaimConditionInput, + Erc1155, +} from "@thirdweb-dev/sdk/dist/browser"; import { BigNumberish } from "ethers"; import invariant from "tiny-invariant"; -type ActiveClaimConditionParams = TContract extends Erc1155 +type ClaimConditionsInputParams = TContract extends Erc1155 ? [contract: RequiredParam, tokenId: RequiredParam] : [contract: RequiredParam]; +type ClaimIneligibilityInputParams = TContract extends Erc1155 + ? [ + contract: RequiredParam, + eligibilityParams: ClaimIneligibilityParameters, + tokenId: RequiredParam, + ] + : [ + contract: RequiredParam, + eligibilityParams: ClaimIneligibilityParameters, + ]; + +/** + * The options to be passed as the second parameter to the `useClaimIneligibilityReasons` hook. + * + * @beta + */ +export type ClaimIneligibilityParameters = { + // the wallet address to check claim eligibility for + walletAddress: WalletAddress; + // the amount of tokens to check claim eligibility for + quantity: string | number; +}; + +/** + * The params for the {@link useSetClaimConditions} hook mutation. + * + * @beta + */ +export type SetClaimConditionsParams = { + phases: ClaimConditionInput[]; + reset?: boolean; +}; + /** **********************/ /** READ HOOKS **/ /** **********************/ @@ -37,7 +78,7 @@ type ActiveClaimConditionParams = TContract extends Erc1155 * @beta */ export function useActiveClaimCondition( - ...[contract, tokenId]: ActiveClaimConditionParams + ...[contract, tokenId]: ClaimConditionsInputParams ) { const contractAddress = contract?.getAddress(); @@ -87,7 +128,7 @@ export function useActiveClaimCondition( * @beta */ export function useClaimConditions( - ...[contract, tokenId]: ActiveClaimConditionParams + ...[contract, tokenId]: ClaimConditionsInputParams ) { const contractAddress = contract?.getAddress(); @@ -114,43 +155,6 @@ export function useClaimConditions( ); } -/** - * The options to be passed as the second parameter to the `useClaimIneligibilityReasons` hook. - * - * @beta - */ -export type ClaimIneligibilityParameters = { - // the wallet address to check claim eligibility for - walletAddress: WalletAddress; - // the amount of tokens to check claim eligibility for - quantity: string | number; -}; - -type ClaimIneligibilityInputParams = TContract extends Erc1155 - ? [ - contract: RequiredParam, - eligibilityParams: ClaimIneligibilityParameters, - tokenId: RequiredParam, - ] - : [ - contract: RequiredParam, - eligibilityParams: ClaimIneligibilityParameters, - ]; - -type SetClaimConditionsInputParams = TContract extends Erc1155 - ? [contract: RequiredParam, tokenId: RequiredParam] - : [contract: RequiredParam]; - -/** - * The params for the {@link useSetClaimConditions} hook mutation. - * - * @beta - */ -export type SetClaimConditionsParams = { - phases: ClaimConditionInput[]; - reset?: boolean; -}; - /** * Use this to check for reasons that prevent claiming for either ERC20, ERC721 or ERC1155 based contracts. They need to extend the `claimCondition` extension for this hook to work. * @example @@ -225,28 +229,28 @@ export function useClaimIneligibilityReasons( /** **********************/ /** - * Use this to mint a new NFT on your {@link NFTContract} + * Use this to set claim conditions on your {@link NFTContract} * * @example * ```jsx * const Component = () => { * const nftDrop = useNFTDrop(); * const { - * mutate: mintNft, + * mutate: setClaimConditions, * isLoading, * error, - * } = useMintNFT(nftDrop); + * } = useSetClaimConditions(nftDrop); * * if (error) { - * console.error("failed to mint nft", error); + * console.error("failed to set claim conditions", error); * } * * return ( * * ); * }; @@ -256,21 +260,21 @@ export function useClaimIneligibilityReasons( * const Component = () => { * const { contract } = useContract(); * const { - * mutate: mintNft, + * mutate: setClaimConditions, * isLoading, * error, - * } = useMintNFT(contract?.nft); + * } = useSetClaimConditions(contract?.nft); * * if (error) { - * console.error("failed to mint nft", error); + * console.error("failed to set claim conditions", error); * } * * return ( * * ); * }; @@ -281,10 +285,15 @@ export function useClaimIneligibilityReasons( * @beta */ export function useSetClaimConditions( - ...[contract, tokenId]: SetClaimConditionsInputParams + ...[contract, tokenId]: ClaimConditionsInputParams ) { + const activeChainId = useActiveChainId(); + const contractAddress = contract?.getAddress(); + const queryClient = useQueryClient(); + return useMutation( async (data: SetClaimConditionsParams) => { + invariant(contract, "No Contract instance provided"); const { phases, reset = false } = data; invariant(phases, 'No "phases" provided'); if (contract instanceof Erc1155) { @@ -295,7 +304,117 @@ export function useSetClaimConditions( }, { onSettled: () => { - // TODO: fix cache + invalidateContractAndBalances( + queryClient, + contractAddress, + activeChainId, + ); + }, + }, + ); +} + +/** + * Use this to reset claim conditions on your {@link NFTContract} + * + * @example + * ```jsx + * const Component = () => { + * const nftDrop = useNFTDrop(); + * const { + * mutate: resetClaimConditions, + * isLoading, + * error, + * } = useResetClaimConditions(nftDrop); + * + * if (error) { + * console.error("failed to reset claim conditions", error); + * } + * + * return ( + * + * ); + * }; + * ``` + * @example + * ```jsx + * const Component = () => { + * const { contract } = useContract(); + * const { + * mutate: resetClaimConditions, + * isLoading, + * error, + * } = useResetClaimConditions(contract?.nft); + * + * if (error) { + * console.error("failed to reset claim conditions", error); + * } + * + * return ( + * + * ); + * }; + * ``` + * + * @param contract - an instance of a {@link NFTContract} + * @returns a mutation object that can be used to reset claim conditions + * @beta + */ +export function useResetClaimConditions( + ...[contract, tokenId]: ClaimConditionsInputParams +) { + const activeChainId = useActiveChainId(); + const contractAddress = contract?.getAddress(); + const queryClient = useQueryClient(); + + return useMutation( + async () => { + invariant(contract, "No Contract instance provided"); + + const cleanConditions = (conditions: ClaimCondition[]) => { + return conditions.map((c) => ({ + ...c, + price: c.currencyMetadata.displayValue, + maxQuantity: c.maxQuantity.toString(), + quantityLimitPerTransaction: c.quantityLimitPerTransaction.toString(), + })); + }; + + if (contract instanceof Erc1155) { + invariant(tokenId, "tokenId is required for ERC1155 claim conditions"); + const claimConditions = await contract?.drop?.claim?.conditions.getAll( + tokenId, + ); + return contract?.drop?.claim?.conditions.set( + tokenId, + cleanConditions(claimConditions || []), + true, + ); + } + + const claimConditions = await contract?.drop?.claim?.conditions.getAll(); + return await contract?.drop?.claim?.conditions.set( + cleanConditions(claimConditions || []), + true, + ); + }, + { + onSettled: () => { + invalidateContractAndBalances( + queryClient, + contractAddress, + activeChainId, + ); }, }, ); diff --git a/yarn.lock b/yarn.lock index 13562fa..3631a8d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1089,8 +1089,10 @@ resolved "https://registry.yarnpkg.com/@thirdweb-dev/contracts/-/contracts-3.1.0-1.tgz#8c4d068f0548f780a90cc723636bcc358cb946eb" integrity sha512-v19UtKKIpd6ol7fXcAL24F7Jwew1jIAmxstogTw9MdX2k9McwaI0Ebxu/3SSkQq2AhmruwOPp+E2xq1SWKsBUw== -"@thirdweb-dev/sdk@file:.yalc/@thirdweb-dev/sdk": - version "2.3.36" +"@thirdweb-dev/sdk@^2.3.37": + version "2.3.37" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/sdk/-/sdk-2.3.37.tgz#14b7f043f58f977b71672998cf089676170efd7b" + integrity sha512-nyxPp3kk/RDQruBR6nP3p74aIGwetC+NtmXVBKUhmdxblUDnxqLmap+x/uu31aBkpiWkl4fecV7swWu07DqmkQ== dependencies: "@thirdweb-dev/contracts" "3.1.0-1" "@web-std/file" "^3.0.0" From 66a2f14394d64fb48eaa0db31e736f186e9610c0 Mon Sep 17 00:00:00 2001 From: Nacho Iacovino Date: Thu, 18 Aug 2022 21:56:15 +0200 Subject: [PATCH 8/8] v2.6.6-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a11f35a..42295ff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thirdweb-dev/react", - "version": "2.6.5", + "version": "2.6.6-0", "repository": { "type": "git", "url": "git+https://github.com:thirdweb-dev/react.git"