@rango-dev/widget-embedded 0.22.4-next.0 → 0.22.4-next.10

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 (197) hide show
  1. package/dist/QueueManager.d.ts.map +1 -1
  2. package/dist/components/AppRoutes.d.ts.map +1 -1
  3. package/dist/components/BlockchainList/BlockchainList.styles.d.ts +3 -0
  4. package/dist/components/BlockchainList/BlockchainList.styles.d.ts.map +1 -1
  5. package/dist/components/BlockchainsSection/BlockchainsSection.styles.d.ts +1 -0
  6. package/dist/components/BlockchainsSection/BlockchainsSection.styles.d.ts.map +1 -1
  7. package/dist/components/ConfirmWalletsModal/ConfirmWallets.helpers.d.ts +2 -2
  8. package/dist/components/ConfirmWalletsModal/ConfirmWallets.helpers.d.ts.map +1 -1
  9. package/dist/components/ConfirmWalletsModal/ConfirmWallets.styles.d.ts +15 -0
  10. package/dist/components/ConfirmWalletsModal/ConfirmWallets.styles.d.ts.map +1 -1
  11. package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.d.ts.map +1 -1
  12. package/dist/components/ConfirmWalletsModal/WalletList.d.ts.map +1 -1
  13. package/dist/components/ConfirmWalletsModal/WalletList.styles.d.ts +3 -0
  14. package/dist/components/ConfirmWalletsModal/WalletList.styles.d.ts.map +1 -1
  15. package/dist/components/CustomCollapsible/CustomCollapsible.styles.d.ts +4 -0
  16. package/dist/components/CustomCollapsible/CustomCollapsible.styles.d.ts.map +1 -1
  17. package/dist/components/HeaderButtons/HeaderButtons.d.ts +4 -0
  18. package/dist/components/HeaderButtons/HeaderButtons.d.ts.map +1 -0
  19. package/dist/components/HeaderButtons/HeaderButtons.styles.d.ts +5 -0
  20. package/dist/components/HeaderButtons/HeaderButtons.styles.d.ts.map +1 -1
  21. package/dist/components/HeaderButtons/HeaderButtons.types.d.ts +3 -2
  22. package/dist/components/HeaderButtons/HeaderButtons.types.d.ts.map +1 -1
  23. package/dist/components/HeaderButtons/index.d.ts +1 -1
  24. package/dist/components/HeaderButtons/index.d.ts.map +1 -1
  25. package/dist/components/HistoryGroupedList/HistoryGroupedList.styles.d.ts +6 -0
  26. package/dist/components/HistoryGroupedList/HistoryGroupedList.styles.d.ts.map +1 -1
  27. package/dist/components/Layout/Layout.d.ts.map +1 -1
  28. package/dist/components/Layout/Layout.styles.d.ts +3 -0
  29. package/dist/components/Layout/Layout.styles.d.ts.map +1 -1
  30. package/dist/components/Layout/Layout.types.d.ts +1 -0
  31. package/dist/components/Layout/Layout.types.d.ts.map +1 -1
  32. package/dist/components/Layout/PageContainer.d.ts +1 -0
  33. package/dist/components/Layout/PageContainer.d.ts.map +1 -1
  34. package/dist/components/Layout/ScrollableArea.d.ts +1 -0
  35. package/dist/components/Layout/ScrollableArea.d.ts.map +1 -1
  36. package/dist/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.d.ts +1 -0
  37. package/dist/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.d.ts.map +1 -1
  38. package/dist/components/LoadingSwapDetails/LoadingSwapDetails.styles.d.ts +14 -0
  39. package/dist/components/LoadingSwapDetails/LoadingSwapDetails.styles.d.ts.map +1 -1
  40. package/dist/components/NoResult/NoResult.styles.d.ts +3 -0
  41. package/dist/components/NoResult/NoResult.styles.d.ts.map +1 -1
  42. package/dist/components/NotificationContent/NotificationContent.styles.d.ts +4 -0
  43. package/dist/components/NotificationContent/NotificationContent.styles.d.ts.map +1 -1
  44. package/dist/components/Quote/Quote.d.ts.map +1 -1
  45. package/dist/components/Quote/Quote.styles.d.ts +1136 -25
  46. package/dist/components/Quote/Quote.styles.d.ts.map +1 -1
  47. package/dist/components/Quote/Quote.types.d.ts +12 -7
  48. package/dist/components/Quote/Quote.types.d.ts.map +1 -1
  49. package/dist/components/Quote/QuoteCostDetails.d.ts.map +1 -1
  50. package/dist/components/Quote/QuoteCostDetails.styles.d.ts +5 -0
  51. package/dist/components/Quote/QuoteCostDetails.styles.d.ts.map +1 -1
  52. package/dist/components/Quote/QuoteSummary.styles.d.ts +2 -0
  53. package/dist/components/Quote/QuoteSummary.styles.d.ts.map +1 -1
  54. package/dist/components/Quote/QuoteTrigger .d.ts.map +1 -1
  55. package/dist/components/QuoteSkeleton/QuoteSkeleton.styles.d.ts +4 -0
  56. package/dist/components/QuoteSkeleton/QuoteSkeleton.styles.d.ts.map +1 -1
  57. package/dist/components/QuoteSkeleton/QuoteSkeleton.types.d.ts +1 -1
  58. package/dist/components/QuoteSkeleton/QuoteSkeleton.types.d.ts.map +1 -1
  59. package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.d.ts.map +1 -1
  60. package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.styles.d.ts +20 -10
  61. package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.styles.d.ts.map +1 -1
  62. package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.types.d.ts +1 -1
  63. package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.types.d.ts.map +1 -1
  64. package/dist/components/QuoteSkeleton/StepSkeleton.styles.d.ts +5 -0
  65. package/dist/components/QuoteSkeleton/StepSkeleton.styles.d.ts.map +1 -1
  66. package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.d.ts +4 -0
  67. package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.d.ts.map +1 -1
  68. package/dist/components/SearchInput/SearchInput.styles.d.ts +1 -0
  69. package/dist/components/SearchInput/SearchInput.styles.d.ts.map +1 -1
  70. package/dist/components/SettingsContainer/SettingsContainer.style.d.ts +3 -0
  71. package/dist/components/SettingsContainer/SettingsContainer.style.d.ts.map +1 -1
  72. package/dist/components/Slippage/Slippage.styles.d.ts +5 -0
  73. package/dist/components/Slippage/Slippage.styles.d.ts.map +1 -1
  74. package/dist/components/SwapDetails/SwapDetails.styles.d.ts +13 -0
  75. package/dist/components/SwapDetails/SwapDetails.styles.d.ts.map +1 -1
  76. package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.styles.d.ts +1 -0
  77. package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.styles.d.ts.map +1 -1
  78. package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.types.d.ts +2 -1
  79. package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.types.d.ts.map +1 -1
  80. package/dist/components/SwapDetailsModal/SwapDetailsModal.styles.d.ts +1 -0
  81. package/dist/components/SwapDetailsModal/SwapDetailsModal.styles.d.ts.map +1 -1
  82. package/dist/components/SwapDetailsModal/index.d.ts +1 -1
  83. package/dist/components/SwapDetailsModal/index.d.ts.map +1 -1
  84. package/dist/components/TokenList/TokenList.styles.d.ts +17 -0
  85. package/dist/components/TokenList/TokenList.styles.d.ts.map +1 -1
  86. package/dist/components/WalletModal/WalletModalContent.styles.d.ts +4 -0
  87. package/dist/components/WalletModal/WalletModalContent.styles.d.ts.map +1 -1
  88. package/dist/constants/languages.d.ts.map +1 -1
  89. package/dist/constants/navigationRoutes.d.ts +1 -0
  90. package/dist/constants/navigationRoutes.d.ts.map +1 -1
  91. package/dist/constants/quote.d.ts +5 -1
  92. package/dist/constants/quote.d.ts.map +1 -1
  93. package/dist/containers/App/App.styles.d.ts +1 -0
  94. package/dist/containers/App/App.styles.d.ts.map +1 -1
  95. package/dist/containers/QuoteInfo/QuoteInfo.d.ts.map +1 -1
  96. package/dist/containers/QuoteInfo/QuoteInfo.styles.d.ts +3 -0
  97. package/dist/containers/QuoteInfo/QuoteInfo.styles.d.ts.map +1 -1
  98. package/dist/containers/QuoteInfo/QuoteInfo.types.d.ts +6 -3
  99. package/dist/containers/QuoteInfo/QuoteInfo.types.d.ts.map +1 -1
  100. package/dist/containers/Wallets/Wallets.d.ts.map +1 -1
  101. package/dist/hooks/useConfirmSwap/useConfirmSwap.d.ts.map +1 -1
  102. package/dist/hooks/useConfirmSwap/useConfirmSwap.helpers.d.ts +5 -4
  103. package/dist/hooks/useConfirmSwap/useConfirmSwap.helpers.d.ts.map +1 -1
  104. package/dist/hooks/useConfirmSwap/useConfirmSwap.types.d.ts +1 -1
  105. package/dist/hooks/useConfirmSwap/useConfirmSwap.types.d.ts.map +1 -1
  106. package/dist/hooks/useFetch.d.ts +12 -0
  107. package/dist/hooks/useFetch.d.ts.map +1 -0
  108. package/dist/hooks/useFetchAllQuotes.d.ts +4 -0
  109. package/dist/hooks/useFetchAllQuotes.d.ts.map +1 -0
  110. package/dist/hooks/useFetchConfirmQuote.d.ts +4 -0
  111. package/dist/hooks/useFetchConfirmQuote.d.ts.map +1 -0
  112. package/dist/hooks/useSwapInput.d.ts +5 -5
  113. package/dist/hooks/useSwapInput.d.ts.map +1 -1
  114. package/dist/hooks/useWalletList.d.ts +1 -0
  115. package/dist/hooks/useWalletList.d.ts.map +1 -1
  116. package/dist/index.js +2 -2
  117. package/dist/index.js.map +4 -4
  118. package/dist/pages/ConfirmSwapPage.d.ts.map +1 -1
  119. package/dist/pages/Home.d.ts.map +1 -1
  120. package/dist/pages/LiquiditySourcePage.d.ts.map +1 -1
  121. package/dist/pages/Routes.d.ts +3 -0
  122. package/dist/pages/Routes.d.ts.map +1 -0
  123. package/dist/pages/SettingsPage.d.ts.map +1 -1
  124. package/dist/pages/WalletsPage.d.ts.map +1 -1
  125. package/dist/store/AppStore.d.ts +2 -2
  126. package/dist/store/app.d.ts +2 -2
  127. package/dist/store/quote.d.ts +32 -10
  128. package/dist/store/quote.d.ts.map +1 -1
  129. package/dist/store/wallets.d.ts +0 -2
  130. package/dist/store/wallets.d.ts.map +1 -1
  131. package/dist/types/quote.d.ts +19 -1
  132. package/dist/types/quote.d.ts.map +1 -1
  133. package/dist/utils/quote.d.ts +12 -9
  134. package/dist/utils/quote.d.ts.map +1 -1
  135. package/dist/utils/settings.d.ts +2 -3
  136. package/dist/utils/settings.d.ts.map +1 -1
  137. package/dist/utils/swap.d.ts +18 -18
  138. package/dist/utils/swap.d.ts.map +1 -1
  139. package/dist/utils/wallets.d.ts +4 -3
  140. package/dist/utils/wallets.d.ts.map +1 -1
  141. package/package.json +10 -10
  142. package/src/QueueManager.tsx +0 -3
  143. package/src/components/AppRoutes.tsx +5 -0
  144. package/src/components/ConfirmWalletsModal/ConfirmWallets.helpers.ts +3 -3
  145. package/src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx +22 -19
  146. package/src/components/ConfirmWalletsModal/WalletList.tsx +24 -18
  147. package/src/components/HeaderButtons/{HomeButtons.tsx → HeaderButtons.tsx} +39 -26
  148. package/src/components/HeaderButtons/HeaderButtons.types.ts +3 -2
  149. package/src/components/HeaderButtons/index.ts +1 -1
  150. package/src/components/Layout/Layout.tsx +13 -1
  151. package/src/components/Layout/Layout.types.ts +1 -0
  152. package/src/components/Quote/Quote.styles.ts +133 -38
  153. package/src/components/Quote/Quote.tsx +77 -18
  154. package/src/components/Quote/Quote.types.ts +13 -7
  155. package/src/components/Quote/QuoteCostDetails.tsx +9 -4
  156. package/src/components/Quote/QuoteTrigger .tsx +7 -3
  157. package/src/components/QuoteSkeleton/QuoteSkeleton.tsx +2 -2
  158. package/src/components/QuoteSkeleton/QuoteSkeleton.types.ts +1 -1
  159. package/src/components/QuoteSkeleton/QuoteSummarySkeleton.styles.ts +10 -12
  160. package/src/components/QuoteSkeleton/QuoteSummarySkeleton.tsx +28 -9
  161. package/src/components/QuoteSkeleton/QuoteSummarySkeleton.types.ts +1 -1
  162. package/src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.ts +19 -19
  163. package/src/components/SwapDetails/SwapDetails.tsx +1 -1
  164. package/src/components/SwapDetailsAlerts/SwapDetailsAlerts.types.ts +1 -1
  165. package/src/components/SwapDetailsModal/index.ts +1 -1
  166. package/src/constants/languages.ts +2 -1
  167. package/src/constants/navigationRoutes.ts +1 -0
  168. package/src/constants/quote.ts +17 -1
  169. package/src/containers/QuoteInfo/QuoteInfo.tsx +32 -7
  170. package/src/containers/QuoteInfo/QuoteInfo.types.ts +6 -3
  171. package/src/containers/Wallets/Wallets.tsx +5 -11
  172. package/src/hooks/useConfirmSwap/useConfirmSwap.helpers.ts +36 -20
  173. package/src/hooks/useConfirmSwap/useConfirmSwap.ts +76 -78
  174. package/src/hooks/useConfirmSwap/useConfirmSwap.types.ts +1 -1
  175. package/src/hooks/useFetch.ts +48 -0
  176. package/src/hooks/useFetchAllQuotes.ts +21 -0
  177. package/src/hooks/useFetchConfirmQuote.ts +21 -0
  178. package/src/hooks/useSwapInput.ts +59 -31
  179. package/src/hooks/useWalletList.ts +5 -3
  180. package/src/pages/ConfirmSwapPage.tsx +12 -9
  181. package/src/pages/Home.tsx +25 -15
  182. package/src/pages/LiquiditySourcePage.tsx +3 -5
  183. package/src/pages/Routes.tsx +131 -0
  184. package/src/pages/SettingsPage.tsx +11 -13
  185. package/src/pages/WalletsPage.tsx +24 -18
  186. package/src/store/quote.ts +60 -22
  187. package/src/store/wallets.ts +0 -2
  188. package/src/types/quote.ts +27 -1
  189. package/src/utils/quote.ts +129 -67
  190. package/src/utils/settings.ts +2 -4
  191. package/src/utils/swap.ts +37 -77
  192. package/src/utils/wallets.ts +14 -9
  193. package/dist/components/HeaderButtons/HomeButtons.d.ts +0 -4
  194. package/dist/components/HeaderButtons/HomeButtons.d.ts.map +0 -1
  195. package/dist/hooks/useFetchQuote.d.ts +0 -9
  196. package/dist/hooks/useFetchQuote.d.ts.map +0 -1
  197. package/src/hooks/useFetchQuote.ts +0 -38
