thirdweb 5.121.3 → 5.121.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/cjs/insight/get-nfts.js +2 -2
  2. package/dist/cjs/insight/get-nfts.js.map +1 -1
  3. package/dist/cjs/utils/web/isMobile.js +0 -4
  4. package/dist/cjs/utils/web/isMobile.js.map +1 -1
  5. package/dist/cjs/version.js +1 -1
  6. package/dist/cjs/wallets/__generated__/wallet/io.rabby/index.js +12 -12
  7. package/dist/cjs/wallets/__generated__/wallet/io.rabby/index.js.map +1 -1
  8. package/dist/cjs/wallets/__generated__/wallet-infos.js +1 -1
  9. package/dist/cjs/wallets/__generated__/wallet-infos.js.map +1 -1
  10. package/dist/cjs/wallets/wallet-connect/qr-overlay.js +18 -0
  11. package/dist/cjs/wallets/wallet-connect/qr-overlay.js.map +1 -1
  12. package/dist/esm/insight/get-nfts.js +2 -2
  13. package/dist/esm/insight/get-nfts.js.map +1 -1
  14. package/dist/esm/utils/web/isMobile.js +0 -4
  15. package/dist/esm/utils/web/isMobile.js.map +1 -1
  16. package/dist/esm/version.js +1 -1
  17. package/dist/esm/wallets/__generated__/wallet/io.rabby/index.js +12 -12
  18. package/dist/esm/wallets/__generated__/wallet/io.rabby/index.js.map +1 -1
  19. package/dist/esm/wallets/__generated__/wallet-infos.js +1 -1
  20. package/dist/esm/wallets/__generated__/wallet-infos.js.map +1 -1
  21. package/dist/esm/wallets/wallet-connect/qr-overlay.js +18 -0
  22. package/dist/esm/wallets/wallet-connect/qr-overlay.js.map +1 -1
  23. package/dist/scripts/bridge-widget.js +91 -90
  24. package/dist/types/utils/web/isMobile.d.ts.map +1 -1
  25. package/dist/types/version.d.ts +1 -1
  26. package/dist/types/wallets/__generated__/wallet/io.rabby/index.d.ts +12 -12
  27. package/dist/types/wallets/__generated__/wallet/io.rabby/index.d.ts.map +1 -1
  28. package/dist/types/wallets/__generated__/wallet-ids.d.ts +1 -1
  29. package/dist/types/wallets/__generated__/wallet-ids.d.ts.map +1 -1
  30. package/dist/types/wallets/__generated__/wallet-infos.d.ts +1 -1
  31. package/dist/types/wallets/getAllWalletsList.d.ts +1 -1
  32. package/dist/types/wallets/wallet-connect/qr-overlay.d.ts.map +1 -1
  33. package/package.json +18 -17
  34. package/src/insight/get-nfts.ts +2 -2
  35. package/src/react/core/account/provider.test.tsx +1 -0
  36. package/src/react/core/hooks/others/useWalletBalance.test.tsx +1 -0
  37. package/src/react/core/hooks/pay/useBuyWithFiatQuotesForProviders.test.tsx +1 -0
  38. package/src/react/core/hooks/useStepExecutor.test.tsx +1 -0
  39. package/src/react/core/hooks/wallets/useAddConnectedWallet.test.tsx +1 -0
  40. package/src/react/core/hooks/wallets/useAutoConnectCore.test.tsx +1 -0
  41. package/src/react/core/hooks/wallets/useConnect.test.tsx +1 -0
  42. package/src/react/core/hooks/wallets/useSetActiveWallet.test.tsx +1 -0
  43. package/src/react/core/hooks/wallets/useSwitchActiveWalletChain.test.tsx +1 -0
  44. package/src/react/core/providers/connection-manager.test.tsx +1 -0
  45. package/src/react/core/wallet/provider.test.tsx +1 -0
  46. package/src/react/native/hooks/wallets/useUnlinkProfile.test.tsx +1 -0
  47. package/src/react/web/hooks/wallets/useUnlinkProfile.test.tsx +1 -0
  48. package/src/react/web/ui/AutoConnect/AutoConnect.test.tsx +1 -0
  49. package/src/react/web/ui/Bridge/StepRunner.test.tsx +1 -0
  50. package/src/react/web/ui/Bridge/common/token-query.test.tsx +1 -0
  51. package/src/react/web/ui/ConnectWallet/ConnectButton.test.tsx +1 -0
  52. package/src/react/web/ui/ConnectWallet/Details.test.tsx +1 -0
  53. package/src/react/web/ui/ConnectWallet/NetworkSelector.test.tsx +1 -0
  54. package/src/react/web/ui/ConnectWallet/screens/Buy/fiat/currencies.test.tsx +1 -0
  55. package/src/react/web/ui/ConnectWallet/screens/LinkedProfilesScreen.test.tsx +1 -0
  56. package/src/react/web/ui/ConnectWallet/screens/ManageWalletScreen.test.tsx +1 -0
  57. package/src/react/web/ui/ConnectWallet/screens/PrivateKey.test.tsx +1 -0
  58. package/src/react/web/ui/ConnectWallet/screens/ReceiveFunds.test.tsx +1 -0
  59. package/src/react/web/ui/ConnectWallet/screens/SendFunds.test.tsx +1 -0
  60. package/src/react/web/ui/ConnectWallet/screens/SignatureScreen.test.tsx +1 -0
  61. package/src/react/web/ui/ConnectWallet/screens/StartScreen.test.tsx +1 -0
  62. package/src/react/web/ui/MediaRenderer/MediaRenderer.test.tsx +1 -0
  63. package/src/react/web/ui/MediaRenderer/icons.test.tsx +1 -0
  64. package/src/react/web/ui/MediaRenderer/useResolvedMediaType.test.tsx +1 -0
  65. package/src/react/web/ui/SiteEmbed.test.tsx +1 -0
  66. package/src/react/web/ui/SiteLink.test.tsx +1 -0
  67. package/src/react/web/ui/TransactionButton/TransactionButton.test.tsx +1 -0
  68. package/src/react/web/ui/components/ChainIcon.test.tsx +1 -0
  69. package/src/react/web/ui/hooks/useCopyClipboard.test.tsx +1 -0
  70. package/src/react/web/ui/hooks/useDebouncedValue.test.tsx +1 -0
  71. package/src/react/web/ui/hooks/useShowMore.test.tsx +28 -12
  72. package/src/react/web/ui/prebuilt/Account/address.test.tsx +1 -0
  73. package/src/react/web/ui/prebuilt/Account/avatar.test.tsx +1 -0
  74. package/src/react/web/ui/prebuilt/Account/balance.test.tsx +1 -0
  75. package/src/react/web/ui/prebuilt/Account/name.test.tsx +1 -0
  76. package/src/react/web/ui/prebuilt/Chain/icon.test.tsx +1 -0
  77. package/src/react/web/ui/prebuilt/Chain/name.test.tsx +1 -0
  78. package/src/react/web/ui/prebuilt/Chain/provider.test.tsx +1 -0
  79. package/src/react/web/ui/prebuilt/NFT/description.test.tsx +1 -0
  80. package/src/react/web/ui/prebuilt/NFT/media.test.tsx +1 -0
  81. package/src/react/web/ui/prebuilt/NFT/name.test.tsx +1 -0
  82. package/src/react/web/ui/prebuilt/NFT/provider.test.tsx +1 -0
  83. package/src/react/web/ui/prebuilt/Token/name.test.tsx +1 -0
  84. package/src/react/web/ui/prebuilt/Token/provider.test.tsx +1 -0
  85. package/src/react/web/ui/prebuilt/Token/symbol.test.tsx +1 -0
  86. package/src/react/web/ui/prebuilt/Wallet/icon.test.tsx +1 -0
  87. package/src/react/web/ui/prebuilt/Wallet/name.test.tsx +1 -0
  88. package/src/react/web/ui/prebuilt/thirdweb/BuyDirectListingButton/BuyDirectListingButton.test.tsx +1 -0
  89. package/src/react/web/ui/prebuilt/thirdweb/ClaimButton/ClaimButton.test.tsx +1 -0
  90. package/src/react/web/ui/prebuilt/thirdweb/CreateDirectListingButton/CreateDirectListingButton.test.tsx +1 -0
  91. package/src/react/web/utils/canFitWideModal.test.tsx +1 -0
  92. package/src/react/web/wallets/in-app/CountrySelector.test.tsx +1 -0
  93. package/src/react/web/wallets/in-app/InputSelectionUI.test.tsx +1 -0
  94. package/src/react/web/wallets/shared/ConnectWalletSocialOptions.test.tsx +1 -0
  95. package/src/utils/web/isMobile.test.ts +43 -0
  96. package/src/utils/web/isMobile.ts +0 -7
  97. package/src/version.ts +1 -1
  98. package/src/wallets/__generated__/wallet/io.rabby/index.ts +13 -12
  99. package/src/wallets/__generated__/wallet-ids.ts +2 -1
  100. package/src/wallets/__generated__/wallet-infos.ts +1 -1
  101. package/src/wallets/in-app/web/lib/auth/redirect-state.test.tsx +1 -0
  102. package/src/wallets/in-app/web/lib/get-url-token.test.tsx +1 -0
  103. package/src/wallets/in-app/web/utils/iFrameCommunication/IframeCommunicator.test.tsx +1 -0
  104. package/src/wallets/wallet-connect/qr-overlay.test.ts +61 -0
  105. package/src/wallets/wallet-connect/qr-overlay.ts +21 -0
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it } from "vitest";
2
3
  import { render, screen, waitFor } from "~test/react-render.js";
