Skip to content

Commit 2fbd76d

Browse files
gregfromstljoaquim-verges
authored andcommitted
update
1 parent eb11436 commit 2fbd76d

File tree

14 files changed

+349
-953
lines changed

14 files changed

+349
-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: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ 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 { getNFTInfo } from "./hooks.js";
6+
import { NFTMedia } from "./media.js";
7+
import { NFTName } from "./name.js";
8+
import { NFTProvider, NFTProviderContext } from "./provider.js";
89

910
describe.runIf(process.env.TW_SECRET_KEY)("NFT prebuilt component", () => {
1011
it("should fetch the NFT metadata", async () => {
@@ -44,9 +45,9 @@ describe.runIf(process.env.TW_SECRET_KEY)("NFT prebuilt component", () => {
4445

4546
it("should render children correctly", () => {
4647
render(
47-
<NFT.Provider contract={DOODLES_CONTRACT} tokenId={0n}>
48+
<NFTProvider contract={DOODLES_CONTRACT} tokenId={0n}>
4849
<div>Child Component</div>
49-
</NFT.Provider>,
50+
</NFTProvider>,
5051
);
5152

5253
expect(screen.getByText("Child Component")).toBeInTheDocument();
@@ -66,9 +67,9 @@ describe.runIf(process.env.TW_SECRET_KEY)("NFT prebuilt component", () => {
6667
);
6768
}
6869
render(
69-
<NFT.Provider contract={DOODLES_CONTRACT} tokenId={0n}>
70+
<NFTProvider contract={DOODLES_CONTRACT} tokenId={0n}>
7071
<NFTConsumer />
71-
</NFT.Provider>,
72+
</NFTProvider>,
7273
);
7374

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

7879
it("should render the NFT image", () => {
7980
render(
80-
<NFT.Provider contract={DOODLES_CONTRACT} tokenId={0n}>
81-
<NFT.Media />
82-
</NFT.Provider>,
81+
<NFTProvider contract={DOODLES_CONTRACT} tokenId={0n}>
82+
<NFTMedia />
83+
</NFTProvider>,
8384
);
8485

8586
waitFor(() => expect(screen.getByRole("img")).toBeInTheDocument());
8687
});
8788

8889
it("should render the NFT name", () => {
8990
render(
90-
<NFT.Provider contract={DOODLES_CONTRACT} tokenId={1n}>
91-
<NFT.Name />
92-
</NFT.Provider>,
91+
<NFTProvider contract={DOODLES_CONTRACT} tokenId={1n}>
92+
<NFTName />
93+
</NFTProvider>,
9394
);
9495

9596
waitFor(() => expect(screen.getByText("Doodle #1")).toBeInTheDocument());
9697
});
9798

9899
it("should render the NFT description", () => {
99100
render(
100-
<NFT.Provider contract={DOODLES_CONTRACT} tokenId={1n}>
101-
<NFT.Name />
102-
</NFT.Provider>,
101+
<NFTProvider contract={DOODLES_CONTRACT} tokenId={1n}>
102+
<NFTName />
103+
</NFTProvider>,
103104
);
104105

105106
waitFor(() =>

0 commit comments

Comments
 (0)