@rango-dev/widget-embedded 0.22.4-next.6 → 0.22.4-next.7

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 (175) hide show
  1. package/dist/components/AppRoutes.d.ts.map +1 -1
  2. package/dist/components/BlockchainList/BlockchainList.styles.d.ts +3 -0
  3. package/dist/components/BlockchainList/BlockchainList.styles.d.ts.map +1 -1
  4. package/dist/components/BlockchainsSection/BlockchainsSection.styles.d.ts +1 -0
  5. package/dist/components/BlockchainsSection/BlockchainsSection.styles.d.ts.map +1 -1
  6. package/dist/components/ConfirmWalletsModal/ConfirmWallets.helpers.d.ts +2 -2
  7. package/dist/components/ConfirmWalletsModal/ConfirmWallets.helpers.d.ts.map +1 -1
  8. package/dist/components/ConfirmWalletsModal/ConfirmWallets.styles.d.ts +15 -0
  9. package/dist/components/ConfirmWalletsModal/ConfirmWallets.styles.d.ts.map +1 -1
  10. package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.d.ts.map +1 -1
  11. package/dist/components/ConfirmWalletsModal/WalletList.styles.d.ts +3 -0
  12. package/dist/components/ConfirmWalletsModal/WalletList.styles.d.ts.map +1 -1
  13. package/dist/components/CustomCollapsible/CustomCollapsible.styles.d.ts +4 -0
  14. package/dist/components/CustomCollapsible/CustomCollapsible.styles.d.ts.map +1 -1
  15. package/dist/components/HeaderButtons/HeaderButtons.d.ts +4 -0
  16. package/dist/components/HeaderButtons/HeaderButtons.d.ts.map +1 -0
  17. package/dist/components/HeaderButtons/HeaderButtons.styles.d.ts +5 -0
  18. package/dist/components/HeaderButtons/HeaderButtons.styles.d.ts.map +1 -1
  19. package/dist/components/HeaderButtons/HeaderButtons.types.d.ts +3 -2
  20. package/dist/components/HeaderButtons/HeaderButtons.types.d.ts.map +1 -1
  21. package/dist/components/HeaderButtons/index.d.ts +1 -1
  22. package/dist/components/HeaderButtons/index.d.ts.map +1 -1
  23. package/dist/components/HistoryGroupedList/HistoryGroupedList.styles.d.ts +6 -0
  24. package/dist/components/HistoryGroupedList/HistoryGroupedList.styles.d.ts.map +1 -1
  25. package/dist/components/Layout/Layout.d.ts.map +1 -1
  26. package/dist/components/Layout/Layout.styles.d.ts +3 -0
  27. package/dist/components/Layout/Layout.styles.d.ts.map +1 -1
  28. package/dist/components/Layout/Layout.types.d.ts +1 -0
  29. package/dist/components/Layout/Layout.types.d.ts.map +1 -1
  30. package/dist/components/Layout/PageContainer.d.ts +1 -0
  31. package/dist/components/Layout/PageContainer.d.ts.map +1 -1
  32. package/dist/components/Layout/ScrollableArea.d.ts +1 -0
  33. package/dist/components/Layout/ScrollableArea.d.ts.map +1 -1
  34. package/dist/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.d.ts +1 -0
  35. package/dist/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.d.ts.map +1 -1
  36. package/dist/components/LoadingSwapDetails/LoadingSwapDetails.styles.d.ts +14 -0
  37. package/dist/components/LoadingSwapDetails/LoadingSwapDetails.styles.d.ts.map +1 -1
  38. package/dist/components/NoResult/NoResult.styles.d.ts +3 -0
  39. package/dist/components/NoResult/NoResult.styles.d.ts.map +1 -1
  40. package/dist/components/NotificationContent/NotificationContent.styles.d.ts +4 -0
  41. package/dist/components/NotificationContent/NotificationContent.styles.d.ts.map +1 -1
  42. package/dist/components/Quote/Quote.d.ts.map +1 -1
  43. package/dist/components/Quote/Quote.styles.d.ts +1136 -25
  44. package/dist/components/Quote/Quote.styles.d.ts.map +1 -1
  45. package/dist/components/Quote/Quote.types.d.ts +12 -7
  46. package/dist/components/Quote/Quote.types.d.ts.map +1 -1
  47. package/dist/components/Quote/QuoteCostDetails.d.ts.map +1 -1
  48. package/dist/components/Quote/QuoteCostDetails.styles.d.ts +5 -0
  49. package/dist/components/Quote/QuoteCostDetails.styles.d.ts.map +1 -1
  50. package/dist/components/Quote/QuoteSummary.styles.d.ts +2 -0
  51. package/dist/components/Quote/QuoteSummary.styles.d.ts.map +1 -1
  52. package/dist/components/Quote/QuoteTrigger .d.ts.map +1 -1
  53. package/dist/components/QuoteSkeleton/QuoteSkeleton.styles.d.ts +4 -0
  54. package/dist/components/QuoteSkeleton/QuoteSkeleton.styles.d.ts.map +1 -1
  55. package/dist/components/QuoteSkeleton/QuoteSkeleton.types.d.ts +1 -1
  56. package/dist/components/QuoteSkeleton/QuoteSkeleton.types.d.ts.map +1 -1
  57. package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.d.ts.map +1 -1
  58. package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.styles.d.ts +20 -10
  59. package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.styles.d.ts.map +1 -1
  60. package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.types.d.ts +1 -1
  61. package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.types.d.ts.map +1 -1
  62. package/dist/components/QuoteSkeleton/StepSkeleton.styles.d.ts +5 -0
  63. package/dist/components/QuoteSkeleton/StepSkeleton.styles.d.ts.map +1 -1
  64. package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.d.ts +4 -0
  65. package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.d.ts.map +1 -1
  66. package/dist/components/SearchInput/SearchInput.styles.d.ts +1 -0
  67. package/dist/components/SearchInput/SearchInput.styles.d.ts.map +1 -1
  68. package/dist/components/SettingsContainer/SettingsContainer.style.d.ts +3 -0
  69. package/dist/components/SettingsContainer/SettingsContainer.style.d.ts.map +1 -1
  70. package/dist/components/Slippage/Slippage.styles.d.ts +5 -0
  71. package/dist/components/Slippage/Slippage.styles.d.ts.map +1 -1
  72. package/dist/components/SwapDetails/SwapDetails.styles.d.ts +13 -0
  73. package/dist/components/SwapDetails/SwapDetails.styles.d.ts.map +1 -1
  74. package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.styles.d.ts +1 -0
  75. package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.styles.d.ts.map +1 -1
  76. package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.types.d.ts +2 -1
  77. package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.types.d.ts.map +1 -1
  78. package/dist/components/SwapDetailsModal/SwapDetailsModal.styles.d.ts +1 -0
  79. package/dist/components/SwapDetailsModal/SwapDetailsModal.styles.d.ts.map +1 -1
  80. package/dist/components/SwapDetailsModal/index.d.ts +1 -1
  81. package/dist/components/SwapDetailsModal/index.d.ts.map +1 -1
  82. package/dist/components/TokenList/TokenList.styles.d.ts +17 -0
  83. package/dist/components/TokenList/TokenList.styles.d.ts.map +1 -1
  84. package/dist/components/WalletModal/WalletModalContent.styles.d.ts +4 -0
  85. package/dist/components/WalletModal/WalletModalContent.styles.d.ts.map +1 -1
  86. package/dist/constants/navigationRoutes.d.ts +1 -0
  87. package/dist/constants/navigationRoutes.d.ts.map +1 -1
  88. package/dist/constants/quote.d.ts +5 -1
  89. package/dist/constants/quote.d.ts.map +1 -1
  90. package/dist/containers/App/App.styles.d.ts +1 -0
  91. package/dist/containers/App/App.styles.d.ts.map +1 -1
  92. package/dist/containers/QuoteInfo/QuoteInfo.d.ts.map +1 -1
  93. package/dist/containers/QuoteInfo/QuoteInfo.styles.d.ts +3 -0
  94. package/dist/containers/QuoteInfo/QuoteInfo.styles.d.ts.map +1 -1
  95. package/dist/containers/QuoteInfo/QuoteInfo.types.d.ts +6 -3
  96. package/dist/containers/QuoteInfo/QuoteInfo.types.d.ts.map +1 -1
  97. package/dist/hooks/useConfirmSwap/useConfirmSwap.d.ts.map +1 -1
  98. package/dist/hooks/useConfirmSwap/useConfirmSwap.helpers.d.ts +5 -4
  99. package/dist/hooks/useConfirmSwap/useConfirmSwap.helpers.d.ts.map +1 -1
  100. package/dist/hooks/useConfirmSwap/useConfirmSwap.types.d.ts +1 -1
  101. package/dist/hooks/useConfirmSwap/useConfirmSwap.types.d.ts.map +1 -1
  102. package/dist/hooks/useFetch.d.ts +12 -0
  103. package/dist/hooks/useFetch.d.ts.map +1 -0
  104. package/dist/hooks/useFetchAllQuotes.d.ts +4 -0
  105. package/dist/hooks/useFetchAllQuotes.d.ts.map +1 -0
  106. package/dist/hooks/useFetchConfirmQuote.d.ts +4 -0
  107. package/dist/hooks/useFetchConfirmQuote.d.ts.map +1 -0
  108. package/dist/hooks/useSwapInput.d.ts +5 -5
  109. package/dist/hooks/useSwapInput.d.ts.map +1 -1
  110. package/dist/index.js +2 -2
  111. package/dist/index.js.map +4 -4
  112. package/dist/pages/ConfirmSwapPage.d.ts.map +1 -1
  113. package/dist/pages/Home.d.ts.map +1 -1
  114. package/dist/pages/Routes.d.ts +3 -0
  115. package/dist/pages/Routes.d.ts.map +1 -0
  116. package/dist/store/quote.d.ts +32 -10
  117. package/dist/store/quote.d.ts.map +1 -1
  118. package/dist/store/wallets.d.ts +0 -2
  119. package/dist/store/wallets.d.ts.map +1 -1
  120. package/dist/types/quote.d.ts +19 -1
  121. package/dist/types/quote.d.ts.map +1 -1
  122. package/dist/utils/quote.d.ts +12 -9
  123. package/dist/utils/quote.d.ts.map +1 -1
  124. package/dist/utils/swap.d.ts +18 -18
  125. package/dist/utils/swap.d.ts.map +1 -1
  126. package/dist/utils/wallets.d.ts +3 -3
  127. package/dist/utils/wallets.d.ts.map +1 -1
  128. package/package.json +2 -2
  129. package/src/components/AppRoutes.tsx +5 -0
  130. package/src/components/ConfirmWalletsModal/ConfirmWallets.helpers.ts +3 -3
  131. package/src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx +21 -18
  132. package/src/components/HeaderButtons/{HomeButtons.tsx → HeaderButtons.tsx} +39 -26
  133. package/src/components/HeaderButtons/HeaderButtons.types.ts +3 -2
  134. package/src/components/HeaderButtons/index.ts +1 -1
  135. package/src/components/Layout/Layout.tsx +13 -1
  136. package/src/components/Layout/Layout.types.ts +1 -0
  137. package/src/components/Quote/Quote.styles.ts +133 -38
  138. package/src/components/Quote/Quote.tsx +68 -13
  139. package/src/components/Quote/Quote.types.ts +13 -7
  140. package/src/components/Quote/QuoteCostDetails.tsx +9 -4
  141. package/src/components/Quote/QuoteTrigger .tsx +7 -3
  142. package/src/components/QuoteSkeleton/QuoteSkeleton.tsx +2 -2
  143. package/src/components/QuoteSkeleton/QuoteSkeleton.types.ts +1 -1
  144. package/src/components/QuoteSkeleton/QuoteSummarySkeleton.styles.ts +10 -12
  145. package/src/components/QuoteSkeleton/QuoteSummarySkeleton.tsx +28 -9
  146. package/src/components/QuoteSkeleton/QuoteSummarySkeleton.types.ts +1 -1
  147. package/src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.ts +19 -19
  148. package/src/components/SwapDetails/SwapDetails.tsx +1 -1
  149. package/src/components/SwapDetailsAlerts/SwapDetailsAlerts.types.ts +1 -1
  150. package/src/components/SwapDetailsModal/index.ts +1 -1
  151. package/src/constants/navigationRoutes.ts +1 -0
  152. package/src/constants/quote.ts +17 -1
  153. package/src/containers/QuoteInfo/QuoteInfo.tsx +32 -7
  154. package/src/containers/QuoteInfo/QuoteInfo.types.ts +6 -3
  155. package/src/hooks/useConfirmSwap/useConfirmSwap.helpers.ts +36 -20
  156. package/src/hooks/useConfirmSwap/useConfirmSwap.ts +76 -78
  157. package/src/hooks/useConfirmSwap/useConfirmSwap.types.ts +1 -1
  158. package/src/hooks/useFetch.ts +48 -0
  159. package/src/hooks/useFetchAllQuotes.ts +21 -0
  160. package/src/hooks/useFetchConfirmQuote.ts +21 -0
  161. package/src/hooks/useSwapInput.ts +59 -31
  162. package/src/pages/ConfirmSwapPage.tsx +12 -9
  163. package/src/pages/Home.tsx +25 -15
  164. package/src/pages/Routes.tsx +131 -0
  165. package/src/store/quote.ts +60 -22
  166. package/src/store/wallets.ts +0 -2
  167. package/src/types/quote.ts +27 -1
  168. package/src/utils/quote.ts +129 -67
  169. package/src/utils/swap.ts +37 -77
  170. package/src/utils/wallets.ts +10 -9
  171. package/dist/components/HeaderButtons/HomeButtons.d.ts +0 -4
  172. package/dist/components/HeaderButtons/HomeButtons.d.ts.map +0 -1
  173. package/dist/hooks/useFetchQuote.d.ts +0 -9
  174. package/dist/hooks/useFetchQuote.d.ts.map +0 -1
  175. package/src/hooks/useFetchQuote.ts +0 -38
@@ -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
  }
@@ -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
  <>