@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
@@ -1,13 +1,16 @@
1
1
  import type { QuoteProps } from '../../components/Quote/Quote.types';
2
- import type { QuoteError, QuoteWarning } from '../../types';
3
- import type { BestRouteResponse } from 'rango-sdk';
2
+ import type { QuoteError, QuoteWarning, SelectedQuote } from '../../types';
4
3
 
5
4
  export type PropTypes = {
6
- quote: BestRouteResponse | null;
5
+ quote: SelectedQuote | null;
7
6
  type: QuoteProps['type'];
7
+ onClick?: (quote: SelectedQuote) => void;
8
8
  loading: boolean;
9
+ tagHidden?: boolean;
9
10
  error: QuoteError | null;
10
11
  warning: QuoteWarning | null;
11
12
  autoScrollOnExpanding?: boolean;
12
13
  expanded?: boolean;
14
+ onClickAllRoutes?: () => void;
15
+ selected?: boolean;
13
16
  };
@@ -3,15 +3,14 @@ import type {
3
3
  PropTypes,
4
4
  WidgetContextInterface,
5
5
  } from './Wallets.types';
6
- import type { Wallet } from '../../types/wallets';
7
6
  import type { ProvidersOptions } from '../../utils/providers';
8
7
  import type { EventHandler } from '@rango-dev/wallets-react';
9
- import type { Network } from '@rango-dev/wallets-shared';
10
8
  import type { PropsWithChildren } from 'react';
11
9
 
12
10
  import { Events, Provider } from '@rango-dev/wallets-react';
11
+ import { type Network } from '@rango-dev/wallets-shared';
13
12
  import { isEvmBlockchain } from 'rango-sdk';
14
- import React, { createContext, useEffect, useRef, useState } from 'react';
13
+ import React, { createContext, useEffect, useRef } from 'react';
15
14
 
16
15
  import { useWalletProviders } from '../../hooks/useWalletProviders';
17
16
  import { AppStoreProvider, useAppStore } from '../../store/AppStore';
@@ -35,7 +34,6 @@ function Main(props: PropsWithChildren<PropTypes>) {
35
34
  const walletOptions: ProvidersOptions = {
36
35
  walletConnectProjectId: props.config?.walletConnectProjectId,
37
36
  };
38
- const [accounts, setAccounts] = useState<Wallet[]>([]);
39
37
  const { providers } = useWalletProviders(props.config.wallets, walletOptions);
40
38
  const { connectWallet, disconnectWallet } = useWalletsStore();
41
39
  const onConnectWalletHandler = useRef<OnConnectHandler>();
@@ -67,7 +65,9 @@ function Main(props: PropsWithChildren<PropTypes>) {
67
65
  supportedChainNames,
68
66
  meta.isContractWallet
69
67
  );
70
- setAccounts(data);
68
+ if (data.length) {
69
+ connectWallet(data, tokens);
70
+ }
71
71
  } else {
72
72
  disconnectWallet(type);
73
73
  }
@@ -102,12 +102,6 @@ function Main(props: PropsWithChildren<PropTypes>) {
102
102
  };
103
103
  const isActiveTab = useUiStore.use.isActiveTab();
104
104
 
