thirdweb 5.107.0 → 5.107.1-nightly-d53f8a25b4978a9f92f494f50955765817e31bad-20250920000329

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 (113) hide show
  1. package/dist/cjs/bridge/Token.js +4 -1
  2. package/dist/cjs/bridge/Token.js.map +1 -1
  3. package/dist/cjs/react/core/design-system/index.js +1 -0
  4. package/dist/cjs/react/core/design-system/index.js.map +1 -1
  5. package/dist/cjs/react/web/ui/Bridge/swap-widget/SearchInput.js +1 -1
  6. package/dist/cjs/react/web/ui/Bridge/swap-widget/SearchInput.js.map +1 -1
  7. package/dist/cjs/react/web/ui/Bridge/swap-widget/SwapWidget.js +43 -28
  8. package/dist/cjs/react/web/ui/Bridge/swap-widget/SwapWidget.js.map +1 -1
  9. package/dist/cjs/react/web/ui/Bridge/swap-widget/select-chain.js +9 -7
  10. package/dist/cjs/react/web/ui/Bridge/swap-widget/select-chain.js.map +1 -1
  11. package/dist/cjs/react/web/ui/Bridge/swap-widget/select-token-ui.js +82 -46
  12. package/dist/cjs/react/web/ui/Bridge/swap-widget/select-token-ui.js.map +1 -1
  13. package/dist/cjs/react/web/ui/Bridge/swap-widget/swap-ui.js +215 -80
  14. package/dist/cjs/react/web/ui/Bridge/swap-widget/swap-ui.js.map +1 -1
  15. package/dist/cjs/react/web/ui/Bridge/swap-widget/utils.js +6 -0
  16. package/dist/cjs/react/web/ui/Bridge/swap-widget/utils.js.map +1 -1
  17. package/dist/cjs/react/web/ui/ConnectWallet/icons/ArrowUpDownIcon.js +1 -1
  18. package/dist/cjs/react/web/ui/ConnectWallet/icons/ArrowUpDownIcon.js.map +1 -1
  19. package/dist/cjs/react/web/ui/components/buttons.js +5 -2
  20. package/dist/cjs/react/web/ui/components/buttons.js.map +1 -1
  21. package/dist/cjs/react/web/ui/components/formElements.js +4 -1
  22. package/dist/cjs/react/web/ui/components/formElements.js.map +1 -1
  23. package/dist/cjs/react/web/ui/hooks/useisMobile.js +19 -0
  24. package/dist/cjs/react/web/ui/hooks/useisMobile.js.map +1 -0
  25. package/dist/cjs/stories/Bridge/Swap/SelectChain.stories.js +16 -6
  26. package/dist/cjs/stories/Bridge/Swap/SelectChain.stories.js.map +1 -1
  27. package/dist/cjs/stories/Bridge/Swap/SwapWidget.stories.js +6 -11
  28. package/dist/cjs/stories/Bridge/Swap/SwapWidget.stories.js.map +1 -1
  29. package/dist/cjs/version.js +1 -1
  30. package/dist/cjs/version.js.map +1 -1
  31. package/dist/esm/bridge/Token.js +4 -1
  32. package/dist/esm/bridge/Token.js.map +1 -1
  33. package/dist/esm/react/core/design-system/index.js +1 -0
  34. package/dist/esm/react/core/design-system/index.js.map +1 -1
  35. package/dist/esm/react/web/ui/Bridge/swap-widget/SearchInput.js +1 -1
  36. package/dist/esm/react/web/ui/Bridge/swap-widget/SearchInput.js.map +1 -1
  37. package/dist/esm/react/web/ui/Bridge/swap-widget/SwapWidget.js +43 -28
  38. package/dist/esm/react/web/ui/Bridge/swap-widget/SwapWidget.js.map +1 -1
  39. package/dist/esm/react/web/ui/Bridge/swap-widget/select-chain.js +11 -9
  40. package/dist/esm/react/web/ui/Bridge/swap-widget/select-chain.js.map +1 -1
  41. package/dist/esm/react/web/ui/Bridge/swap-widget/select-token-ui.js +83 -47
  42. package/dist/esm/react/web/ui/Bridge/swap-widget/select-token-ui.js.map +1 -1
  43. package/dist/esm/react/web/ui/Bridge/swap-widget/swap-ui.js +218 -83
  44. package/dist/esm/react/web/ui/Bridge/swap-widget/swap-ui.js.map +1 -1
  45. package/dist/esm/react/web/ui/Bridge/swap-widget/utils.js +5 -0
  46. package/dist/esm/react/web/ui/Bridge/swap-widget/utils.js.map +1 -1
  47. package/dist/esm/react/web/ui/ConnectWallet/icons/ArrowUpDownIcon.js +2 -2
  48. package/dist/esm/react/web/ui/ConnectWallet/icons/ArrowUpDownIcon.js.map +1 -1
  49. package/dist/esm/react/web/ui/components/buttons.js +5 -2
  50. package/dist/esm/react/web/ui/components/buttons.js.map +1 -1
  51. package/dist/esm/react/web/ui/components/formElements.js +5 -2
  52. package/dist/esm/react/web/ui/components/formElements.js.map +1 -1
  53. package/dist/esm/react/web/ui/hooks/useisMobile.js +16 -0
  54. package/dist/esm/react/web/ui/hooks/useisMobile.js.map +1 -0
  55. package/dist/esm/stories/Bridge/Swap/SelectChain.stories.js +12 -4
  56. package/dist/esm/stories/Bridge/Swap/SelectChain.stories.js.map +1 -1
  57. package/dist/esm/stories/Bridge/Swap/SwapWidget.stories.js +7 -12
  58. package/dist/esm/stories/Bridge/Swap/SwapWidget.stories.js.map +1 -1
  59. package/dist/esm/version.js +1 -1
  60. package/dist/esm/version.js.map +1 -1
  61. package/dist/types/bridge/Token.d.ts +2 -0
  62. package/dist/types/bridge/Token.d.ts.map +1 -1
  63. package/dist/types/bridge/types/Token.d.ts +2 -0
  64. package/dist/types/bridge/types/Token.d.ts.map +1 -1
  65. package/dist/types/react/core/design-system/index.d.ts +1 -0
  66. package/dist/types/react/core/design-system/index.d.ts.map +1 -1
  67. package/dist/types/react/web/ui/Bridge/swap-widget/SearchInput.d.ts.map +1 -1
  68. package/dist/types/react/web/ui/Bridge/swap-widget/SwapWidget.d.ts +4 -0
  69. package/dist/types/react/web/ui/Bridge/swap-widget/SwapWidget.d.ts.map +1 -1
  70. package/dist/types/react/web/ui/Bridge/swap-widget/select-chain.d.ts +1 -0
  71. package/dist/types/react/web/ui/Bridge/swap-widget/select-chain.d.ts.map +1 -1
  72. package/dist/types/react/web/ui/Bridge/swap-widget/select-token-ui.d.ts.map +1 -1
  73. package/dist/types/react/web/ui/Bridge/swap-widget/swap-ui.d.ts +2 -1
  74. package/dist/types/react/web/ui/Bridge/swap-widget/swap-ui.d.ts.map +1 -1
  75. package/dist/types/react/web/ui/Bridge/swap-widget/utils.d.ts +1 -0
  76. package/dist/types/react/web/ui/Bridge/swap-widget/utils.d.ts.map +1 -1
  77. package/dist/types/react/web/ui/components/basic.d.ts +1 -1
  78. package/dist/types/react/web/ui/components/basic.d.ts.map +1 -1
  79. package/dist/types/react/web/ui/components/buttons.d.ts +1 -0
  80. package/dist/types/react/web/ui/components/buttons.d.ts.map +1 -1
  81. package/dist/types/react/web/ui/components/formElements.d.ts.map +1 -1
  82. package/dist/types/react/web/ui/hooks/useisMobile.d.ts +2 -0
  83. package/dist/types/react/web/ui/hooks/useisMobile.d.ts.map +1 -0
  84. package/dist/types/stories/Bridge/Swap/SelectChain.stories.d.ts +4 -2
  85. package/dist/types/stories/Bridge/Swap/SelectChain.stories.d.ts.map +1 -1
  86. package/dist/types/stories/Bridge/Swap/SwapWidget.stories.d.ts.map +1 -1
  87. package/dist/types/version.d.ts +1 -1
  88. package/dist/types/version.d.ts.map +1 -1
  89. package/package.json +3 -3
  90. package/src/bridge/Token.ts +6 -0
  91. package/src/bridge/types/Token.ts +2 -0
  92. package/src/react/core/design-system/index.ts +1 -0
  93. package/src/react/web/ui/Bridge/swap-widget/SearchInput.tsx +1 -0
  94. package/src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx +61 -45
  95. package/src/react/web/ui/Bridge/swap-widget/select-chain.tsx +25 -12
  96. package/src/react/web/ui/Bridge/swap-widget/select-token-ui.tsx +302 -197
  97. package/src/react/web/ui/Bridge/swap-widget/swap-ui.tsx +496 -233
  98. package/src/react/web/ui/Bridge/swap-widget/utils.ts +6 -0
  99. package/src/react/web/ui/ConnectWallet/icons/ArrowUpDownIcon.tsx +10 -10
  100. package/src/react/web/ui/components/basic.tsx +1 -1
  101. package/src/react/web/ui/components/buttons.tsx +6 -2
  102. package/src/react/web/ui/components/formElements.tsx +5 -1
  103. package/src/react/web/ui/hooks/useisMobile.ts +21 -0
  104. package/src/stories/Bridge/Swap/SelectChain.stories.tsx +40 -2
  105. package/src/stories/Bridge/Swap/SwapWidget.stories.tsx +18 -13
  106. package/src/version.ts +1 -1
  107. package/dist/cjs/react/web/ui/Bridge/swap-widget/common.js +0 -17
  108. package/dist/cjs/react/web/ui/Bridge/swap-widget/common.js.map +0 -1
  109. package/dist/esm/react/web/ui/Bridge/swap-widget/common.js +0 -14
  110. package/dist/esm/react/web/ui/Bridge/swap-widget/common.js.map +0 -1
  111. package/dist/types/react/web/ui/Bridge/swap-widget/common.d.ts +0 -9
  112. package/dist/types/react/web/ui/Bridge/swap-widget/common.d.ts.map +0 -1
  113. package/src/react/web/ui/Bridge/swap-widget/common.tsx +0 -35