@@ -9,12 +9,13 @@ import {
9
9
  type WalletType,
10
10
  WalletTypes,
11
11
  } from '@rango-dev/wallets-shared';
12
- import { useEffect, useState } from 'react';
12
+ import { useCallback, useEffect, useState } from 'react';
13
13
 
14
14
  import { useAppStore } from '../store/AppStore';
15
15
  import { useWalletsStore } from '../store/wallets';
16
16
  import { configWalletsToWalletName } from '../utils/providers';
17
17
  import {
18
+ hashWalletsState,
18
19
  isExperimentalChain,
19
20
  mapWalletTypesToWalletInfo,
20
21
  sortWalletsBasedOnConnectionState,
@@ -87,14 +88,14 @@ export function useWalletList(params: Params) {
87
88
  }
88
89
  };
89
90
 
90
- const disconnectConnectingWallets = () => {
91
+ const disconnectConnectingWallets = useCallback(() => {
91
92
  const connectingWallets =
92
93
  wallets?.filter((wallet) => wallet.state === WalletState.CONNECTING) ||
93
94
  [];
94
95
  for (const wallet of connectingWallets) {
95
96
  void disconnect(wallet.type);
96
97
  }
97
- };
98
+ }, [hashWalletsState(wallets)]);
98
99
 