3
4
  import { ethereum } from "../../../../../chains/chain-definitions/ethereum.js";
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it } from "vitest";
2
3
  import { render, screen, waitFor } from "~test/react-render.js";
3
4
  import { ethereum } from "../../../../../chains/chain-definitions/ethereum.js";
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it } from "vitest";
2
3
  import {
3
4
  DOODLES_CONTRACT,
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it } from "vitest";
2
3
  import {
3
4
  DOODLES_CONTRACT,
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it } from "vitest";
2
3
  import {
3
4
  DOODLES_CONTRACT,
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { type FC, useContext } from "react";
2
3
  import { describe, expect, it, vi } from "vitest";
3
4
  import { render, renderHook, screen, waitFor } from "~test/react-render.js";
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it } from "vitest";
2
3
  import { ANVIL_CHAIN } from "~test/chains.js";
3
4
  import { TEST_CLIENT } from "~test/test-clients.js";
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it } from "vitest";
2
3
  import { render, screen, waitFor } from "~test/react-render.js";
3
4
  import { TEST_CLIENT } from "~test/test-clients.js";
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it } from "vitest";
2
3
  import { ANVIL_CHAIN } from "~test/chains.js";
3
4
  import { TEST_CLIENT } from "~test/test-clients.js";
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  /** biome-ignore-all lint/nursery/useUniqueElementIds: "id" is not a html attribute here - TODO: stop using 'id' as a prop on JSX elements */
2
3
  import { describe, expect, it } from "vitest";
