@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.
- package/dist/components/AppRoutes.d.ts.map +1 -1
- package/dist/components/BlockchainList/BlockchainList.styles.d.ts +3 -0
- package/dist/components/BlockchainList/BlockchainList.styles.d.ts.map +1 -1
- package/dist/components/BlockchainsSection/BlockchainsSection.styles.d.ts +1 -0
- package/dist/components/BlockchainsSection/BlockchainsSection.styles.d.ts.map +1 -1
- package/dist/components/ConfirmWalletsModal/ConfirmWallets.helpers.d.ts +2 -2
- package/dist/components/ConfirmWalletsModal/ConfirmWallets.helpers.d.ts.map +1 -1
- package/dist/components/ConfirmWalletsModal/ConfirmWallets.styles.d.ts +15 -0
- package/dist/components/ConfirmWalletsModal/ConfirmWallets.styles.d.ts.map +1 -1
- package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.d.ts.map +1 -1
- package/dist/components/ConfirmWalletsModal/WalletList.styles.d.ts +3 -0
- package/dist/components/ConfirmWalletsModal/WalletList.styles.d.ts.map +1 -1
- package/dist/components/CustomCollapsible/CustomCollapsible.styles.d.ts +4 -0
- package/dist/components/CustomCollapsible/CustomCollapsible.styles.d.ts.map +1 -1
- package/dist/components/HeaderButtons/HeaderButtons.d.ts +4 -0
- package/dist/components/HeaderButtons/HeaderButtons.d.ts.map +1 -0
- package/dist/components/HeaderButtons/HeaderButtons.styles.d.ts +5 -0
- package/dist/components/HeaderButtons/HeaderButtons.styles.d.ts.map +1 -1
- package/dist/components/HeaderButtons/HeaderButtons.types.d.ts +3 -2
- package/dist/components/HeaderButtons/HeaderButtons.types.d.ts.map +1 -1
- package/dist/components/HeaderButtons/index.d.ts +1 -1
- package/dist/components/HeaderButtons/index.d.ts.map +1 -1
- package/dist/components/HistoryGroupedList/HistoryGroupedList.styles.d.ts +6 -0
- package/dist/components/HistoryGroupedList/HistoryGroupedList.styles.d.ts.map +1 -1
- package/dist/components/Layout/Layout.d.ts.map +1 -1
- package/dist/components/Layout/Layout.styles.d.ts +3 -0
- package/dist/components/Layout/Layout.styles.d.ts.map +1 -1
- package/dist/components/Layout/Layout.types.d.ts +1 -0
- package/dist/components/Layout/Layout.types.d.ts.map +1 -1
- package/dist/components/Layout/PageContainer.d.ts +1 -0
- package/dist/components/Layout/PageContainer.d.ts.map +1 -1
- package/dist/components/Layout/ScrollableArea.d.ts +1 -0
- package/dist/components/Layout/ScrollableArea.d.ts.map +1 -1
- package/dist/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.d.ts +1 -0
- package/dist/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.d.ts.map +1 -1
- package/dist/components/LoadingSwapDetails/LoadingSwapDetails.styles.d.ts +14 -0
- package/dist/components/LoadingSwapDetails/LoadingSwapDetails.styles.d.ts.map +1 -1
- package/dist/components/NoResult/NoResult.styles.d.ts +3 -0
- package/dist/components/NoResult/NoResult.styles.d.ts.map +1 -1
- package/dist/components/NotificationContent/NotificationContent.styles.d.ts +4 -0
- package/dist/components/NotificationContent/NotificationContent.styles.d.ts.map +1 -1
- package/dist/components/Quote/Quote.d.ts.map +1 -1
- package/dist/components/Quote/Quote.styles.d.ts +1136 -25
- package/dist/components/Quote/Quote.styles.d.ts.map +1 -1
- package/dist/components/Quote/Quote.types.d.ts +12 -7
- package/dist/components/Quote/Quote.types.d.ts.map +1 -1
- package/dist/components/Quote/QuoteCostDetails.d.ts.map +1 -1
- package/dist/components/Quote/QuoteCostDetails.styles.d.ts +5 -0
- package/dist/components/Quote/QuoteCostDetails.styles.d.ts.map +1 -1
- package/dist/components/Quote/QuoteSummary.styles.d.ts +2 -0
- package/dist/components/Quote/QuoteSummary.styles.d.ts.map +1 -1
- package/dist/components/Quote/QuoteTrigger .d.ts.map +1 -1
- package/dist/components/QuoteSkeleton/QuoteSkeleton.styles.d.ts +4 -0
- package/dist/components/QuoteSkeleton/QuoteSkeleton.styles.d.ts.map +1 -1
- package/dist/components/QuoteSkeleton/QuoteSkeleton.types.d.ts +1 -1
- package/dist/components/QuoteSkeleton/QuoteSkeleton.types.d.ts.map +1 -1
- package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.d.ts.map +1 -1
- package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.styles.d.ts +20 -10
- package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.styles.d.ts.map +1 -1
- package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.types.d.ts +1 -1
- package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.types.d.ts.map +1 -1
- package/dist/components/QuoteSkeleton/StepSkeleton.styles.d.ts +5 -0
- package/dist/components/QuoteSkeleton/StepSkeleton.styles.d.ts.map +1 -1
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.d.ts +4 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.d.ts.map +1 -1
- package/dist/components/SearchInput/SearchInput.styles.d.ts +1 -0
- package/dist/components/SearchInput/SearchInput.styles.d.ts.map +1 -1
- package/dist/components/SettingsContainer/SettingsContainer.style.d.ts +3 -0
- package/dist/components/SettingsContainer/SettingsContainer.style.d.ts.map +1 -1
- package/dist/components/Slippage/Slippage.styles.d.ts +5 -0
- package/dist/components/Slippage/Slippage.styles.d.ts.map +1 -1
- package/dist/components/SwapDetails/SwapDetails.styles.d.ts +13 -0
- package/dist/components/SwapDetails/SwapDetails.styles.d.ts.map +1 -1
- package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.styles.d.ts +1 -0
- package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.styles.d.ts.map +1 -1
- package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.types.d.ts +2 -1
- package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.types.d.ts.map +1 -1
- package/dist/components/SwapDetailsModal/SwapDetailsModal.styles.d.ts +1 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.styles.d.ts.map +1 -1
- package/dist/components/SwapDetailsModal/index.d.ts +1 -1
- package/dist/components/SwapDetailsModal/index.d.ts.map +1 -1
- package/dist/components/TokenList/TokenList.styles.d.ts +17 -0
- package/dist/components/TokenList/TokenList.styles.d.ts.map +1 -1
- package/dist/components/WalletModal/WalletModalContent.styles.d.ts +4 -0
- package/dist/components/WalletModal/WalletModalContent.styles.d.ts.map +1 -1
- package/dist/constants/navigationRoutes.d.ts +1 -0
- package/dist/constants/navigationRoutes.d.ts.map +1 -1
- package/dist/constants/quote.d.ts +5 -1
- package/dist/constants/quote.d.ts.map +1 -1
- package/dist/containers/App/App.styles.d.ts +1 -0
- package/dist/containers/App/App.styles.d.ts.map +1 -1
- package/dist/containers/QuoteInfo/QuoteInfo.d.ts.map +1 -1
- package/dist/containers/QuoteInfo/QuoteInfo.styles.d.ts +3 -0
- package/dist/containers/QuoteInfo/QuoteInfo.styles.d.ts.map +1 -1
- package/dist/containers/QuoteInfo/QuoteInfo.types.d.ts +6 -3
- package/dist/containers/QuoteInfo/QuoteInfo.types.d.ts.map +1 -1
- package/dist/hooks/useConfirmSwap/useConfirmSwap.d.ts.map +1 -1
- package/dist/hooks/useConfirmSwap/useConfirmSwap.helpers.d.ts +5 -4
- package/dist/hooks/useConfirmSwap/useConfirmSwap.helpers.d.ts.map +1 -1
- package/dist/hooks/useConfirmSwap/useConfirmSwap.types.d.ts +1 -1
- package/dist/hooks/useConfirmSwap/useConfirmSwap.types.d.ts.map +1 -1
- package/dist/hooks/useFetch.d.ts +12 -0
- package/dist/hooks/useFetch.d.ts.map +1 -0
- package/dist/hooks/useFetchAllQuotes.d.ts +4 -0
- package/dist/hooks/useFetchAllQuotes.d.ts.map +1 -0
- package/dist/hooks/useFetchConfirmQuote.d.ts +4 -0
- package/dist/hooks/useFetchConfirmQuote.d.ts.map +1 -0
- package/dist/hooks/useSwapInput.d.ts +5 -5
- package/dist/hooks/useSwapInput.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +4 -4
- package/dist/pages/ConfirmSwapPage.d.ts.map +1 -1
- package/dist/pages/Home.d.ts.map +1 -1
- package/dist/pages/Routes.d.ts +3 -0
- package/dist/pages/Routes.d.ts.map +1 -0
- package/dist/store/quote.d.ts +32 -10
- package/dist/store/quote.d.ts.map +1 -1
- package/dist/store/wallets.d.ts +0 -2
- package/dist/store/wallets.d.ts.map +1 -1
- package/dist/types/quote.d.ts +19 -1
- package/dist/types/quote.d.ts.map +1 -1
- package/dist/utils/quote.d.ts +12 -9
- package/dist/utils/quote.d.ts.map +1 -1
- package/dist/utils/swap.d.ts +18 -18
- package/dist/utils/swap.d.ts.map +1 -1
- package/dist/utils/wallets.d.ts +3 -3
- package/dist/utils/wallets.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/components/AppRoutes.tsx +5 -0
- package/src/components/ConfirmWalletsModal/ConfirmWallets.helpers.ts +3 -3
- package/src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx +21 -18
- package/src/components/HeaderButtons/{HomeButtons.tsx → HeaderButtons.tsx} +39 -26
- package/src/components/HeaderButtons/HeaderButtons.types.ts +3 -2
- package/src/components/HeaderButtons/index.ts +1 -1
- package/src/components/Layout/Layout.tsx +13 -1
- package/src/components/Layout/Layout.types.ts +1 -0
- package/src/components/Quote/Quote.styles.ts +133 -38
- package/src/components/Quote/Quote.tsx +68 -13
- package/src/components/Quote/Quote.types.ts +13 -7
- package/src/components/Quote/QuoteCostDetails.tsx +9 -4
- package/src/components/Quote/QuoteTrigger .tsx +7 -3
- package/src/components/QuoteSkeleton/QuoteSkeleton.tsx +2 -2
- package/src/components/QuoteSkeleton/QuoteSkeleton.types.ts +1 -1
- package/src/components/QuoteSkeleton/QuoteSummarySkeleton.styles.ts +10 -12
- package/src/components/QuoteSkeleton/QuoteSummarySkeleton.tsx +28 -9
- package/src/components/QuoteSkeleton/QuoteSummarySkeleton.types.ts +1 -1
- package/src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.ts +19 -19
- package/src/components/SwapDetails/SwapDetails.tsx +1 -1
- package/src/components/SwapDetailsAlerts/SwapDetailsAlerts.types.ts +1 -1
- package/src/components/SwapDetailsModal/index.ts +1 -1
- package/src/constants/navigationRoutes.ts +1 -0
- package/src/constants/quote.ts +17 -1
- package/src/containers/QuoteInfo/QuoteInfo.tsx +32 -7
- package/src/containers/QuoteInfo/QuoteInfo.types.ts +6 -3
- package/src/hooks/useConfirmSwap/useConfirmSwap.helpers.ts +36 -20
- package/src/hooks/useConfirmSwap/useConfirmSwap.ts +76 -78
- package/src/hooks/useConfirmSwap/useConfirmSwap.types.ts +1 -1
- package/src/hooks/useFetch.ts +48 -0
- package/src/hooks/useFetchAllQuotes.ts +21 -0
- package/src/hooks/useFetchConfirmQuote.ts +21 -0
- package/src/hooks/useSwapInput.ts +59 -31
- package/src/pages/ConfirmSwapPage.tsx +12 -9
- package/src/pages/Home.tsx +25 -15
- package/src/pages/Routes.tsx +131 -0
- package/src/store/quote.ts +60 -22
- package/src/store/wallets.ts +0 -2
- package/src/types/quote.ts +27 -1
- package/src/utils/quote.ts +129 -67
- package/src/utils/swap.ts +37 -77
- package/src/utils/wallets.ts +10 -9
- package/dist/components/HeaderButtons/HomeButtons.d.ts +0 -4
- package/dist/components/HeaderButtons/HomeButtons.d.ts.map +0 -1
- package/dist/hooks/useFetchQuote.d.ts +0 -9
- package/dist/hooks/useFetchQuote.d.ts.map +0 -1
- 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 {
|
|
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 {
|
|
11
|
-
import {
|
|
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
|
-
|
|
27
|
-
|
|
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 } =
|
|
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
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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 {
|
|
@@ -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 {
|
|
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 {
|
|
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(
|
|
42
|
-
|
|
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
|
-
|
|
58
|
+
selectedQuote,
|
|
59
|
+
sortStrategy,
|
|
51
60
|
resetQuote,
|
|
52
|
-
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
178
|
+
if (!refetchQuote) {
|
|
179
|
+
setLoading(false);
|
|
155
180
|
return;
|
|
156
181
|
}
|
|
157
|
-
if (
|
|
158
|
-
resetState(false);
|
|
159
|
-
cancelFetch();
|
|
182
|
+
if (fetchStatus !== 'success') {
|
|
160
183
|
return;
|
|
161
184
|
}
|
|
162
185
|
if (shouldSkipRequest) {
|
|
163
|
-
|
|
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
|
-
|
|
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(
|
|
215
|
+
let requiredWallets = getRequiredWallets(selectedQuote?.swaps || null);
|
|
216
216
|
|
|
217
217
|
const lastStepToBlockchain =
|
|
218
|
-
|
|
218
|
+
selectedQuote?.swaps[selectedQuote.swaps.length - 1].to.blockchain;
|
|
219
219
|
|
|
220
|
-
const isLastWalletRequired = !!
|
|
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 (
|
|
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 (!
|
|
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(
|
|
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={
|
|
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}
|
package/src/pages/Home.tsx
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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
|
-
|
|
77
|
+
selectedQuote,
|
|
78
78
|
inputAmount,
|
|
79
79
|
inputUsdValue
|
|
80
80
|
);
|
|
81
81
|
|
|
82
82
|
const priceImpactOutputCanNotBeComputed = !canComputePriceImpact(
|
|
83
|
-
|
|
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
|
-
<
|
|
157
|
+
<HeaderButtons
|
|
157
158
|
onClickRefresh={
|
|
158
|
-
(!!
|
|
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={!!
|
|
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={
|
|
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
|
<>
|