Skip to content

Commit 99daa7d

Browse files
gregfromstljoaquim-verges
authored andcommitted
update
1 parent eb11436 commit 99daa7d

File tree

14 files changed

+348
-953
lines changed

14 files changed

+348
-953
lines changed

.changeset/tall-pots-live.md

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,35 @@
22
"thirdweb": minor
33
---
44

5-
NFT component provider changed from NFT to NFT.Provider
5+
# Breaking change
6+
We are making the following changes to the NFT component to provide better performance and fine-grain control over their internal fetching logic.
7+
Moreover, you no longer have to wrap React.Suspense around said components!
68

9+
### Old
710
```tsx
8-
<NFT.Provider contract={contract} tokenId={0n}>
9-
<Suspense fallback={"Loading nft..."}>
11+
<NFT>
12+
<React.Suspense fallback={"Loading stuff..."}>
1013
<NFT.Media />
14+
<NFT.Name />
1115
<NFT.Description />
12-
</Suspense>
16+
</React.Suspense>
17+
</NFT>
18+
```
19+
20+
### New
21+
The new version comes with 2 new props: `loadingComponent` and `fallbackComponent`.
22+
Basically, `loadingComponent` takes in a component and show it _while the internal fetching is being done_
23+
`fallbackComponent` takes in a component and show it _once the data is failed to be resolved_
24+
25+
```tsx
26+
<NFTProvider contract={contract} tokenId={0n}>
27+
<NFTMedia
28+
loadingComponent={<span>Loading NFT Image</span>}
29+
fallbackComponent={<span>Failed to load NFT</span>}
30+
/>
31+
<NFT.Description
32+
loadingComponent={<span>Loading NFT Description</span>}
33+
fallbackComponent={<span>Failed to load NFT Description</span>}
34+
/>
1335
</NFT>
1436
```