3
4
  import { render, waitFor } from "~test/react-render.js";
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  /** biome-ignore-all lint/nursery/useUniqueElementIds: FIXME: do not use "id" as a prop on JSX elements */
2
3
  import { describe, expect, it } from "vitest";
3
4
  import { render, waitFor } from "~test/react-render.js";
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it } from "vitest";
2
3
  import { render, screen } from "~test/react-render.js";
3
4
  import { TEST_CLIENT } from "~test/test-clients.js";
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it } from "vitest";
2
3
  import { ANVIL_CHAIN } from "~test/chains.js";
3
4
  import { TEST_CONTRACT_URI } from "~test/ipfs-uris.js";
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it } from "vitest";
2
3
  import { render, screen } from "~test/react-render.js";
3
4
  import { TEST_CLIENT } from "~test/test-clients.js";
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it } from "vitest";
2
3
  import { wideModalScreenThreshold } from "../ui/ConnectWallet/constants.js";
3
4
  import { canFitWideModal } from "./canFitWideModal.js";
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it, vi } from "vitest";
2
3
  import {
3
4
  fireEvent,
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it, vi } from "vitest";
2
3
  import { render, screen } from "../../../../../test/src/react-render.js";
3
4
  import { getCountrySelector } from "./CountrySelector.js";
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { describe, expect, it, vi } from "vitest";
2
3
  import {
3
4
  fireEvent,
@@ -0,0 +1,43 @@
1
+ // @vitest-environment happy-dom
2
+ import { afterEach, describe, expect, it, vi } from "vitest";
3
+ import { isMobile } from "./isMobile.js";
4
+
5
+ const DESKTOP_UA =
6
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36";
7
+ const IPHONE_UA =
8
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1";
9
+ const ANDROID_UA =
10
+ "Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Mobile Safari/537.36";
11
+
12
+ function setUserAgent(userAgent: string) {
13
+ vi.spyOn(navigator, "userAgent", "get").mockReturnValue(userAgent);
14
+ }
15
+
16
+ function setViewportWidth(width: number) {
17
+ vi.spyOn(window, "innerWidth", "get").mockReturnValue(width);
18
+ }
19
+
20
+ describe("isMobile", () => {
21
+ afterEach(() => {
22
+ vi.restoreAllMocks();
23
+ });
24
+
25
+ it("returns false for a desktop browser with a narrow viewport", () => {
26
+ setUserAgent(DESKTOP_UA);
27
+ setViewportWidth(500);
28
+
29
+ expect(isMobile()).toBe(false);
30
+ });
31
+
32
+ it("returns true for iOS", () => {
33
+ setUserAgent(IPHONE_UA);
34
+
35
+ expect(isMobile()).toBe(true);
36
+ });
37
+
38
+ it("returns true for Android", () => {
39
+ setUserAgent(ANDROID_UA);
40
+
41
+ expect(isMobile()).toBe(true);
42
+ });
43
+ });
@@ -71,12 +71,5 @@ export function isMobile(): boolean {
71
71
  return true;
72
72
  }
73
73
 
74
- const isMobileViewport =
75
- typeof window !== "undefined" && window.innerWidth < 640;
76
-
77
- if (isMobileViewport) {
78
- return true;
79
- }
80
-
81
74
  return false;
82
75
  }
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = "5.121.3";
1
+ export const version = "5.121.5";
@@ -9,25 +9,26 @@ export const wallet = {
9
9
  app: {
10
10
  browser:
11
11
  "https://chrome.google.com/webstore/detail/rabby/acmacodkjbdgmoleebolmdjonilkdbch",
12
- ios: null,
13
- android: null,
14
- mac: null,
15
- windows: null,
16
- linux: null,
12
+ ios: "https://apps.apple.com/us/app/rabby-wallet-crypto-evm/id6474381673",
13
+ android:
14
+ "https://play.google.com/store/apps/details?id=com.debank.rabbymobile",
15
+ mac: "",
16
+ windows: "",
17
+ linux: "",
17
18
  chrome:
18
19
  "https://chrome.google.com/webstore/detail/rabby-wallet/acmacodkjbdgmoleebolmdjonilkdbch",
19
- firefox: null,
20
- safari: null,
21
- edge: null,
22
- opera: null,
20
+ firefox: "",
21
+ safari: "",
22
+ edge: "",
23
+ opera: "",
23
24
  },
24
25
  rdns: "io.rabby",
25
26
  mobile: {
26
- native: null,
27
- universal: null,
27
+ native: "rabby://",
28
+ universal: "",
28
29
  },
29
30
  desktop: {
30
- native: null,
31
+ native: "",
31
32
  universal:
32
33
  "https://chrome.google.com/webstore/detail/rabby/acmacodkjbdgmoleebolmdjonilkdbch",
33
34
  },
@@ -2,7 +2,7 @@
2
2
  // This file is auto-generated by the `scripts/wallets/generate.ts` script.
3
3
  // Do not modify this file manually.
4
4
 
5
- // 476 wallets
5
+ // 477 wallets
6
6
  export type WCSupportedWalletIds =
7
7
  | "io.1inch.wallet"
8
8
  | "com.binance.wallet"
@@ -32,6 +32,7 @@ export type WCSupportedWalletIds =
32
32
  | "com.roninchain.wallet"
33
33
  | "com.okex.wallet"
34
34
  | "com.wemixplay"
35
+ | "io.rabby"
35
36
  | "com.tangem"
36
37
  | "com.exodus"
37
38
  | "com.hashpack.wallet"
@@ -2357,7 +2357,7 @@ const ALL_MINIMAL_WALLET_INFOS = [
2357
2357
  {
2358
2358
  id: "io.rabby",
2359
2359
  name: "Rabby",
2360
- hasMobileSupport: false,
2360
+ hasMobileSupport: true,
2361
2361
  },
2362
2362
  {
2363
2363
  id: "com.brave.wallet",
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { beforeEach, describe, expect, it } from "vitest";
2
3
  import { consumeRedirectState, storeRedirectState } from "./redirect-state.js";
3
4
 
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
3
  import { getUrlToken } from "./get-url-token.js";
3
4
 
@@ -1,3 +1,4 @@
1
+ // @vitest-environment happy-dom
1
2
  import { beforeEach, describe, expect, it, vi } from "vitest";
2
3
  import { IframeCommunicator } from "./IframeCommunicator.js";
3
4
 
@@ -0,0 +1,61 @@
1
+ // @vitest-environment happy-dom
2
+ import { beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { createQROverlay } from "./qr-overlay.js";
4
+
5
+ const URI = "wc:1234@2?relay-protocol=irn&symKey=abcd";
6
+
7
+ function overlayElements(): HTMLElement[] {
8
+ return Array.from(document.body.children).filter(
9
+ (el): el is HTMLElement =>
10
+ el instanceof HTMLElement && el.style.zIndex === "9999",
11
+ );
12
+ }
13
+
14
+ function pressEscape() {
15
+ document.dispatchEvent(new KeyboardEvent("keydown", { key: "Escape" }));
16
+ }
17
+
18
+ describe("createQROverlay", () => {
19
+ beforeEach(() => {
20
+ document.body.innerHTML = "";
21
+ document.body.style.pointerEvents = "";
22
+ });
23
+
24
+ it("stays interactive when pointer events are disabled on body", () => {
25
+ document.body.style.pointerEvents = "none";
26
+
27
+ const overlay = createQROverlay(URI);
28
+
29
+ expect(overlayElements()[0]?.style.pointerEvents).toBe("auto");
30
+ overlay.destroy();
31
+ });
32
+
33
+ it("replaces the previous overlay instead of stacking", () => {
34
+ createQROverlay(URI);
35
+ const overlay = createQROverlay(URI);
36
+
37
+ expect(overlayElements()).toHaveLength(1);
38
+ overlay.destroy();
39
+ });
40
+
41
+ it("detaches the replaced overlay's listeners", () => {
42
+ const firstCancel = vi.fn();
43
+ const secondCancel = vi.fn();
44
+ createQROverlay(URI, { onCancel: firstCancel });
45
+ createQROverlay(URI, { onCancel: secondCancel });
46
+
47
+ pressEscape();
48
+
49
+ expect(firstCancel).not.toHaveBeenCalled();
50
+ expect(secondCancel).toHaveBeenCalledTimes(1);
51
+ });
52
+
53
+ it("does not remove a newer overlay when an older one is destroyed", () => {
54
+ const first = createQROverlay(URI);
55
+ createQROverlay(URI);
56
+
57
+ first.destroy();
58
+
59
+ expect(overlayElements()).toHaveLength(1);
60
+ });
61
+ });
@@ -53,6 +53,9 @@ export interface QROverlay {
53
53
  show: () => void;
54
54
  }
55
55
 
56
+ // Only one overlay is shown at a time; creating a new one replaces the previous one.
57
+ let removeActiveOverlay: (() => void) | undefined;
58
+
56
59
  /**
57
60
  * Creates a QR code overlay for the given WalletConnect URI
58
61
  */
@@ -69,7 +72,10 @@ export function createQROverlay(
69
72
  onCancel,
70
73
  } = options;
71
74
 
75
+ removeActiveOverlay?.();
76
+
72
77
  // Create overlay backdrop
78
+ // pointer-events is explicit so the overlay stays interactive when the host page disables it on body
73
79
  const overlay = document.createElement("div");
74
80
  overlay.style.cssText = `
75
81
  position: fixed;
@@ -77,6 +83,7 @@ export function createQROverlay(
77
83
  background-color: ${theme === "dark" ? "rgba(0, 0, 0, 0.8)" : "rgba(0, 0, 0, 0.5)"};
78
84
  backdrop-filter: blur(10px);
79
85
  z-index: 9999;
86
+ pointer-events: auto;
80
87
  display: flex;
81
88
  align-items: center;
82
89
  justify-content: center;
@@ -252,9 +259,23 @@ export function createQROverlay(
252
259
  // Append to container
253
260
  container.appendChild(overlay);
254
261
 
262
+ function removeNow() {
263
+ document.removeEventListener("keydown", handleEscapeKey);
264
+ overlay.removeEventListener("click", handleOverlayClick);
265
+ overlay.remove();
266
+ style.remove();
267
+ if (removeActiveOverlay === removeNow) {
268
+ removeActiveOverlay = undefined;
269
+ }
270
+ }
271
+ removeActiveOverlay = removeNow;
272
+
255
273
  function destroyOverlay(userInitiated = false) {
256
274
  document.removeEventListener("keydown", handleEscapeKey);
257
275
  overlay.removeEventListener("click", handleOverlayClick);
276
+ if (removeActiveOverlay === removeNow) {
277
+ removeActiveOverlay = undefined;
278
+ }
258
279
 
259
280
  // Call onCancel callback only if user initiated the close action
260
281
  if (userInitiated && onCancel) {