@@ -162,6 +162,10 @@ export type SwapWidgetProps = {
162
162
  * @default true
163
163
  */
164
164
  persistTokenSelections?: boolean;
165
+ /**
166
+ * Called when the user disconnects the active wallet
167
+ */
168
+ onDisconnect?: () => void;
165
169
  };
166
170
 
167
171
  /**
@@ -325,46 +329,11 @@ function SwapWidgetContent(props: SwapWidgetProps) {
325
329
  });
326
330
 
327
331
  const [buyToken, setBuyToken] = useState<TokenSelection | undefined>(() => {
328
- if (props.prefill?.buyToken) {
329
- return {
330
- tokenAddress:
331
- props.prefill.buyToken.tokenAddress ||
332
- getAddress(NATIVE_TOKEN_ADDRESS),
333
- chainId: props.prefill.buyToken.chainId,
334
- };
335
- }
336
-
337
- if (!isPersistEnabled) {
338
- return undefined;
339
- }
340
-
341
- const lastUsedBuyToken = getLastUsedTokens()?.buyToken;
342
-
343
- // the token that will be set as initial value of sell token
344
- const sellToken = getInitialSellToken(
345
- props.prefill,
346
- getLastUsedTokens()?.sellToken,
347
- );
348
-
349
- // if both tokens are same, ignore "buyToken", keep "sellToken"
350
- if (
351
- lastUsedBuyToken &&
352
- sellToken &&
353
- lastUsedBuyToken.tokenAddress.toLowerCase() ===
354
- sellToken.tokenAddress.toLowerCase() &&
355
- lastUsedBuyToken.chainId === sellToken.chainId
356
- ) {
357
- return undefined;
358
- }
359
-
360
- return lastUsedBuyToken;
332
+ return getInitialTokens(props.prefill, isPersistEnabled).buyToken;
361
333
  });
362
334
 
363
335
  const [sellToken, setSellToken] = useState<TokenSelection | undefined>(() => {
364
- return getInitialSellToken(
365
- props.prefill,
366
- isPersistEnabled ? getLastUsedTokens()?.sellToken : undefined,
367
- );
336
+ return getInitialTokens(props.prefill, isPersistEnabled).sellToken;
368
337
  });
369
338
 
370
339
  // persist selections to localStorage whenever they change
@@ -394,6 +363,7 @@ function SwapWidgetContent(props: SwapWidgetProps) {
394
363
  if (screen.id === "1:swap-ui" || !activeWalletInfo) {
395
364
  return (
396
365
  <SwapUI
366
+ onDisconnect={props.onDisconnect}
397
367
  showThirdwebBranding={
398
368
  props.showThirdwebBranding === undefined
399
369
  ? true
@@ -533,17 +503,63 @@ function SwapWidgetContent(props: SwapWidgetProps) {
533
503
  return null;
534
504
  }
535
505
 
536
- function getInitialSellToken(
506
+ function getInitialTokens(
537
507
  prefill: SwapWidgetProps["prefill"],
538
- lastUsedSellToken: TokenSelection | undefined,
539
- ) {
540
- if (prefill?.sellToken) {
508
+ isPersistEnabled: boolean,
509
+ ): {
510
+ buyToken: TokenSelection | undefined;
511
+ sellToken: TokenSelection | undefined;
512
+ } {
513
+ const lastUsedTokens = isPersistEnabled ? getLastUsedTokens() : undefined;
514
+ const buyToken = prefill?.buyToken
515
+ ? {
516
+ tokenAddress:
517
+ prefill.buyToken.tokenAddress || getAddress(NATIVE_TOKEN_ADDRESS),
518
+ chainId: prefill.buyToken.chainId,
519
+ }
520
+ : lastUsedTokens?.buyToken;
521
+
522
+ const sellToken = prefill?.sellToken
523
+ ? {
524
+ tokenAddress:
525
+ prefill.sellToken.tokenAddress || getAddress(NATIVE_TOKEN_ADDRESS),
526
+ chainId: prefill.sellToken.chainId,
527
+ }
528
+ : lastUsedTokens?.sellToken;
529
+
530
+ // if both tokens are same
531
+ if (
532
+ buyToken &&
533
+ sellToken &&
534
+ buyToken.tokenAddress?.toLowerCase() ===
535
+ sellToken.tokenAddress?.toLowerCase() &&
536
+ buyToken.chainId === sellToken.chainId
537
+ ) {
538
+ // if sell token prefill is specified, ignore buy token
539
+ if (prefill?.sellToken) {
540
+ return {
541
+ buyToken: undefined,
542
+ sellToken: sellToken,
543
+ };
544
+ }
545
+
546
+ // if buy token prefill is specified, ignore sell token
547
+ if (prefill?.buyToken) {
548
+ return {
549
+ buyToken: buyToken,
550
+ sellToken: undefined,
551
+ };
552
+ }
553
+
554
+ // if none of the two are specified via prefill, keep buy token
541
555
  return {
542
- tokenAddress:
543
- prefill.sellToken.tokenAddress || getAddress(NATIVE_TOKEN_ADDRESS),
544
- chainId: prefill.sellToken.chainId,
556
+ buyToken: buyToken,
557
+ sellToken: undefined,
545
558
  };
546
559
  }
547
560
 
548
- return lastUsedSellToken;
561
+ return {
562
+ buyToken: buyToken,
563
+ sellToken: sellToken,
564
+ };
549
565
  }
@@ -4,6 +4,7 @@ import type { ThirdwebClient } from "../../../../../client/client.js";
4
4
  import {
5
5
  fontSize,
6
6
  iconSize,
7
+ radius,
7
8
  spacing,
8
9
  } from "../../../../core/design-system/index.js";
9
10
  import { Container, Line, ModalHeader } from "../../components/basic.js";
@@ -21,6 +22,7 @@ type SelectBuyTokenProps = {
21
22
  client: ThirdwebClient;
22
23
  onSelectChain: (chain: BridgeChain) => void;
23
24
  selectedChain: BridgeChain | undefined;
25
+ isMobile: boolean;
24
26
  };
25
27
 
26
28
  /**
@@ -56,11 +58,15 @@ export function SelectBridgeChainUI(
56
58
  });
57
59
 
58
60
  return (
59
- <div>
60
- <Container px="md" py="md+">
61
- <ModalHeader onBack={props.onBack} title="Select Chain" />
62
- </Container>
63
- <Line />
61
+ <Container fullHeight flex="column">
62
+ {props.isMobile && (
63
+ <>
64
+ <Container px="md" py="md+">
65
+ <ModalHeader onBack={props.onBack} title="Select Chain" />
66
+ </Container>
67
+ <Line />
68
+ </>
69
+ )}
64
70
 
65
71
  <Spacer y="md" />
66
72
 
@@ -79,10 +85,12 @@ export function SelectBridgeChainUI(
79
85
  <Spacer y="sm" />
80
86
 
81
87
  <Container
88
+ expand
82
89
  px="md"
90
+ gap={props.isMobile ? undefined : "xxs"}
83
91
  flex="column"
84
92
  style={{
85
- height: "400px",
93
+ maxHeight: props.isMobile ? "400px" : "none",
86
94
  overflowY: "auto",
87
95
  scrollbarWidth: "none",
88
96
  paddingBottom: spacing.md,
@@ -95,6 +103,7 @@ export function SelectBridgeChainUI(
95
103
  client={props.client}
96
104
  onClick={() => props.onSelectChain(chain)}
97
105
  isSelected={chain.chainId === props.selectedChain?.chainId}
106
+ isMobile={props.isMobile}
98
107
  />
99
108
  ))}
100
109
 
@@ -119,7 +128,7 @@ export function SelectBridgeChainUI(
119
128
  </div>
120
129
  )}
121
130
  </Container>
122
- </div>
131
+ </Container>
123
132
  );
124
133
  }
125
134
 
@@ -144,6 +153,7 @@ function ChainButton(props: {
144
153
  client: ThirdwebClient;
145
154
  onClick: () => void;
146
155
  isSelected: boolean;
156
+ isMobile: boolean;
147
157
  }) {
148
158
  return (
149
159
  <Button
@@ -152,18 +162,21 @@ function ChainButton(props: {
152
162
  style={{
153
163
  justifyContent: "flex-start",
154
164
  fontWeight: 500,
155
- fontSize: fontSize.md,
165
+ fontSize: props.isMobile ? fontSize.md : fontSize.sm,
156
166
  border: "1px solid transparent",
157
- padding: `${spacing.sm} ${spacing.sm}`,
167
+ padding: !props.isMobile ? `${spacing.xs} ${spacing.xs}` : undefined,
158
168
  }}
159
- gap="sm"
160
169
  onClick={props.onClick}
170
+ gap="sm"
161
171
  >
162
172
  <Img
163
173
  src={props.chain.icon}
164
174
  client={props.client}
165
- width={iconSize.lg}
166
- height={iconSize.lg}
175
+ width={props.isMobile ? iconSize.lg : iconSize.md}
176
+ height={props.isMobile ? iconSize.lg : iconSize.md}
177
+ style={{
178
+ borderRadius: radius.full,
179
+ }}
167
180
  />
168
181
  {cleanedChainName(props.chain.name)}
169
182
  </Button>