apps/portal/src/app/react/v5/sidebar.tsx

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -320,13 +320,29 @@ export const sidebar: SideBar = {
320320
links: [
321321
{
322322
name: "UI Components",
323-
links: ["ClaimButton", "TransactionButton", "MediaRenderer"].map(
324-
(name) => ({
325-
name,
326-
href: `${slug}/${name}`,
327-
icon: <CodeIcon />,
328-
}),
329-
),
323+
links: [
324+
...["ClaimButton", "TransactionButton", "MediaRenderer"].map(
325+
(name) => ({
326+
name,
327+
href: `${slug}/${name}`,
328+
icon: <CodeIcon />,
329+
}),
330+
),
331+
{
332+
name: "NFT",
333+
isCollapsible: true,
334+
links: [
335+
"NFTProvider",
336+
"NFTMedia",
337+
"NFTName",
338+
"NFTDescription",
339+
].map((name) => ({
340+
name,
341+
href: `${slug}/${name}`,
342+
icon: <CodeIcon />,
343+
})),
344+
},
345+
],
330346
},
331347
{
332348
name: "Reading State",

packages/thirdweb/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1041,7 +1041,7 @@
10411041

10421042
<NFT contract={contract} tokenId={0n}>
10431043
<Suspense fallback={"Loading media..."}>
1044-
<NFT.Media />
1044+
<NFTMedia />
10451045
</Suspense>
10461046
</NFT>;
10471047
```

packages/thirdweb/src/exports/react.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,22 @@ export {
174174
} from "../react/web/ui/prebuilt/thirdweb/CreateDirectListingButton/index.js";
175175

176176
// NFT rendering components
177-
export * as NFT from "../react/web/ui/prebuilt/NFT/index.js";
177+
export {
178+
NFTProvider,
179+
type NFTProviderProps,
180+
} from "../react/web/ui/prebuilt/NFT/provider.js";
181+
export {
182+
NFTName,
183+
type NFTNameProps,
184+
} from "../react/web/ui/prebuilt/NFT/name.js";
185+
export {
186+
NFTDescription,
187+
type NFTDescriptionProps,
188+
} from "../react/web/ui/prebuilt/NFT/description.js";
189+
export {
190+
NFTMedia,
191+
type NFTMediaProps,
192+
} from "../react/web/ui/prebuilt/NFT/media.js";
178193

179194
export { useConnectionManager } from "../react/core/providers/connection-manager.js";
180195

packages/thirdweb/src/extensions/prebuilts/deploy-published.test.ts

Lines changed: 0 additions & 132 deletions
This file was deleted.

packages/thirdweb/src/react/web/ui/prebuilt/NFT/NFT.test.tsx

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import { useContext } from "react";
22
import { describe, expect, it } from "vitest";
33
import { render, screen, waitFor } from "~test/react-render.js";
44
import { DOODLES_CONTRACT } from "~test/test-contracts.js";
5-
import * as NFT from "./index.js";
6-
import { getNFTInfo } from "./media.js";
7-
import { NFTProviderContext } from "./provider.js";
5+
import { NFTMedia, getNFTInfo } from "./media.js";
6+
import { NFTName } from "./name.js";
7+
import { NFTProvider, NFTProviderContext } from "./provider.js";
88

99
describe.runIf(process.env.TW_SECRET_KEY)("NFT prebuilt component", () => {
1010
it("should fetch the NFT metadata", async () => {
@@ -44,9 +44,9 @@ describe.runIf(process.env.TW_SECRET_KEY)("NFT prebuilt component", () => {
4444

4545
it("should render children correctly", () => {
4646
render(
47-
<NFT.Provider contract={DOODLES_CONTRACT} tokenId={0n}>
47+
<NFTProvider contract={DOODLES_CONTRACT} tokenId={0n}>
4848
<div>Child Component</div>
49-
</NFT.Provider>,
49+
</NFTProvider>,
5050
);
5151

5252
expect(screen.getByText("Child Component")).toBeInTheDocument();
@@ -66,9 +66,9 @@ describe.runIf(process.env.TW_SECRET_KEY)("NFT prebuilt component", () => {
6666
);
6767
}
6868
render(
69-
<NFT.Provider contract={DOODLES_CONTRACT} tokenId={0n}>
69+
<NFTProvider contract={DOODLES_CONTRACT} tokenId={0n}>
7070
<NFTConsumer />
71-
</NFT.Provider>,
71+
</NFTProvider>,
7272
);
7373

7474
expect(screen.getByText(/Contract:/)).toBeInTheDocument();
@@ -77,29 +77,29 @@ describe.runIf(process.env.TW_SECRET_KEY)("NFT prebuilt component", () => {
7777

7878
it("should render the NFT image", () => {
7979
render(
80-
<NFT.Provider contract={DOODLES_CONTRACT} tokenId={0n}>
81-
<NFT.Media />
82-
</NFT.Provider>,
80+
<NFTProvider contract={DOODLES_CONTRACT} tokenId={0n}>
81+
<NFTMedia />
82+
</NFTProvider>,
8383
);
8484

8585
waitFor(() => expect(screen.getByRole("img")).toBeInTheDocument());
8686
});
8787

8888
it("should render the NFT name", () => {
8989
render(
90-
<NFT.Provider contract={DOODLES_CONTRACT} tokenId={1n}>
91-
<NFT.Name />
92-
</NFT.Provider>,
90+
<NFTProvider contract={DOODLES_CONTRACT} tokenId={1n}>
91+
<NFTName />
92+
</NFTProvider>,
9393
);
9494

9595
waitFor(() => expect(screen.getByText("Doodle #1")).toBeInTheDocument());
9696
});
9797

9898
it("should render the NFT description", () => {
9999
render(
100-
<NFT.Provider contract={DOODLES_CONTRACT} tokenId={1n}>
101-
<NFT.Name />
102-
</NFT.Provider>,
100+
<NFTProvider contract={DOODLES_CONTRACT} tokenId={1n}>
101+
<NFTName />
102+
</NFTProvider>,
103103
);
104104

105105
waitFor(() =>

0 commit comments

Comments
 (0)