105
- useEffect(() => {
106
- if (accounts.length) {
107
- connectWallet(accounts, tokens);
108
- }
109
- }, [accounts, tokens]);
110
-
111
105
  return (
112
106
  <WidgetContext.Provider
113
107
  // eslint-disable-next-line react/jsx-no-constructed-context-values
@@ -1,6 +1,12 @@
1
1
  import type { ConfirmSwapFetchResult } from './useConfirmSwap.types';
2
- import type { ConfirmSwapWarnings, Wallet } from '../../types';
3
- import type { BestRouteResponse, BlockchainMeta, Token } from 'rango-sdk';
2
+ import type {
3
+ ConfirmSwapWarnings,
4
+ QuoteErrorResponse,
5
+ QuoteResponse,
6
+ SelectedQuote,
7
+ Wallet,
8
+ } from '../../types';
9
+ import type { BlockchainMeta, SwapResult, Token } from 'rango-sdk';
4
10
 
5
11
  import { errorMessages } from '../../constants/errors';
6
12
  import { QuoteErrorType, QuoteUpdateType } from '../../types';
@@ -26,8 +32,8 @@ import {
26
32
  /**
27
33
  * A request can be successful but in body of the response, it can be some case which is considered as failed.
28
34
  */
29
- export function throwErrorIfResponseIsNotValid(response: BestRouteResponse) {
30
- if (!response.result) {
35
+ export function throwErrorIfResponseIsNotValid(response: QuoteResponse) {
36
+ if (!response.swaps) {
31
37
  throw new Error(errorMessages().noResultError.title, {
32
38
  cause: {
33
39
  type: QuoteErrorType.NO_RESULT,
@@ -35,40 +41,49 @@ export function throwErrorIfResponseIsNotValid(response: BestRouteResponse) {
35
41
  },
36
42
  });
37
43
  }
38
- const limitError = hasLimitError(response);
44
+ const quoteError = getQuoteError(response.swaps);
45
+ if (quoteError) {
46
+ throw new Error(quoteError.message, {
47
+ cause: quoteError.options,
48
+ });
49
+ }
50
+ }
51
+
52
+ export function getQuoteError(swaps: SwapResult[]): QuoteErrorResponse | null {
53
+ const limitError = hasLimitError(swaps);
39
54
  if (limitError) {
40
55
  const { swap, recommendation, fromAmountRangeError } =
41
- getLimitErrorMessage(response);
42
-
43
- throw new Error('bridge limit error', {
44
- cause: {
56
+ getLimitErrorMessage(swaps);
57
+ return {
58
+ message: 'bridge limit error',
59
+ options: {
45
60
  type: QuoteErrorType.BRIDGE_LIMIT,
46
- swap: swap,
61
+ swap,
47
62
  recommendation,
48
63
  fromAmountRangeError,
49
64
  },
50
- });
65
+ };
51
66
  }
52
67
 
53
- const recommendedSlippages = checkSlippageErrors(response);
68
+ const recommendedSlippages = checkSlippageErrors(swaps);
54
69
 
55
70
  if (recommendedSlippages) {
56
- const minRequiredSlippage = getMinRequiredSlippage(response);
57
- throw new Error('', {
58
- cause: {
71
+ const minRequiredSlippage = getMinRequiredSlippage(swaps);
72
+ return {
73
+ message: '',
74
+ options: {
59
75
  type: QuoteErrorType.INSUFFICIENT_SLIPPAGE,
60
76
  recommendedSlippages,
61
77
  minRequiredSlippage,
62
78
  },
63
- });
79
+ };
64
80
  }
65
-
66
- return response;
81
+ return null;
67
82
  }
68
83
 
69
84
  export function generateWarnings(
70
- previousQuote: BestRouteResponse | undefined,
71
- currentQuote: BestRouteResponse,
85
+ previousQuote: SelectedQuote | undefined,
86
+ currentQuote: SelectedQuote,
72
87
  params: {
73
88
  fromToken: Token;
74
89
  toToken: Token;
@@ -132,6 +147,7 @@ export function generateWarnings(
132
147
  params.selectedWallets,
133
148
  params.meta.blockchains
134
149
  );
150
+
135
151
  const enoughBalance = balanceWarnings.length === 0;
136
152
 
137
153
  if (!enoughBalance) {
@@ -1,16 +1,14 @@
1
1
  import type { ConfirmSwap, Params } from './useConfirmSwap.types';
2
- import type { PendingSwapSettings } from '../../types';
3
- import type { BestRouteResponse } from 'rango-sdk';
2
+ import type { PendingSwapSettings, SelectedQuote } from '../../types';
3
+ import type { ConfirmRouteRequest } from 'rango-sdk';
4
4
 
5
5
  import { calculatePendingSwap } from '@rango-dev/queue-manager-rango-preset';
6
6
  import { useEffect } from 'react';
7
7
 
8
8
  import { useAppStore } from '../../store/AppStore';
9
9
  import { useQuoteStore } from '../../store/quote';
10
- import { useWalletsStore } from '../../store/wallets';
11
- import { isFeatureEnabled } from '../../utils/settings';
12
- import { createQuoteRequestBody, getWalletsForNewSwap } from '../../utils/swap';
13
- import { useFetchQuote } from '../useFetchQuote';
10
+ import { getWalletsForNewSwap } from '../../utils/swap';
11
+ import { useFetchConfirmQuote } from '../useFetchConfirmQuote';
14
12
 
15
13
  import {
16
14
  generateWarnings,
@@ -23,29 +21,21 @@ export function useConfirmSwap(): ConfirmSwap {
23
21
  fromToken,
24
22
  toToken,
25
23
  inputAmount,
26
- setQuote,
27
- quote: initialQuote,
24
+ setSelectedQuote,
25
+ selectedQuote: initialQuote,
28
26
  customDestination: customDestinationFromStore,
29
27
  setQuoteWarningsConfirmed,
28
+ resetAlerts,
30
29
  } = useQuoteStore();
31
30
 
32
- const {
33
- slippage,
34
- customSlippage,
35
- affiliatePercent,
36
- affiliateRef,
37
- affiliateWallets,
38
- } = useAppStore();
31
+ const { slippage, customSlippage } = useAppStore();
39
32
  const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();
40
- const { connectedWallets } = useWalletsStore();
41
33
  const blockchains = useAppStore().blockchains();
42
34
  const tokens = useAppStore().tokens();
43
- const { features } = useAppStore().config;
44
- const { enableNewLiquiditySources } = useAppStore().config;
45
35
 
46
36
  const userSlippage = customSlippage || slippage;
47
37
 
48
- const { fetch: fetchQuote, cancelFetch, loading } = useFetchQuote();
38
+ const { fetch: fetchQuote, cancelFetch, loading } = useFetchConfirmQuote();
49
39
 
50
40
  useEffect(() => cancelFetch, []);
51
41
 
@@ -63,70 +53,78 @@ export function useConfirmSwap(): ConfirmSwap {
63
53
  };
64
54
  }
65
55
 
66
- const requestBody = createQuoteRequestBody({
67
- fromToken,
68
- toToken,
69
- inputAmount,
70
- wallets: connectedWallets,
71
- selectedWallets,
72
- excludeLiquiditySources: enableNewLiquiditySources,
73
- disabledLiquiditySources,
74
- slippage: userSlippage,
75
- affiliateRef,
76
- affiliatePercent,
77
- affiliateWallets,
78
- initialQuote: initialQuote ?? undefined,
79
- destination: customDestination,
80
- });
81
- if (isFeatureEnabled('experimentalRoute', features)) {
82
- requestBody.experimental = true;
83
- }
84
- let currentQuote: BestRouteResponse;
56
+ const wallets = selectedWallets.reduce(
57
+ (acc: Record<string, string>, item) => {
58
+ acc[item.chain] = item.address;
59
+ return acc;
60
+ },
61
+ {}
62
+ );
63
+ const requestBody: ConfirmRouteRequest = {
64
+ requestId: initialQuote?.requestId || '',
65
+ selectedWallets: wallets,
66
+ destination: customDestination || undefined,
67
+ };
68
+
85
69
  try {
86
- currentQuote = await fetchQuote(requestBody).then((response) =>
87
- throwErrorIfResponseIsNotValid(response)
88
- );
89
- setQuote(currentQuote);
70
+ return await fetchQuote(requestBody).then((response) => {
71
+ const { result } = response;
72
+
73
+ throwErrorIfResponseIsNotValid({
74
+ diagnosisMessages: result.diagnosisMessages,
75
+ requestId: result.requestId,
76
+ swaps: result.result?.swaps,
77
+ });
78
+
79
+ const currentQuote: SelectedQuote = {
80
+ outputAmount: result.result?.outputAmount,
81
+ requestId: result.requestId,
82
+ resultType: result.result?.resultType,
83
+ swaps: result.result?.swaps || [],
84
+ validationStatus: result.validationStatus,
85
+ requestAmount: result.requestAmount,
86
+ };
87
+ setSelectedQuote(currentQuote);
88
+ const swapSettings: PendingSwapSettings = {
89
+ slippage: userSlippage.toString(),
90
+ disabledSwappersGroups: disabledLiquiditySources,
91
+ };
92
+ const swap = calculatePendingSwap(
93
+ inputAmount.toString(),
94
+ result,
95
+ getWalletsForNewSwap(selectedWallets),
96
+ swapSettings,
97
+ false,
98
+ { blockchains, tokens }
99
+ );
100
+
101
+ const confirmSwapWarnings = generateWarnings(
102
+ initialQuote ?? undefined,
103
+ currentQuote,
104
+ {
105
+ fromToken,
106
+ toToken,
107
+ meta: { blockchains, tokens },
108
+ selectedWallets,
109
+ userSlippage,
110
+ }
111
+ );
112
+ if (confirmSwapWarnings.quoteUpdate) {
113
+ setQuoteWarningsConfirmed(false);
114
+ }
115
+ resetAlerts();
116
+
117
+ return {
118
+ quote: currentQuote,
119
+ swap,
120
+ error: null,
121
+ warnings: confirmSwapWarnings,
122
+ };
123
+ });
90
124
  } catch (error: any) {
91
125
  const confirmSwapResult = handleQuoteErrors(error);
92
126
  return confirmSwapResult;
93
127
  }
94
-
95
- const swapSettings: PendingSwapSettings = {
96
- slippage: userSlippage.toString(),
97
- disabledSwappersGroups: disabledLiquiditySources,
98
- };
99
- const swap = calculatePendingSwap(
100
- inputAmount.toString(),
101
- currentQuote,
102
- getWalletsForNewSwap(selectedWallets),
103
- swapSettings,
104
- false,
105
- { blockchains, tokens }
106
- );
107
-
108
- const confirmSwapWarnings = generateWarnings(
109
- initialQuote ?? undefined,
110
- currentQuote,
111
- {
112
- fromToken,
113
- toToken,
114
- meta: { blockchains, tokens },
115
- selectedWallets,
116
- userSlippage,
117
- }
118
- );
119
-
120
- if (confirmSwapWarnings.quoteUpdate) {
121
- setQuoteWarningsConfirmed(false);
122
- }
123
-
124
- return {
125
- quote: currentQuote,
126
- swap,
127
- error: null,
128
- warnings: confirmSwapWarnings,
129
- };
130
128
  };
131
129
 
132
130
  return {
@@ -15,5 +15,5 @@ export type ConfirmSwap = {
15
15
 
16
16
  export type Params = {
17
17
  selectedWallets: Wallet[];
18
- customDestination?: string;
18
+ customDestination: string | null;
19
19
  };
@@ -0,0 +1,48 @@
1
+ import type { RequestOptions } from 'rango-sdk';
2
+
3
+ import { useRef, useState } from 'react';
4
+
5
+ type UseFetchOptions<TRequest, TResponse> = {
6
+ request: (
7
+ requestBody: TRequest,
8
+ options?: RequestOptions
9
+ ) => Promise<TResponse>;
10
+ };
11
+ export type UseFetchResult<TRequest, TResponse> = {
12
+ fetch: (requestBody: TRequest) => Promise<TResponse>;
13
+ cancelFetch: () => void;
14
+ loading: boolean;
15
+ };
16
+
17
+ export function useFetch<TRequest, TResponse>({
18
+ request,
19
+ }: UseFetchOptions<TRequest, TResponse>): UseFetchResult<TRequest, TResponse> {
20
+ const [loading, setLoading] = useState(false);
21
+ const abortController = useRef<AbortController | null>(null);
22
+
23
+ const cancelFetch = () => abortController.current?.abort();
24
+
25
+ const fetch: UseFetchResult<TRequest, TResponse>['fetch'] = async (
26
+ requestBody
27
+ ) => {
28
+ cancelFetch();
29
+ abortController.current = new AbortController();
30
+
31
+ setLoading(true);
32
+ try {
33
+ const res = await request(requestBody, {
34
+ signal: abortController.current.signal,
35
+ });
36
+
37
+ abortController.current = null;
38
+ return res;
39
+ // eslint-disable-next-line no-useless-catch
40
+ } catch (error) {
41
+ throw error;
42
+ } finally {
43
+ setLoading(false);
44
+ }
45
+ };
46
+
47
+ return { fetch, loading, cancelFetch };
48
+ }
@@ -0,0 +1,21 @@
1
+ import type { UseFetchResult } from './useFetch';
2
+ import type { BestRouteRequest, MultiRouteResponse } from 'rango-sdk';
3
+
4
+ import { httpService } from '../services/httpService';
5
+
6
+ import { useFetch } from './useFetch';
7
+
8
+ export function useFetchAllQuotes(): UseFetchResult<
9
+ BestRouteRequest,
10
+ MultiRouteResponse
11
+ > {
12
+ const { fetch, loading, cancelFetch } = useFetch<
13
+ BestRouteRequest,
14
+ MultiRouteResponse
15
+ >({
16
+ request: async (requestBody, options) =>
17
+ await httpService().getAllRoutes(requestBody, options),
18
+ });
19
+
20
+ return { fetch, loading, cancelFetch };
21
+ }
@@ -0,0 +1,21 @@
1
+ import type { UseFetchResult } from './useFetch';
2
+ import type { ConfirmRouteRequest, ConfirmRouteResponse } from 'rango-sdk';
3
+
4
+ import { httpService } from '../services/httpService';
5
+
6
+ import { useFetch } from './useFetch';
7
+
8
+ export function useFetchConfirmQuote(): UseFetchResult<
9
+ ConfirmRouteRequest,
10
+ ConfirmRouteResponse
11
+ > {
12
+ const { fetch, loading, cancelFetch } = useFetch<
13
+ ConfirmRouteRequest,
14
+ ConfirmRouteResponse
15
+ >({
16
+ request: async (requestBody, options) =>
17
+ await httpService().confirmRouteRequest(requestBody, options),
18
+ });
19
+
20
+ return { fetch, loading, cancelFetch };
21
+ }
@@ -1,14 +1,18 @@
1
- import type { QuoteError, QuoteWarning } from '../types';
2
1
  import type { Token } from 'rango-sdk';
3
2
 
4
3
  import { useCallback, useEffect, useState } from 'react';
5
4
 
6
5
  import { useAppStore } from '../store/AppStore';
7
6
  import { useQuoteStore } from '../store/quote';
7
+ import { useWalletsStore } from '../store/wallets';
8
8
  import { QuoteErrorType } from '../types';
9
9
  import { debounce } from '../utils/common';
10
10
  import { isPositiveNumber } from '../utils/numbers';
11
- import { generateQuoteWarnings } from '../utils/quote';
11
+ import {
12
+ generateQuoteWarnings,
13
+ getDefaultQuote,
14
+ sortQuotesBy,
15
+ } from '../utils/quote';
12
16
  import { isFeatureEnabled } from '../utils/settings';
13
17
  import { createQuoteRequestBody } from '../utils/swap';
14
18
  import { areTokensEqual } from '../utils/wallets';
@@ -17,7 +21,7 @@ import {
17
21
  handleQuoteErrors,
18
22
  throwErrorIfResponseIsNotValid,
19
23
  } from './useConfirmSwap/useConfirmSwap.helpers';
20
- import { useFetchQuote } from './useFetchQuote';
24
+ import { useFetchAllQuotes } from './useFetchAllQuotes';
21
25
 
22
26
  const DEBOUNCE_DELAY = 600;
23
27
  const FIRST_INDEX = 0;
@@ -28,28 +32,34 @@ type FetchQuoteParams = Omit<
28
32
  > & { fromToken: Token | null; toToken: Token | null };
29
33
 
30
34
  type UseSwapInput = {
31
- fetch: () => void;
35
+ fetch: (shouldChangeSelectedQuote?: boolean) => void;
32
36
  loading: boolean;
33
- error: QuoteError | null;
34
- warning: QuoteWarning | null;
35
37
  };
36
-
38
+ type UseSwapInputProps = {
39
+ refetchQuote: boolean;
40
+ };
37
41
  /**
38
42
  * a hook for fetching quote based on from and to input values
39
43
  * we use this hook in home page
40
44
  */
41
- export function useSwapInput(): UseSwapInput {
42
- const { fetch: fetchQuote, cancelFetch } = useFetchQuote();
45
+ export function useSwapInput({
46
+ refetchQuote,
47
+ }: UseSwapInputProps): UseSwapInput {
48
+ const { fetch: fetchQuote, cancelFetch } = useFetchAllQuotes();
43
49
  const { enableNewLiquiditySources, features } = useAppStore().config;
50
+ const connectedWallets = useWalletsStore.use.connectedWallets();
51
+
44
52
  const tokens = useAppStore().tokens();
45
53
  const {
46
54
  fromToken,
47
55
  toToken,
48
56
  inputAmount,
49
57
  inputUsdValue,
50
- quote,
58
+ selectedQuote,
59
+ sortStrategy,
51
60
  resetQuote,
52
- setQuote,
61
+ setSelectedQuote,
62
+ updateQuotePartialState,
53
63
  } = useQuoteStore();
54
64
  const {
55
65
  slippage,
@@ -64,8 +74,6 @@ export function useSwapInput(): UseSwapInput {
64
74
  const excludeLiquiditySources = useAppStore().excludeLiquiditySources();
65
75
 
66
76
  const [loading, setLoading] = useState(true);
67
- const [error, setError] = useState<QuoteError | null>(null);
68
- const [warning, setWarning] = useState<QuoteWarning | null>(null);
69
77
  const userSlippage = customSlippage ?? slippage;
70
78
  const tokensValueInvalid = !fromToken || !toToken;
71
79
  const shouldSkipRequest =
@@ -75,8 +83,6 @@ export function useSwapInput(): UseSwapInput {
75
83
 
76
84
  const resetState = (loading: boolean) => {
77
85
  setLoading(loading);
78
- setError(null);
79
- setWarning(null);
80
86
  };
81
87
 
82
88
  const fetch = (params: FetchQuoteParams) => {
@@ -92,6 +98,7 @@ export function useSwapInput(): UseSwapInput {
92
98
  affiliatePercent,
93
99
  affiliateWallets,
94
100
  } = params;
101
+
95
102
  if (!loading) {
96
103
  resetState(true);
97
104
  }
@@ -104,6 +111,7 @@ export function useSwapInput(): UseSwapInput {
104
111
  liquiditySources: liquiditySources,
105
112
  excludeLiquiditySources,
106
113
  disabledLiquiditySources,
114
+ wallets: connectedWallets,
107
115
  slippage,
108
116
  affiliateRef,
109
117
  affiliatePercent,
@@ -114,16 +122,32 @@ export function useSwapInput(): UseSwapInput {
114
122
  }
115
123
  fetchQuote(requestBody)
116
124
  .then((res) => {
125
+ const sortQuotes = sortQuotesBy(sortStrategy, res.results);
126
+ const quote = getDefaultQuote(
127
+ selectedQuote,
128
+ sortQuotes,
129
+ res.requestAmount
130
+ );
131
+
117
132
  setLoading(false);
118
- setQuote(res);
119
- throwErrorIfResponseIsNotValid(res);
120
- const quoteWarning = generateQuoteWarnings(res, {
121
- fromToken,
122
- toToken,
123
- userSlippage,
124
- tokens,
133
+ updateQuotePartialState('quotes', res);
134
+ setSelectedQuote(quote);
135
+
136
+ throwErrorIfResponseIsNotValid({
137
+ diagnosisMessages: res.diagnosisMessages,
138
+ requestId: quote?.requestId || '',
139
+ swaps: quote?.swaps,
125
140
  });
126
- setWarning(quoteWarning);
141
+
142
+ const quoteWarning =
143
+ quote &&
144
+ generateQuoteWarnings(quote, {
145
+ fromToken,
146
+ toToken,
147
+ userSlippage,
148
+ tokens,
149
+ });
150
+ updateQuotePartialState('warning', quoteWarning);
127
151
  })
128
152
  .catch((error) => {
129
153
  const { error: quoteError } = handleQuoteErrors(error);
@@ -134,7 +158,7 @@ export function useSwapInput(): UseSwapInput {
134
158
  resetQuote();
135
159
  }
136
160
  if (quoteError?.type !== QuoteErrorType.REQUEST_CANCELED) {
137
- setError(quoteError);
161
+ updateQuotePartialState('error', quoteError);
138
162
  setLoading(false);
139
163
  }
140
164
  });
@@ -151,20 +175,26 @@ export function useSwapInput(): UseSwapInput {
151
175
  );
152
176
 
153
177
  useEffect(() => {
154
- if (fetchStatus !== 'success') {
178
+ if (!refetchQuote) {
179
+ setLoading(false);
155
180
  return;
156
181
  }
157
- if (!isPositiveNumber(inputAmount) || inputUsdValue?.eq(0)) {
158
- resetState(false);
159
- cancelFetch();
182
+ if (fetchStatus !== 'success') {
160
183
  return;
161
184
  }
162
185
  if (shouldSkipRequest) {
163
- if (quote) {
186
+ setLoading(false);
187
+ if (selectedQuote) {
164
188
  resetQuote();
165
189
  }
166
190
  return;
167
191
  }
192
+ if (!isPositiveNumber(inputAmount) || inputUsdValue?.eq(0)) {
193
+ resetState(false);
194
+ cancelFetch();
195
+ return;
196
+ }
197
+
168
198
  resetQuote();
169
199
  resetState(true);
170
200
  debouncedFetch({
@@ -214,7 +244,5 @@ export function useSwapInput(): UseSwapInput {
214
244
  affiliateWallets,
215
245
  }),
216
246
  loading,
217
- error,
218
- warning,
219
247
  };
220
248
  }