99
100
  useEffect(() => {
100
101
  return () => {
@@ -141,5 +142,6 @@ export function useWalletList(params: Params) {
141
142
  ),
142
143
  error,
143
144
  handleClick,
145
+ disconnectConnectingWallets,
144
146
  };
145
147
  }
@@ -72,7 +72,7 @@ const descriptionStyles = css({
72
72
  export function ConfirmSwapPage() {
73
73
  //TODO: move component's logics to a custom hook
74
74
  const {
75
- quote,
75
+ selectedQuote,
76
76
  setInputAmount,
77
77
  selectedWallets,
78
78
  quoteWalletsConfirmed,
@@ -102,7 +102,6 @@ export function ConfirmSwapPage() {
102
102
  error: null,
103
103
  warnings: null,
104
104
  });
105
-
106
105
  const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);
107
106
 
108
107
  const onConfirmSwap: ConfirmSwap['fetch'] = async ({
@@ -110,6 +109,7 @@ export function ConfirmSwapPage() {
110
109
  customDestination,
111
110
  }) => {
112
111
  const result = await confirmSwap?.({ selectedWallets, customDestination });
112
+
113
113
  setConfirmSwapResult(result);
114
114
  return result;
115
115
  };
@@ -212,12 +212,12 @@ export function ConfirmSwapPage() {
212
212
  let quoteWalletsChanged = false;
213
213
 
214
214
  if (quoteChanged) {
215
- let requiredWallets = getRequiredWallets(quote);
215
+ let requiredWallets = getRequiredWallets(selectedQuote?.swaps || null);
216
216
 
217
217
  const lastStepToBlockchain =
218
- quote?.result?.swaps[quote.result.swaps.length - 1].to.blockchain;
218
+ selectedQuote?.swaps[selectedQuote.swaps.length - 1].to.blockchain;
219
219
 
220
- const isLastWalletRequired = !!quote?.result?.swaps.find(
220
+ const isLastWalletRequired = !!selectedQuote?.swaps.find(
221
221
  (swap) => swap.from.blockchain === lastStepToBlockchain
222
222
  );
223
223
 
@@ -240,7 +240,7 @@ export function ConfirmSwapPage() {
240
240
  }
241
241
  }
242
242
 
243
- if (quote && (selectedWalletDisconnected || quoteWalletsChanged)) {
243
+ if (selectedQuote && (selectedWalletDisconnected || quoteWalletsChanged)) {
244
244
  queueMicrotask(() => flushSync(setShowWallets.bind(null, true)));
245
245
  setQuoteWalletConfirmed(false);
246
246
  }
@@ -251,7 +251,7 @@ export function ConfirmSwapPage() {
251
251
  ]);
252
252
 
253
253
  useLayoutEffect(() => {
254
- if (!quote) {
254
+ if (!selectedQuote) {
255
255
  navigate(`../${location.search}`);
256
256
  }
257
257
  }, []);
@@ -277,6 +277,7 @@ export function ConfirmSwapPage() {
277
277
  }
278
278
 
279
279
  if (quoteWarning || quoteError) {
280
+ const settings_url = `../${navigationRoutes.settings}`;
280
281
  alerts.push(
281
282
  <QuoteWarningsAndErrors
282
283
  warning={quoteWarning}
@@ -291,7 +292,7 @@ export function ConfirmSwapPage() {
291
292
  setShowQuoteWarningModal(false);
292
293
  await addNewSwap();
293
294
  }}
294
- onChangeSettings={() => navigate(navigationRoutes.settings)}
295
+ onChangeSettings={() => navigate(settings_url)}
295
296
  />
296
297
  );
297
298
  }
@@ -375,9 +376,11 @@ export function ConfirmSwapPage() {
375
376
  {alerts.length > 0 ? <Divider size={10} /> : null}
376
377
 
377
378
  <QuoteInfo
378
- quote={quote}
379
+ quote={selectedQuote}
379
380
  type="swap-preview"
380
381
  expanded={true}
382
+ selected
383
+ tagHidden
381
384
  error={confirmSwapResult.error}
382
385
  loading={fetchingConfirmationQuote}
383
386
  warning={confirmSwapResult.warnings?.quote ?? null}
@@ -3,7 +3,7 @@ import { Button, Divider, styled, SwapInput, WarningIcon } from '@rango-dev/ui';
3
3
  import React, { useEffect, useState } from 'react';
4
4
  import { useNavigate } from 'react-router-dom';
5
5
 
6
- import { HomeButtons } from '../components/HeaderButtons';
6
+ import { HeaderButtons } from '../components/HeaderButtons';
7
7
  import { Layout, PageContainer } from '../components/Layout';
8
8
  import { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';
9
9
  import { SwitchFromAndToButton } from '../components/SwitchFromAndTo';
@@ -41,12 +41,6 @@ const InputsContainer = styled('div', {
41
41
  });
42
42
  export function Home() {
43
43
  const navigate = useNavigate();
44
- const {
45
- fetch: fetchQuote,
46
- loading,
47
- error: quoteError,
48
- warning: quoteWarning,
49
- } = useSwapInput();
50
44
  const {
51
45
  fromToken,
52
46
  fromBlockchain,
@@ -57,10 +51,16 @@ export function Home() {
57
51
  inputUsdValue,
58
52
  outputAmount,
59
53
  outputUsdValue,
60
- quote,
54
+ selectedQuote,
55
+ refetchQuote,
56
+ error: quoteError,
57
+ warning: quoteWarning,
58
+ quotes,
61
59
  resetQuoteWallets,
62
60
  setQuoteWarningsConfirmed,
61
+ updateQuotePartialState,
63
62
  } = useQuoteStore();
63
+ const { fetch: fetchQuote, loading } = useSwapInput({ refetchQuote });
64
64
 
65
65
  const { config, fetchStatus: fetchMetaStatus } = useAppStore();
66
66
 
@@ -74,13 +74,13 @@ export function Home() {
74
74
  const needsToWarnEthOnPath = false;
75
75
 
76
76
  const priceImpactInputCanNotBeComputed = !canComputePriceImpact(
77
- quote,
77
+ selectedQuote,
78
78
  inputAmount,
79
79
  inputUsdValue
80
80
  );
81
81
 
82
82
  const priceImpactOutputCanNotBeComputed = !canComputePriceImpact(
83
- quote,
83
+ selectedQuote,
84
84
  inputAmount,
85
85
  outputUsdValue
86
86
  );
@@ -89,7 +89,7 @@ export function Home() {
89
89
  fetchMetaStatus,
90
90
  fetchingQuote: loading,
91
91
  inputAmount,
92
- quote,
92
+ quote: selectedQuote,
93
93
  anyWalletConnected: connectedWallets.length > 0,
94
94
  error: quoteError,
95
95
  warning: quoteWarning,
@@ -115,6 +115,7 @@ export function Home() {
115
115
 
116
116
  useEffect(() => {
117
117
  resetQuoteWallets();
118
+ updateQuotePartialState('refetchQuote', true);
118
119
  }, []);
119
120
 
120
121
  const percentageChange =
@@ -153,9 +154,9 @@ export function Home() {
153
154
  hasBackButton: false,
154
155
  title: config.title || i18n.t('Swap'),
155
156
  suffix: (
156
- <HomeButtons
157
+ <HeaderButtons
157
158
  onClickRefresh={
158
- (!!quote || quoteError) && !showQuoteWarningModal
159
+ (!!selectedQuote || quoteError) && !showQuoteWarningModal
159
160
  ? fetchQuote
160
161
  : undefined
161
162
  }
@@ -210,7 +211,7 @@ export function Home() {
210
211
  <SwitchFromAndToButton />
211
212
  </FromContainer>
212
213
  <SwapInput
213
- sharpBottomStyle={!!quote?.result || fetchingQuote}
214
+ sharpBottomStyle={!!selectedQuote || fetchingQuote}
214
215
  label={i18n.t('To')}
215
216
  mode="To"
216
217
  fetchingQuote={fetchingQuote}
@@ -257,11 +258,20 @@ export function Home() {
257
258
  </InputsContainer>
258
259
  <Divider size="2" />
259
260
  <QuoteInfo
260
- quote={quote}
261
+ quote={selectedQuote}
261
262
  loading={fetchingQuote}
262
263
  error={quoteError}
264
+ tagHidden={false}
263
265
  warning={quoteWarning}
264
266
  type="basic"
267
+ onClickAllRoutes={
268
+ !!quotes && quotes.results.length > 1
269
+ ? () => {
270
+ updateQuotePartialState('refetchQuote', false);
271
+ navigate(navigationRoutes.routes);
272
+ }
273
+ : undefined
274
+ }
265
275
  />
266
276
  {quoteWarning || quoteError ? (
267
277
  <>
@@ -1,7 +1,5 @@
1
- import type {
2
- LiquiditySourceType,
3
- UniqueSwappersGroupType,
4
- } from '../utils/settings';
1
+ import type { UniqueSwappersGroupType } from '../utils/settings';
2
+ import type { SwapperType } from 'rango-sdk';
5
3
 
6
4
  import { i18n } from '@lingui/core';
7
5
  import {
@@ -41,7 +39,7 @@ export function LiquiditySourcePage({ sourceType }: PropTypes) {
41
39
  getUniqueSwappersGroups(swappers, disabledLiquiditySources);
42
40
 
43
41
  const types = { Exchanges: i18n.t('Exchanges'), Bridges: i18n.t('Bridges') };
44
- const validTypes: Array<LiquiditySourceType> = [];
42
+ const validTypes: Array<SwapperType> = [];
45
43
  if (sourceType === 'Exchanges') {
46
44
  validTypes.push('DEX');
47
45
  }
@@ -0,0 +1,131 @@
1
+ import type { SelectedQuote } from '../types';
2
+ import type { MultiRouteSimulationResult } from 'rango-sdk';
3
+
4
+ import { i18n } from '@lingui/core';
5
+ import { Divider } from '@rango-dev/ui';
6
+ import React from 'react';
7
+ import { useNavigate } from 'react-router-dom';
8
+
9
+ import { HeaderButtons } from '../components/HeaderButtons';
10
+ import { Layout, PageContainer } from '../components/Layout';
11
+ import { QuoteSkeleton } from '../components/QuoteSkeleton';
12
+ import { navigationRoutes } from '../constants/navigationRoutes';
13
+ import { QuoteInfo } from '../containers/QuoteInfo';
14
+ import { getQuoteError } from '../hooks/useConfirmSwap/useConfirmSwap.helpers';
15
+ import { useNavigateBack } from '../hooks/useNavigateBack';
16
+ import { useSwapInput } from '../hooks/useSwapInput';
17
+ import { useAppStore } from '../store/AppStore';
18
+ import { useQuoteStore } from '../store/quote';
19
+ import { generateQuoteWarnings } from '../utils/quote';
20
+
21
+ const ITEM_SKELETON_COUNT = 3;
22
+ export function RoutesPage() {
23
+ const navigate = useNavigate();
24
+ const navigateBack = useNavigateBack();
25
+
26
+ const {
27
+ selectedQuote,
28
+ quotes,
29
+ refetchQuote,
30
+ setSelectedQuote,
31
+ updateQuotePartialState,
32
+ fromToken,
33
+ toToken,
34
+ error: quoteError,
35
+ } = useQuoteStore();
36
+ const { slippage, customSlippage } = useAppStore();
37
+ const tokens = useAppStore().tokens();
38
+
39
+ const userSlippage = customSlippage ?? slippage;
40
+
41
+ const { fetch: fetchQuote, loading: fetchingQuote } = useSwapInput({
42
+ refetchQuote,
43
+ });
44
+
45
+ const onClickOnQuote = (quote: SelectedQuote) => {
46
+ setSelectedQuote(quote);
47
+ updateQuotePartialState('refetchQuote', false);
48
+ navigateBack();
49
+ };
50
+ const getQuoteWarning = (quote: MultiRouteSimulationResult) => {
51
+ if (!fromToken || !toToken || !quotes) {
52
+ return null;
53
+ }
54
+ const mergedQuote: SelectedQuote = {
55
+ requestAmount: quotes.requestAmount, // Assuming quotes is an array
56
+ ...quote,
57
+ };
58
+
59
+ return generateQuoteWarnings(mergedQuote, {
60
+ fromToken,
61
+ toToken,
62
+ userSlippage,
63
+ tokens,
64
+ });
65
+ };
66
+ const settings_url = `../${navigationRoutes.settings}`;
67
+ const wallets_url = `../${navigationRoutes.wallets}`;
68
+ return (
69
+ <Layout
70
+ header={{
71
+ onWallet: () => {
72
+ navigate(wallets_url);
73
+ },
74
+ onBack: () => {
75
+ updateQuotePartialState('refetchQuote', false);
76
+ },
77
+ title: i18n.t('Routes'),
78
+ suffix: (
79
+ <HeaderButtons
80
+ onClickRefresh={
81
+ !!selectedQuote || quoteError ? fetchQuote : undefined
82
+ }
83
+ hidden={['notifications', 'history']}
84
+ onClickSettings={() => navigate(settings_url)}
85
+ />
86
+ ),
87
+ }}>
88
+ <PageContainer>
89
+ {fetchingQuote
90
+ ? Array.from({ length: ITEM_SKELETON_COUNT }, (_, index) => (
91
+ <React.Fragment key={index}>
92
+ <QuoteSkeleton
93
+ tagHidden={false}
94
+ type="list-item"
95
+ expanded={false}
96
+ />
97
+ <Divider size={16} />
98
+ </React.Fragment>
99
+ ))
100
+ : !!quotes &&
101
+ quotes.results?.map((quote) => {
102
+ const quoteWarning = getQuoteWarning(quote);
103
+ const quoteError = getQuoteError(quote.swaps);
104
+
105
+ return (
106
+ <React.Fragment key={quote.requestId}>
107
+ <QuoteInfo
108
+ selected={selectedQuote?.requestId === quote.requestId}
109
+ tagHidden={false}
110
+ quote={{ ...quote, requestAmount: quotes.requestAmount }}
111
+ loading={fetchingQuote}
112
+ error={quoteError?.options || null}
113
+ warning={quoteWarning}
114
+ onClick={(quote) => {
115
+ updateQuotePartialState('warning', quoteWarning);
116
+ updateQuotePartialState(
117
+ 'error',
118
+ quoteError?.options || null
119
+ );
120
+ onClickOnQuote(quote);
121
+ }}
122
+ type="list-item"
123
+ />
124
+ <Divider size={16} />
125
+ </React.Fragment>
126
+ );
127
+ })}
128
+ </PageContainer>
129
+ </Layout>
130
+ );
131
+ }
@@ -129,18 +129,16 @@ export function SettingsPage() {
129
129
  onClick: () => navigate(navigationRoutes.exchanges),
130
130
  };
131
131
 
132
- /*
133
- * const languageItem = {
134
- * id: 'language-item',
135
- * title: (
136
- * <Typography variant="title" size="xmedium">
137
- * {i18n.t('Language')}
138
- * </Typography>
139
- * ),
140
- * end: <ChevronRightIcon color="gray" />,
141
- * onClick: () => navigate(navigationRoutes.languages),
142
- * };
143
- */
132
+ const languageItem = {
133
+ id: 'language-item',
134
+ title: (
135
+ <Typography variant="title" size="xmedium">
136
+ {i18n.t('Language')}
137
+ </Typography>
138
+ ),
139
+ end: <ChevronRightIcon color="gray" />,
140
+ onClick: () => navigate(navigationRoutes.languages),
141
+ };
144
142
 
145
143
  const themeItem = {
146
144
  id: 'theme-item',
@@ -185,7 +183,7 @@ export function SettingsPage() {
185
183
  const settingItems = isLiquidityHidden ? [] : [bridgeItem, exchangeItem];
186
184
 
187
185
  if (!isLanguageHidden) {
188
- // settingItems.push(languageItem);
186
+ settingItems.push(languageItem);
189
187
  }
190
188
  if (!theme?.singleTheme && !isThemeHidden) {
191
189
  settingItems.push(themeItem);
@@ -35,23 +35,29 @@ export function WalletsPage() {
35
35
  let modalTimerId: ReturnType<typeof setTimeout> | null = null;
36
36
  const isActiveTab = useUiStore.use.isActiveTab();
37
37
 
38
- const { list, handleClick, error } = useWalletList({
39
- config,
40
- onBeforeConnect: (type) => {
41
- modalTimerId = setTimeout(() => {
42
- setOpenModal(true);
43
- setSelectedWalletType(type);
44
- }, TIME_TO_IGNORE_MODAL);
45
- },
46
- onConnect: () => {
47
- if (modalTimerId) {
48
- clearTimeout(modalTimerId);
49
- }
50
- setTimeout(() => {
51
- setOpenModal(false);
52
- }, TIME_TO_CLOSE_MODAL);
53
- },
54
- });
38
+ const { list, handleClick, error, disconnectConnectingWallets } =
39
+ useWalletList({
40
+ config,
41
+ onBeforeConnect: (type) => {
42
+ modalTimerId = setTimeout(() => {
43
+ setOpenModal(true);
44
+ setSelectedWalletType(type);
45
+ }, TIME_TO_IGNORE_MODAL);
46
+ },
47
+ onConnect: () => {
48
+ if (modalTimerId) {
49
+ clearTimeout(modalTimerId);
50
+ }
51
+ setTimeout(() => {
52
+ setOpenModal(false);
53
+ }, TIME_TO_CLOSE_MODAL);
54
+ },
55
+ });
56
+
57
+ const handleCloseWalletModal = () => {
58
+ disconnectConnectingWallets();
59
+ setOpenModal(false);
60
+ };
55
61
 
56
62
  const selectedWallet = list.find(
57
63
  (wallet) => wallet.type === selectedWalletType
@@ -87,7 +93,7 @@ export function WalletsPage() {
87
93
  })}
88
94
  <WalletModal
89
95
  open={!!openModal}
90
- onClose={() => setOpenModal(false)}
96
+ onClose={handleCloseWalletModal}
91
97
  image={selectedWalletImage}
92
98
  state={selectedWalletState}
93
99
  error={error}
@@ -1,8 +1,9 @@
1
- import type { Wallet } from '../types';
1
+ import type { QuoteError, QuoteWarning, SelectedQuote, Wallet } from '../types';
2
2
  import type {
3
- BestRouteResponse,
4
3
  BlockchainMeta,
5
4
  MetaResponse,
5
+ MultiRouteResponse,
6
+ PreferenceType,
6
7
  Token,
7
8
  } from 'rango-sdk';
8
9
  import type { PendingSwap } from 'rango-types';
@@ -30,6 +31,14 @@ export type Meta = Pick<MetaResponse, 'blockchains' | 'tokens'>;
30
31
 
31
32
  export type SetTokenParams = { token: Token; meta: Meta } | { token: null };
32
33
 
34
+ type SomeQuoteState = {
35
+ quotes: MultiRouteResponse | null;
36
+ sortStrategy: PreferenceType;
37
+ refetchQuote: boolean;
38
+ error: QuoteError | null;
39
+ warning: QuoteWarning | null;
40
+ };
41
+
33
42
  export interface QuoteState {
34
43
  fromBlockchain: BlockchainMeta | null;
35
44
  toBlockchain: BlockchainMeta | null;
@@ -38,27 +47,37 @@ export interface QuoteState {
38
47
  outputAmount: BigNumber | null;
39
48
  outputUsdValue: BigNumber | null;
40
49
  fromToken: Token | null;
50
+ sortStrategy: PreferenceType;
41
51
  toToken: Token | null;
42
52
  quoteWalletsConfirmed: boolean;
43
53
  selectedWallets: Wallet[];
44
54
  quoteWarningsConfirmed: boolean;
55
+ refetchQuote: boolean;
56
+ selectedQuote: SelectedQuote | null;
57
+ quotes: MultiRouteResponse | null;
58
+ customDestination: string | null;
59
+ error: QuoteError | null;
60
+ warning: QuoteWarning | null;
45
61
  resetQuote: () => void;
62
+ resetAlerts: () => void;
63
+
46
64
  resetToBlockchain: () => void;
47
65
  resetFromBlockchain: () => void;
48
66
  setFromBlockchain: (chain: BlockchainMeta | null) => void;
49
67
  setToBlockchain: (chian: BlockchainMeta | null) => void;
50
-
51
68
  setFromToken: (params: SetTokenParams) => void;
52
69
  setToToken: (params: SetTokenParams) => void;
70
+ updateQuotePartialState: <K extends keyof SomeQuoteState>(
71
+ key: K,
72
+ value: SomeQuoteState[K]
73
+ ) => void;
53
74
  setInputAmount: (amount: string) => void;
54
- quote: BestRouteResponse | null;
55
- setQuote: (quote: BestRouteResponse | null) => void;
75
+ setSelectedQuote: (quote: SelectedQuote | null) => void;
56
76
  retry: (pendingSwap: PendingSwap, meta: Meta) => void;
57
77
  switchFromAndTo: () => void;
58
78
  setQuoteWalletConfirmed: (flag: boolean) => void;
59
79
  setSelectedWallets: (wallets: Wallet[]) => void;
60
- customDestination: string;
61
- setCustomDestination: (address: string) => void;
80
+ setCustomDestination: (address: string | null) => void;
62
81
  resetQuoteWallets: () => void;
63
82
  setQuoteWarningsConfirmed: (flag: boolean) => void;
64
83
  }
@@ -74,12 +93,22 @@ export const useQuoteStore = createSelectors(
74
93
  outputUsdValue: new BigNumber(0),
75
94
  toBlockchain: null,
76
95
  toToken: null,
77
- quote: null,
96
+ refetchQuote: true,
97
+ sortStrategy: 'SMART',
98
+ selectedQuote: null,
99
+ quotes: null,
100
+ error: null,
101
+ warning: null,
78
102
  quoteWalletsConfirmed: false,
79
103
  selectedWallets: [],
80
- customDestination: '',
104
+ customDestination: null,
81
105
  quoteWarningsConfirmed: false,
82
- setQuote: (quote) =>
106
+ updateQuotePartialState: (key, value) =>
107
+ set((state) => ({
108
+ ...state,
109
+ [key]: value,
110
+ })),
111
+ setSelectedQuote: (quote) =>
83
112
  set((state) => {
84
113
  let outputAmount: BigNumber | null = null;
85
114
  let outputUsdValue: BigNumber = ZERO;
@@ -87,27 +116,36 @@ export const useQuoteStore = createSelectors(
87
116
  return {};
88
117
  }
89
118
  if (!!quote) {
90
- outputAmount = !!quote.result?.outputAmount
91
- ? new BigNumber(quote.result?.outputAmount)
119
+ outputAmount = !!quote?.outputAmount
120
+ ? new BigNumber(quote?.outputAmount)
92
121
  : null;
93
122
  outputUsdValue = calcOutputUsdValue(
94
- quote.result?.outputAmount,
123
+ quote?.outputAmount,
95
124
  getQuoteToTokenUsdPrice(quote) || state.toToken?.usdPrice
96
125
  );
97
126
  }
98
127
  return {
99
- quote: quote,
128
+ selectedQuote: quote,
100
129
  ...(!!quote && {
101
130
  outputAmount,
102
131
  outputUsdValue,
103
132
  }),
104
133
  };
105
134
  }),
135
+ resetAlerts: () =>
136
+ set(() => ({
137
+ error: null,
138
+ warning: null,
139
+ })),
106
140
  resetQuote: () =>
107
141
  set(() => ({
108
- quote: null,
142
+ selectedQuote: null,
109
143
  outputAmount: null,
110
144
  outputUsdValue: new BigNumber(0),
145
+ quotes: null,
146
+ refetchQuote: true,
147
+ error: null,
148
+ warning: null,
111
149
  })),
112
150
  setFromBlockchain: (chain) => {
113
151
  set((state) => {
@@ -118,7 +156,7 @@ export const useQuoteStore = createSelectors(
118
156
  return {
119
157
  fromBlockchain: chain,
120
158
  ...(state.fromToken && {
121
- quote: null,
159
+ selectedQuote: null,
122
160
  fromToken: null,
123
161
  outputAmount: null,
124
162
  outputUsdValue: null,
@@ -149,7 +187,7 @@ export const useQuoteStore = createSelectors(
149
187
  return {
150
188
  toBlockchain: chain,
151
189
  ...(state.toToken && {
152
- quote: null,
190
+ selectedQuote: null,
153
191
  toToken: null,
154
192
  outputAmount: null,
155
193
  outputUsdValue: null,
@@ -174,7 +212,7 @@ export const useQuoteStore = createSelectors(
174
212
  ...(!amount && {
175
213
  outputAmount: new BigNumber(0),
176
214
  outputUsdValue: new BigNumber(0),
177
- quote: null,
215
+ selectedQuote: null,
178
216
  }),
179
217
  ...(!!state.fromToken && {
180
218
  inputUsdValue: getUsdValue(state.fromToken, amount),
@@ -199,7 +237,7 @@ export const useQuoteStore = createSelectors(
199
237
  outputUsdValue: new BigNumber(0),
200
238
  toBlockchain,
201
239
  toToken,
202
- quote: null,
240
+ selectedQuote: null,
203
241
  });
204
242
  },
205
243
  switchFromAndTo: () =>
@@ -220,7 +258,7 @@ export const useQuoteStore = createSelectors(
220
258
  fromBlockchain: null,
221
259
  outputAmount: null,
222
260
  outputUsdValue: null,
223
- quote: null,
261
+ selectedQuote: null,
224
262
  })),
225
263
  resetToBlockchain: () =>
226
264
  set(() => ({
@@ -228,7 +266,7 @@ export const useQuoteStore = createSelectors(
228
266
  toBlockchain: null,
229
267
  outputAmount: null,
230
268
  outputUsdValue: null,
231
- quote: null,
269
+ selectedQuote: null,
232
270
  })),
233
271
  setQuoteWalletConfirmed: (flag) =>
234
272
  set({
@@ -240,7 +278,7 @@ export const useQuoteStore = createSelectors(
240
278
  set({
241
279
  quoteWalletsConfirmed: false,
242
280
  selectedWallets: [],
243
- customDestination: '',
281
+ customDestination: null,
244
282
  }),
245
283
  setQuoteWarningsConfirmed: (flag) =>
246
284
  set({ quoteWarningsConfirmed: flag }),