@rango-dev/widget-embedded 0.17.1-next.2 → 0.17.1-next.3

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 (195) hide show
  1. package/dist/components/ConfirmWalletsModal/ConfirmWallets.helpers.d.ts +1 -3
  2. package/dist/components/ConfirmWalletsModal/ConfirmWallets.helpers.d.ts.map +1 -1
  3. package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.d.ts.map +1 -1
  4. package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.types.d.ts +1 -1
  5. package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.types.d.ts.map +1 -1
  6. package/dist/components/NoResult/NoResult.d.ts +4 -0
  7. package/dist/components/NoResult/NoResult.d.ts.map +1 -0
  8. package/dist/components/NoResult/NoResult.helpers.d.ts +4 -0
  9. package/dist/components/NoResult/NoResult.helpers.d.ts.map +1 -0
  10. package/dist/components/{NoRoutes/NoRoutes.styles.d.ts → NoResult/NoResult.styles.d.ts} +1 -1
  11. package/dist/components/{NoRoutes/NoRoutes.styles.d.ts.map → NoResult/NoResult.styles.d.ts.map} +1 -1
  12. package/dist/components/{NoRoutes/NoRoutes.types.d.ts → NoResult/NoResult.types.d.ts} +3 -3
  13. package/dist/components/NoResult/NoResult.types.d.ts.map +1 -0
  14. package/dist/components/NoResult/index.d.ts +2 -0
  15. package/dist/components/NoResult/index.d.ts.map +1 -0
  16. package/dist/components/Quote/Quote.d.ts +4 -0
  17. package/dist/components/Quote/Quote.d.ts.map +1 -0
  18. package/dist/components/Quote/Quote.styles.d.ts +1429 -0
  19. package/dist/components/Quote/Quote.styles.d.ts.map +1 -0
  20. package/dist/components/Quote/Quote.types.d.ts +22 -0
  21. package/dist/components/Quote/Quote.types.d.ts.map +1 -0
  22. package/dist/components/Quote/QuoteSkeleton.d.ts +4 -0
  23. package/dist/components/Quote/QuoteSkeleton.d.ts.map +1 -0
  24. package/dist/components/Quote/QuoteSkeleton.styles.d.ts +319 -0
  25. package/dist/components/Quote/QuoteSkeleton.styles.d.ts.map +1 -0
  26. package/dist/components/Quote/QuoteSkeleton.types.d.ts +6 -0
  27. package/dist/components/Quote/QuoteSkeleton.types.d.ts.map +1 -0
  28. package/dist/components/Quote/QuoteSummary.d.ts +11 -0
  29. package/dist/components/Quote/QuoteSummary.d.ts.map +1 -0
  30. package/dist/components/Quote/QuoteSummary.styles.d.ts +158 -0
  31. package/dist/components/Quote/QuoteSummary.styles.d.ts.map +1 -0
  32. package/dist/components/Quote/index.d.ts +4 -0
  33. package/dist/components/Quote/index.d.ts.map +1 -0
  34. package/dist/components/QuoteWarningsAndErrors/HighValueLossWarningModal.d.ts +11 -0
  35. package/dist/components/QuoteWarningsAndErrors/HighValueLossWarningModal.d.ts.map +1 -0
  36. package/dist/components/QuoteWarningsAndErrors/QuoteErrorsModalItem.d.ts +4 -0
  37. package/dist/components/QuoteWarningsAndErrors/QuoteErrorsModalItem.d.ts.map +1 -0
  38. package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.d.ts +4 -0
  39. package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.d.ts.map +1 -0
  40. package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.d.ts +9 -0
  41. package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.d.ts.map +1 -0
  42. package/dist/components/{RouteErrors/RouteErrors.styles.d.ts → QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.d.ts} +1 -1
  43. package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.d.ts.map +1 -0
  44. package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.types.d.ts +22 -0
  45. package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.types.d.ts.map +1 -0
  46. package/dist/components/QuoteWarningsAndErrors/SlippageWariningModal.d.ts +11 -0
  47. package/dist/components/QuoteWarningsAndErrors/SlippageWariningModal.d.ts.map +1 -0
  48. package/dist/components/QuoteWarningsAndErrors/UnknownPriceWarningModal.d.ts +11 -0
  49. package/dist/components/QuoteWarningsAndErrors/UnknownPriceWarningModal.d.ts.map +1 -0
  50. package/dist/components/QuoteWarningsAndErrors/index.d.ts +2 -0
  51. package/dist/components/QuoteWarningsAndErrors/index.d.ts.map +1 -0
  52. package/dist/components/SwapDetails/SwapDetails.d.ts.map +1 -1
  53. package/dist/constants/errors.d.ts +4 -4
  54. package/dist/constants/errors.d.ts.map +1 -1
  55. package/dist/constants/messages.d.ts +1 -1
  56. package/dist/constants/warnings.d.ts +2 -2
  57. package/dist/constants/warnings.d.ts.map +1 -1
  58. package/dist/containers/QuoteInfo/QuoteInfo.d.ts +4 -0
  59. package/dist/containers/QuoteInfo/QuoteInfo.d.ts.map +1 -0
  60. package/dist/containers/QuoteInfo/QuoteInfo.styles.d.ts +472 -0
  61. package/dist/containers/QuoteInfo/QuoteInfo.styles.d.ts.map +1 -0
  62. package/dist/containers/QuoteInfo/QuoteInfo.types.d.ts +17 -0
  63. package/dist/containers/QuoteInfo/QuoteInfo.types.d.ts.map +1 -0
  64. package/dist/containers/QuoteInfo/index.d.ts +2 -0
  65. package/dist/containers/QuoteInfo/index.d.ts.map +1 -0
  66. package/dist/hooks/useConfirmSwap/index.d.ts +2 -0
  67. package/dist/hooks/useConfirmSwap/index.d.ts.map +1 -0
  68. package/dist/hooks/useConfirmSwap/useConfirmSwap.d.ts +3 -0
  69. package/dist/hooks/useConfirmSwap/useConfirmSwap.d.ts.map +1 -0
  70. package/dist/hooks/useConfirmSwap/useConfirmSwap.helpers.d.ts +16 -0
  71. package/dist/hooks/useConfirmSwap/useConfirmSwap.helpers.d.ts.map +1 -0
  72. package/dist/hooks/{useConfirmSwap.d.ts → useConfirmSwap/useConfirmSwap.types.d.ts} +5 -7
  73. package/dist/hooks/useConfirmSwap/useConfirmSwap.types.d.ts.map +1 -0
  74. package/dist/hooks/{useFetchBestRoute.d.ts → useFetchQuote.d.ts} +3 -3
  75. package/dist/hooks/useFetchQuote.d.ts.map +1 -0
  76. package/dist/hooks/usePrepareBlockchainList/usePrepareBlockchainList.helpers.d.ts +2 -2
  77. package/dist/hooks/useSwapInput.d.ts +4 -2
  78. package/dist/hooks/useSwapInput.d.ts.map +1 -1
  79. package/dist/index.js +1 -1
  80. package/dist/index.js.map +4 -4
  81. package/dist/pages/ConfirmSwapPage.d.ts.map +1 -1
  82. package/dist/pages/Home.d.ts.map +1 -1
  83. package/dist/store/app.d.ts +2 -2
  84. package/dist/store/{bestRoute.d.ts → quote.d.ts} +25 -20
  85. package/dist/store/quote.d.ts.map +1 -0
  86. package/dist/types/index.d.ts +1 -1
  87. package/dist/types/index.d.ts.map +1 -1
  88. package/dist/types/quote.d.ts +82 -0
  89. package/dist/types/quote.d.ts.map +1 -0
  90. package/dist/utils/numbers.d.ts +1 -1
  91. package/dist/utils/numbers.d.ts.map +1 -1
  92. package/dist/utils/{routing.d.ts → quote.d.ts} +16 -12
  93. package/dist/utils/quote.d.ts.map +1 -0
  94. package/dist/utils/settings.d.ts +1 -1
  95. package/dist/utils/swap.d.ts +22 -20
  96. package/dist/utils/swap.d.ts.map +1 -1
  97. package/dist/utils/wallets.d.ts +1 -1
  98. package/package.json +2 -2
  99. package/src/components/BlockchainsSection/BlockchainsSection.tsx +3 -3
  100. package/src/components/ConfirmWalletsModal/ConfirmWallets.helpers.ts +2 -64
  101. package/src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx +23 -26
  102. package/src/components/ConfirmWalletsModal/ConfirmWalletsModal.types.ts +1 -1
  103. package/src/components/LoadingSwapDetails/LoadingSwapDetails.styles.ts +3 -3
  104. package/src/components/LoadingSwapDetails/LoadingSwapDetails.tsx +6 -6
  105. package/src/components/{NoRoutes/NoRoutes.helper.ts → NoResult/NoResult.helpers.ts} +16 -9
  106. package/src/components/{NoRoutes/NoRoutes.styles.ts → NoResult/NoResult.styles.ts} +2 -0
  107. package/src/components/{NoRoutes/NoRoutes.tsx → NoResult/NoResult.tsx} +7 -12
  108. package/src/components/{NoRoutes/NoRoutes.types.ts → NoResult/NoResult.types.ts} +3 -2
  109. package/src/components/NoResult/index.ts +1 -0
  110. package/src/components/Quote/Quote.styles.ts +212 -0
  111. package/src/components/Quote/Quote.tsx +347 -0
  112. package/src/components/Quote/Quote.types.ts +16 -0
  113. package/src/components/Quote/QuoteSkeleton.styles.ts +110 -0
  114. package/src/components/Quote/QuoteSkeleton.tsx +108 -0
  115. package/src/components/Quote/QuoteSkeleton.types.ts +5 -0
  116. package/src/components/Quote/QuoteSummary.styles.ts +15 -0
  117. package/src/components/Quote/QuoteSummary.tsx +46 -0
  118. package/src/components/Quote/index.ts +3 -0
  119. package/src/components/QuoteWarningsAndErrors/HighValueLossWarningModal.tsx +107 -0
  120. package/src/components/{RouteErrors/RouteErrorsModalItem.tsx → QuoteWarningsAndErrors/QuoteErrorsModalItem.tsx} +3 -3
  121. package/src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.ts +67 -0
  122. package/src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.tsx +103 -0
  123. package/src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.types.ts +24 -0
  124. package/src/components/QuoteWarningsAndErrors/SlippageWariningModal.tsx +77 -0
  125. package/src/components/QuoteWarningsAndErrors/UnknownPriceWarningModal.tsx +38 -0
  126. package/src/components/QuoteWarningsAndErrors/index.ts +1 -0
  127. package/src/components/SwapDetails/SwapDetails.Placeholder.tsx +1 -1
  128. package/src/components/SwapDetails/SwapDetails.tsx +13 -16
  129. package/src/components/SwitchFromAndTo.tsx +2 -2
  130. package/src/components/UpdateUrl.tsx +12 -12
  131. package/src/constants/errors.ts +8 -10
  132. package/src/constants/messages.ts +1 -1
  133. package/src/constants/warnings.ts +7 -7
  134. package/src/containers/QuoteInfo/QuoteInfo.styles.ts +15 -0
  135. package/src/containers/QuoteInfo/QuoteInfo.tsx +97 -0
  136. package/src/containers/QuoteInfo/QuoteInfo.types.ts +17 -0
  137. package/src/containers/QuoteInfo/index.ts +1 -0
  138. package/src/hooks/useConfirmSwap/index.ts +1 -0
  139. package/src/hooks/useConfirmSwap/useConfirmSwap.helpers.ts +168 -0
  140. package/src/hooks/useConfirmSwap/useConfirmSwap.ts +136 -0
  141. package/src/hooks/useConfirmSwap/useConfirmSwap.types.ts +19 -0
  142. package/src/hooks/{useFetchBestRoute.ts → useFetchQuote.ts} +3 -3
  143. package/src/hooks/useNavigateBack.ts +3 -3
  144. package/src/hooks/useSwapInput.ts +57 -23
  145. package/src/hooks/useSyncStoresWithConfig.ts +2 -2
  146. package/src/pages/ConfirmSwapPage.tsx +58 -227
  147. package/src/pages/HistoryPage.tsx +1 -1
  148. package/src/pages/Home.tsx +52 -241
  149. package/src/pages/LanguagePage.tsx +1 -1
  150. package/src/pages/LiquiditySourcePage.tsx +1 -1
  151. package/src/pages/SelectBlockchainPage.tsx +3 -3
  152. package/src/pages/SelectSwapItemsPage.tsx +2 -2
  153. package/src/pages/SettingsPage.tsx +1 -1
  154. package/src/pages/ThemePage.tsx +1 -1
  155. package/src/pages/WalletsPage.tsx +1 -1
  156. package/src/store/{bestRoute.ts → quote.ts} +42 -38
  157. package/src/types/index.ts +1 -1
  158. package/src/types/quote.ts +107 -0
  159. package/src/utils/numbers.ts +1 -1
  160. package/src/utils/quote.ts +338 -0
  161. package/src/utils/swap.ts +99 -69
  162. package/src/utils/wallets.ts +2 -2
  163. package/dist/components/NoRoutes/NoRoutes.d.ts +0 -4
  164. package/dist/components/NoRoutes/NoRoutes.d.ts.map +0 -1
  165. package/dist/components/NoRoutes/NoRoutes.helper.d.ts +0 -3
  166. package/dist/components/NoRoutes/NoRoutes.helper.d.ts.map +0 -1
  167. package/dist/components/NoRoutes/NoRoutes.types.d.ts.map +0 -1
  168. package/dist/components/NoRoutes/index.d.ts +0 -2
  169. package/dist/components/NoRoutes/index.d.ts.map +0 -1
  170. package/dist/components/RouteErrors/RouteErrors.d.ts +0 -4
  171. package/dist/components/RouteErrors/RouteErrors.d.ts.map +0 -1
  172. package/dist/components/RouteErrors/RouteErrors.styles.d.ts.map +0 -1
  173. package/dist/components/RouteErrors/RouteErrors.types.d.ts +0 -24
  174. package/dist/components/RouteErrors/RouteErrors.types.d.ts.map +0 -1
  175. package/dist/components/RouteErrors/RouteErrorsModal.d.ts +0 -4
  176. package/dist/components/RouteErrors/RouteErrorsModal.d.ts.map +0 -1
  177. package/dist/components/RouteErrors/RouteErrorsModalItem.d.ts +0 -4
  178. package/dist/components/RouteErrors/RouteErrorsModalItem.d.ts.map +0 -1
  179. package/dist/components/RouteErrors/index.d.ts +0 -2
  180. package/dist/components/RouteErrors/index.d.ts.map +0 -1
  181. package/dist/hooks/useConfirmSwap.d.ts.map +0 -1
  182. package/dist/hooks/useFetchBestRoute.d.ts.map +0 -1
  183. package/dist/store/bestRoute.d.ts.map +0 -1
  184. package/dist/types/routing.d.ts +0 -65
  185. package/dist/types/routing.d.ts.map +0 -1
  186. package/dist/utils/routing.d.ts.map +0 -1
  187. package/src/components/NoRoutes/index.ts +0 -1
  188. package/src/components/RouteErrors/RouteErrors.tsx +0 -79
  189. package/src/components/RouteErrors/RouteErrors.types.ts +0 -29
  190. package/src/components/RouteErrors/RouteErrorsModal.tsx +0 -129
  191. package/src/components/RouteErrors/index.ts +0 -1
  192. package/src/hooks/useConfirmSwap.ts +0 -303
  193. package/src/types/routing.ts +0 -77
  194. package/src/utils/routing.ts +0 -321
  195. /package/src/components/{RouteErrors/RouteErrors.styles.ts → QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.ts} +0 -0
@@ -0,0 +1,107 @@
1
+ import type { HighValueLossWarning } from '../../types';
2
+
3
+ import { i18n } from '@lingui/core';
4
+ import {
5
+ Button,
6
+ Divider,
7
+ MessageBox,
8
+ Modal,
9
+ Typography,
10
+ WarningIcon,
11
+ } from '@rango-dev/ui';
12
+ import React from 'react';
13
+
14
+ import { errorMessages } from '../../constants/errors';
15
+ import {
16
+ GAS_FEE_MAX_DECIMALS,
17
+ GAS_FEE_MIN_DECIMALS,
18
+ PERCENTAGE_CHANGE_MAX_DECIMALS,
19
+ PERCENTAGE_CHANGE_MIN_DECIMALS,
20
+ USD_VALUE_MAX_DECIMALS,
21
+ USD_VALUE_MIN_DECIMALS,
22
+ } from '../../constants/routing';
23
+ import { getContainer } from '../../utils/common';
24
+ import { numberToString } from '../../utils/numbers';
25
+
26
+ import { QuoteErrorsModalItem } from './QuoteErrorsModalItem';
27
+ import { Flex } from './QuoteWarningsAndErrors.styles';
28
+
29
+ type Props = {
30
+ open: boolean;
31
+ onClose: () => void;
32
+ onConfirm: () => void;
33
+ warning: HighValueLossWarning;
34
+ };
35
+
36
+ export function HighValueLossWarningModal(props: Props) {
37
+ const { open, onClose, onConfirm, warning } = props;
38
+ const type = warning.warningLevel === 'high' ? 'error' : 'warning';
39
+ const highValueLossData = [
40
+ {
41
+ title: i18n.t('Swapping'),
42
+ value: numberToString(
43
+ warning.inputUsdValue,
44
+ USD_VALUE_MIN_DECIMALS,
45
+ USD_VALUE_MAX_DECIMALS
46
+ ),
47
+ },
48
+ {
49
+ title: i18n.t('Gas cost'),
50
+ value: numberToString(
51
+ warning.totalFee,
52
+ GAS_FEE_MIN_DECIMALS,
53
+ GAS_FEE_MAX_DECIMALS
54
+ ),
55
+ },
56
+ {
57
+ title: i18n.t('Receiving'),
58
+ value: numberToString(
59
+ warning.outputUsdValue,
60
+ USD_VALUE_MIN_DECIMALS,
61
+ USD_VALUE_MAX_DECIMALS
62
+ ),
63
+ },
64
+ {
65
+ title: i18n.t('Price impact'),
66
+ value: numberToString(
67
+ warning.priceImpact,
68
+ PERCENTAGE_CHANGE_MIN_DECIMALS,
69
+ PERCENTAGE_CHANGE_MAX_DECIMALS
70
+ ),
71
+ valueColor: `${type}500`,
72
+ },
73
+ ];
74
+
75
+ return (
76
+ <Modal open={open} onClose={onClose} container={getContainer()}>
77
+ <MessageBox
78
+ type={type}
79
+ title={errorMessages().highValueLossError.impactTitle}
80
+ description={errorMessages().highValueLossError.description}
81
+ />
82
+
83
+ <Flex>
84
+ <Divider size={20} />
85
+ <Typography size="small" variant="title">
86
+ {i18n.t('Details')}
87
+ </Typography>
88
+ <Flex>
89
+ {highValueLossData.map((item, index) => {
90
+ const key = index;
91
+ return <QuoteErrorsModalItem key={key} {...item} />;
92
+ })}
93
+ </Flex>
94
+ </Flex>
95
+
96
+ <Divider size={32} />
97
+ <Button
98
+ type="primary"
99
+ size="large"
100
+ prefix={<WarningIcon />}
101
+ fullWidth
102
+ onClick={onConfirm}>
103
+ {errorMessages().highValueLossError.confirmMessage}
104
+ </Button>
105
+ </Modal>
106
+ );
107
+ }
@@ -1,11 +1,11 @@
1
- import type { ModalContentData } from './RouteErrors.types';
1
+ import type { ModalContentData } from './QuoteWarningsAndErrors.types';
2
2
 
3
3
  import { Typography } from '@rango-dev/ui';
4
4
  import React from 'react';
5
5
 
6
- import { Item } from './RouteErrors.styles';
6
+ import { Item } from './QuoteWarningsAndErrors.styles';
7
7
 
8
- export function RouteErrorsModalItem(props: ModalContentData) {
8
+ export function QuoteErrorsModalItem(props: ModalContentData) {
9
9
  const { title, value, valueColor } = props;
10
10
 
11
11
  return (
@@ -0,0 +1,67 @@
1
+ import type {
2
+ BridgeLimitError,
3
+ InsufficientSlippageError,
4
+ QuoteWarning,
5
+ } from '../../types';
6
+
7
+ import { i18n } from '@lingui/core';
8
+
9
+ import { errorMessages } from '../../constants/errors';
10
+ import { QuoteErrorType, QuoteWarningType } from '../../types';
11
+ import { getPriceImpactLevel } from '../../utils/quote';
12
+
13
+ type AlertInfo = {
14
+ alertType: 'error' | 'warning';
15
+ title: string;
16
+ action: 'show-info' | 'change-settings' | null;
17
+ };
18
+
19
+ export function makeAlerts(
20
+ warning: QuoteWarning | null,
21
+ error: BridgeLimitError | InsufficientSlippageError | null
22
+ ): AlertInfo | null {
23
+ const alertInfo: AlertInfo = {
24
+ alertType: 'warning',
25
+ title: '',
26
+ action: 'show-info',
27
+ };
28
+ if (warning) {
29
+ if (warning.type === QuoteWarningType.HIGH_VALUE_LOSS) {
30
+ const warningLevel = getPriceImpactLevel(warning.priceImpact);
31
+ if (warningLevel === 'high') {
32
+ alertInfo.alertType = 'error';
33
+ }
34
+ alertInfo.title = errorMessages().highValueLossError.title;
35
+ }
36
+ if (warning.type === QuoteWarningType.UNKNOWN_PRICE) {
37
+ alertInfo.title = errorMessages().unknownPriceError.title;
38
+ }
39
+ if (warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) {
40
+ alertInfo.title = i18n.t({
41
+ id: 'minimum required slippage for this route: {minRequiredSlippage}',
42
+ values: {
43
+ minRequiredSlippage: warning.minRequiredSlippage,
44
+ },
45
+ });
46
+ }
47
+ if (warning.type === QuoteWarningType.HIGH_SLIPPAGE) {
48
+ alertInfo.title = i18n.t('Caution, your slippage is high');
49
+ }
50
+ return alertInfo;
51
+ }
52
+ if (error) {
53
+ alertInfo.alertType = 'error';
54
+ if (error.type === QuoteErrorType.BRIDGE_LIMIT) {
55
+ alertInfo.title = error.recommendation;
56
+ alertInfo.action = null;
57
+ }
58
+
59
+ if (error.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE) {
60
+ alertInfo.title = '';
61
+ alertInfo.action = 'change-settings';
62
+ }
63
+
64
+ return alertInfo;
65
+ }
66
+ return null;
67
+ }
@@ -0,0 +1,103 @@
1
+ import type { PropTypes } from './QuoteWarningsAndErrors.types';
2
+
3
+ import { i18n } from '@lingui/core';
4
+ import { Alert, Button, InfoIcon } from '@rango-dev/ui';
5
+ import React from 'react';
6
+ import { useNavigate } from 'react-router-dom';
7
+
8
+ import { navigationRoutes } from '../../constants/navigationRoutes';
9
+ import { QuoteErrorType, QuoteWarningType } from '../../types';
10
+ import { NoResult } from '../NoResult';
11
+
12
+ import { HighValueLossWarningModal } from './HighValueLossWarningModal';
13
+ import { makeAlerts } from './QuoteWarningsAndErrors.helpers';
14
+ import { Action, Alerts } from './QuoteWarningsAndErrors.styles';
15
+ import { SlippageWarningModal } from './SlippageWariningModal';
16
+ import { UnknownPriceWarningModal } from './UnknownPriceWarningModal';
17
+
18
+ export function QuoteWarningsAndErrors(props: PropTypes) {
19
+ const {
20
+ warning,
21
+ error,
22
+ refetchQuote,
23
+ showWarningModal,
24
+ onOpenWarningModal,
25
+ onCloseWarningModal,
26
+ onConfirmWarningModal,
27
+ } = props;
28
+
29
+ const navigate = useNavigate();
30
+
31
+ const warningModalHandlers = {
32
+ open: showWarningModal,
33
+ onClose: onCloseWarningModal,
34
+ onConfirm: onConfirmWarningModal,
35
+ };
36
+
37
+ const showNoResultMessage =
38
+ error?.type === QuoteErrorType.NO_RESULT ||
39
+ error?.type === QuoteErrorType.REQUEST_FAILED;
40
+
41
+ const alertInfo = makeAlerts(
42
+ warning,
43
+ error?.type === QuoteErrorType.BRIDGE_LIMIT ||
44
+ error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE
45
+ ? error
46
+ : null
47
+ );
48
+
49
+ const showAlerts = !!alertInfo;
50
+
51
+ return (
52
+ <>
53
+ {showNoResultMessage && <NoResult error={error} fetch={refetchQuote} />}
54
+
55
+ {showAlerts && (
56
+ <Alerts>
57
+ <Alert
58
+ title={alertInfo.title}
59
+ type={alertInfo.alertType}
60
+ variant="alarm"
61
+ action={
62
+ alertInfo.action === 'show-info' ? (
63
+ <Action onClick={onOpenWarningModal}>
64
+ <InfoIcon size={12} color="gray" />
65
+ </Action>
66
+ ) : (
67
+ <Button
68
+ size="xsmall"
69
+ type={'error'}
70
+ onClick={() => navigate(navigationRoutes.settings)}>
71
+ {i18n.t('Change Settings')}
72
+ </Button>
73
+ )
74
+ }
75
+ />
76
+ </Alerts>
77
+ )}
78
+
79
+ {warning && (
80
+ <>
81
+ {warning.type === QuoteWarningType.HIGH_VALUE_LOSS && (
82
+ <HighValueLossWarningModal
83
+ {...warningModalHandlers}
84
+ warning={warning}
85
+ />
86
+ )}
87
+
88
+ {(warning.type === QuoteWarningType.HIGH_SLIPPAGE ||
89
+ warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) && (
90
+ <SlippageWarningModal {...warningModalHandlers} warning={warning} />
91
+ )}
92
+
93
+ {warning.type === QuoteWarningType.UNKNOWN_PRICE && (
94
+ <UnknownPriceWarningModal
95
+ {...warningModalHandlers}
96
+ warning={warning}
97
+ />
98
+ )}
99
+ </>
100
+ )}
101
+ </>
102
+ );
103
+ }
@@ -0,0 +1,24 @@
1
+ import type { QuoteError, QuoteWarning } from '../../types';
2
+
3
+ export interface PropTypes {
4
+ loading: boolean;
5
+ error: QuoteError | null;
6
+ warning: QuoteWarning | null;
7
+ showWarningModal: boolean;
8
+ refetchQuote: () => void;
9
+ onOpenWarningModal: () => void;
10
+ onCloseWarningModal: () => void;
11
+ onConfirmWarningModal: () => void;
12
+ }
13
+
14
+ type ModalPropTypesKeys = keyof Omit<PropTypes, 'extraSpace' | 'loading'>;
15
+
16
+ export type ModalPropTypes = Pick<PropTypes, ModalPropTypesKeys> & {
17
+ open: boolean;
18
+ };
19
+
20
+ export interface ModalContentData {
21
+ title: string;
22
+ value: string;
23
+ valueColor?: string;
24
+ }
@@ -0,0 +1,77 @@
1
+ import type {
2
+ HighSlippageWarning,
3
+ InsufficientSlippageWarning,
4
+ } from '../../types';
5
+
6
+ import { i18n } from '@lingui/core';
7
+ import { Button, Divider, MessageBox, Modal, Typography } from '@rango-dev/ui';
8
+ import React from 'react';
9
+ import { useNavigate } from 'react-router-dom';
10
+
11
+ import { navigationRoutes } from '../../constants/navigationRoutes';
12
+ import { useSettingsStore } from '../../store/settings';
13
+ import { QuoteWarningType } from '../../types';
14
+ import { getContainer } from '../../utils/common';
15
+
16
+ type PropsTypes = {
17
+ open: boolean;
18
+ onClose: () => void;
19
+ onConfirm: () => void;
20
+ warning: InsufficientSlippageWarning | HighSlippageWarning;
21
+ };
22
+
23
+ export function SlippageWarningModal(props: PropsTypes) {
24
+ const { customSlippage, slippage } = useSettingsStore();
25
+ const { open, onClose, onConfirm, warning } = props;
26
+ const navigate = useNavigate();
27
+ const userSlippage = customSlippage ?? slippage;
28
+ return (
29
+ <Modal
30
+ anchor="bottom"
31
+ open={open}
32
+ prefix={
33
+ <Button
34
+ size="small"
35
+ variant="ghost"
36
+ onClick={() => navigate('/' + navigationRoutes.settings)}>
37
+ <Typography variant="label" size="medium" color="$neutral900">
38
+ {i18n.t('Change settings')}
39
+ </Typography>
40
+ </Button>
41
+ }
42
+ container={getContainer()}
43
+ onClose={onClose}>
44
+ <MessageBox
45
+ type="warning"
46
+ title={
47
+ warning.type === QuoteWarningType.HIGH_SLIPPAGE
48
+ ? i18n.t('High slippage')
49
+ : i18n.t('Low slippage')
50
+ }
51
+ description={
52
+ warning.type === QuoteWarningType.HIGH_SLIPPAGE
53
+ ? i18n.t({
54
+ id: ' Caution, your slippage is high (={userSlippage}). Your trade may be front run.',
55
+ values: { userSlippage },
56
+ })
57
+ : i18n.t({
58
+ id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',
59
+ values: {
60
+ minRequiredSlippage: warning.minRequiredSlippage,
61
+ },
62
+ })
63
+ }>
64
+ <Divider size={18} />
65
+ <Divider size={32} />
66
+ <Button
67
+ size="large"
68
+ type="primary"
69
+ variant="contained"
70
+ fullWidth
71
+ onClick={onConfirm}>
72
+ {i18n.t('Confirm anyway')}
73
+ </Button>
74
+ </MessageBox>
75
+ </Modal>
76
+ );
77
+ }
@@ -0,0 +1,38 @@
1
+ import type { UnknownPriceWarning } from '../../types';
2
+
3
+ import { Button, Divider, MessageBox, Modal, WarningIcon } from '@rango-dev/ui';
4
+ import React from 'react';
5
+
6
+ import { errorMessages } from '../../constants/errors';
7
+ import { getContainer } from '../../utils/common';
8
+
9
+ type Props = {
10
+ open: boolean;
11
+ onClose: () => void;
12
+ onConfirm: () => void;
13
+ warning: UnknownPriceWarning;
14
+ };
15
+
16
+ export function UnknownPriceWarningModal(props: Props) {
17
+ const { open, onClose, onConfirm } = props;
18
+
19
+ return (
20
+ <Modal open={open} onClose={onClose} container={getContainer()}>
21
+ <MessageBox
22
+ type="warning"
23
+ title={errorMessages().unknownPriceError.impactTitle}
24
+ description={errorMessages().unknownPriceError.description}
25
+ />
26
+
27
+ <Divider size={32} />
28
+ <Button
29
+ type="primary"
30
+ size="large"
31
+ prefix={<WarningIcon />}
32
+ fullWidth
33
+ onClick={onConfirm}>
34
+ {errorMessages().unknownPriceError.confirmMessage}
35
+ </Button>
36
+ </Modal>
37
+ );
38
+ }
@@ -0,0 +1 @@
1
+ export { QuoteWarningsAndErrors } from './QuoteWarningsAndErrors';
@@ -31,7 +31,7 @@ export function SwapDetailsPlaceholder(props: SwapDetailsPlaceholderPropTypes) {
31
31
  noPadding
32
32
  header={{
33
33
  title: i18n.t('Swap and Bridge'),
34
- onBack: navigateBackFrom.bind(null, navigationRoutes.swapDetails),
34
+ onBack: () => navigateBackFrom(navigationRoutes.swapDetails),
35
35
  suffix: <SuffixContainer />,
36
36
  }}>
37
37
  {showSkeleton && (
@@ -13,8 +13,7 @@ import {
13
13
  CopyIcon,
14
14
  Divider,
15
15
  IconButton,
16
- RouteCost,
17
- RouteSummary,
16
+ QuoteCost,
18
17
  StepDetails,
19
18
  Typography,
20
19
  useCopyToClipboard,
@@ -35,18 +34,17 @@ import {
35
34
  USD_VALUE_MIN_DECIMALS,
36
35
  } from '../../constants/routing';
37
36
  import { useNavigateBack } from '../../hooks/useNavigateBack';
38
- import { useBestRouteStore } from '../../store/bestRoute';
39
37
  import { useMetaStore } from '../../store/meta';
40
38
  import { useNotificationStore } from '../../store/notification';
39
+ import { useQuoteStore } from '../../store/quote';
41
40
  import {
42
41
  numberToString,
43
42
  secondsToString,
44
43
  totalArrivalTime,
45
44
  } from '../../utils/numbers';
46
- import { getPriceImpactLevel } from '../../utils/routing';
45
+ import { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';
47
46
  import {
48
47
  getLastConvertedTokenInFailedSwap,
49
- getPercentageChange,
50
48
  getSwapMessages,
51
49
  shouldRetrySwap,
52
50
  } from '../../utils/swap';
@@ -54,6 +52,7 @@ import { getSwapDate } from '../../utils/time';
54
52
  import { getConciseAddress, getUsdPrice } from '../../utils/wallets';
55
53
  import { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';
56
54
  import { Layout } from '../Layout';
55
+ import { QuoteSummary } from '../Quote';
57
56
  import {
58
57
  SwapDetailsCompleteModal,
59
58
  SwapDetailsModal,
@@ -65,7 +64,7 @@ import { Container, HeaderDetails, StepsList } from './SwapDetails.styles';
65
64
  export function SwapDetails(props: SwapDetailsProps) {
66
65
  const { swap, requestId, onDelete, onCancel: onCancelProps } = props;
67
66
  const { canSwitchNetworkTo, connect, getWalletInfo } = useWallets();
68
- const retry = useBestRouteStore.use.retry();
67
+ const retry = useQuoteStore.use.retry();
69
68
  const navigate = useNavigate();
70
69
  const { navigateBackFrom } = useNavigateBack();
71
70
  const [_, handleCopy] = useCopyToClipboard(RESET_INTERVAL);
@@ -201,7 +200,7 @@ export function SwapDetails(props: SwapDetailsProps) {
201
200
  USD_VALUE_MAX_DECIMALS
202
201
  );
203
202
 
204
- const percentageChange = getPercentageChange(inputUsdValue, outputUsdValue);
203
+ const percentageChange = getPriceImpact(inputUsdValue, outputUsdValue);
205
204
 
206
205
  const completeModalDesc =
207
206
  swap.status === 'success'
@@ -239,7 +238,7 @@ export function SwapDetails(props: SwapDetailsProps) {
239
238
  noPadding
240
239
  header={{
241
240
  title: i18n.t('Swap and Bridge'),
242
- onBack: navigateBackFrom.bind(null, navigationRoutes.swapDetails),
241
+ onBack: () => navigateBackFrom(navigationRoutes.swapDetails),
243
242
  onCancel:
244
243
  swap.status === 'running' ? () => setModalState('cancel') : undefined,
245
244
  suffix: swap.status !== 'running' && (
@@ -302,7 +301,7 @@ export function SwapDetails(props: SwapDetailsProps) {
302
301
  </HeaderDetails>
303
302
 
304
303
  <div className="output">
305
- <RouteCost
304
+ <QuoteCost
306
305
  fee={numberToString(
307
306
  String(totalFee),
308
307
  GAS_FEE_MIN_DECIMALS,
@@ -311,7 +310,7 @@ export function SwapDetails(props: SwapDetailsProps) {
311
310
  time={secondsToString(totalArrivalTime(swap.steps))}
312
311
  steps={numberOfSteps}
313
312
  />
314
- <RouteSummary
313
+ <QuoteSummary
315
314
  from={{
316
315
  price: {
317
316
  value: numberToString(
@@ -349,13 +348,11 @@ export function SwapDetails(props: SwapDetailsProps) {
349
348
  },
350
349
  }}
351
350
  percentageChange={numberToString(
352
- percentageChange,
351
+ String(percentageChange),
353
352
  PERCENTAGE_CHANGE_MIN_DECIMALS,
354
353
  PERCENTAGE_CHANGE_MAX_DECIMALS
355
354
  )}
356
- warningLevel={getPriceImpactLevel(
357
- percentageChange?.toNumber() ?? 0
358
- )}
355
+ warningLevel={getPriceImpactLevel(percentageChange ?? 0)}
359
356
  />
360
357
  </div>
361
358
  <div className="title-steps">
@@ -377,7 +374,7 @@ export function SwapDetails(props: SwapDetailsProps) {
377
374
  <StepDetails
378
375
  key={key}
379
376
  step={step}
380
- type="route-progress"
377
+ type="swap-progress"
381
378
  ref={listRef}
382
379
  state={state}
383
380
  hasSeparator={index !== 0}
@@ -409,7 +406,7 @@ export function SwapDetails(props: SwapDetailsProps) {
409
406
  )}
410
407
  usdValue={outputUsdValue}
411
408
  percentageChange={numberToString(
412
- percentageChange,
409
+ String(percentageChange),
413
410
  PERCENTAGE_CHANGE_MIN_DECIMALS,
414
411
  PERCENTAGE_CHANGE_MAX_DECIMALS
415
412
  )}
@@ -1,7 +1,7 @@
1
1
  import { ReverseIcon, styled } from '@rango-dev/ui';
2
2
  import React from 'react';
3
3
 
4
- import { useBestRouteStore } from '../store/bestRoute';
4
+ import { useQuoteStore } from '../store/quote';
5
5
 
6
6
  const SwitchButtonContainer = styled('div', {
7
7
  position: 'absolute',
@@ -27,7 +27,7 @@ const StyledButton = styled('div', {
27
27
  });
28
28
 
29
29
  export function SwitchFromAndToButton() {
30
- const switchFromAndTo = useBestRouteStore.use.switchFromAndTo();
30
+ const switchFromAndTo = useQuoteStore.use.switchFromAndTo();
31
31
 
32
32
  return (
33
33
  <SwitchButtonContainer>
@@ -10,10 +10,10 @@ import {
10
10
  import { navigationRoutes } from '../constants/navigationRoutes';
11
11
  import { SearchParams } from '../constants/searchParams';
12
12
  import { useSyncStoresWithConfig } from '../hooks/useSyncStoresWithConfig';
13
- import { useBestRouteStore } from '../store/bestRoute';
14
13
  import { useMetaStore } from '../store/meta';
14
+ import { useQuoteStore } from '../store/quote';
15
15
  import { useUiStore } from '../store/ui';
16
- import { searchParamsToToken } from '../utils/routing';
16
+ import { searchParamsToToken } from '../utils/quote';
17
17
 
18
18
  type Props = { config: WidgetConfig | undefined };
19
19
 
@@ -23,16 +23,16 @@ export function UpdateUrl(props: Props) {
23
23
  const location = useLocation();
24
24
  const firstRenderSearchParams = useRef(location.search);
25
25
  const searchParamsRef = useRef<Record<string, string>>({});
26
- const fromBlockchain = useBestRouteStore.use.fromBlockchain();
27
- const toBlockchain = useBestRouteStore.use.toBlockchain();
28
- const fromToken = useBestRouteStore.use.fromToken();
29
- const toToken = useBestRouteStore.use.toToken();
30
- const setFromBlockchain = useBestRouteStore.use.setFromBlockchain();
31
- const setFromToken = useBestRouteStore.use.setFromToken();
32
- const setToBlockchain = useBestRouteStore.use.setToBlockchain();
33
- const setToToken = useBestRouteStore.use.setToToken();
34
- const inputAmount = useBestRouteStore.use.inputAmount();
35
- const setInputAmount = useBestRouteStore.use.setInputAmount();
26
+ const fromBlockchain = useQuoteStore.use.fromBlockchain();
27
+ const toBlockchain = useQuoteStore.use.toBlockchain();
28
+ const fromToken = useQuoteStore.use.fromToken();
29
+ const toToken = useQuoteStore.use.toToken();
30
+ const setFromBlockchain = useQuoteStore.use.setFromBlockchain();
31
+ const setFromToken = useQuoteStore.use.setFromToken();
32
+ const setToBlockchain = useQuoteStore.use.setToBlockchain();
33
+ const setToToken = useQuoteStore.use.setToToken();
34
+ const inputAmount = useQuoteStore.use.inputAmount();
35
+ const setInputAmount = useQuoteStore.use.setInputAmount();
36
36
  const loadingStatus = useMetaStore.use.loadingStatus();
37
37
  const { blockchains, tokens } = useMetaStore.use.meta();
38
38
  const setSelectedSwap = useUiStore.use.setSelectedSwap();
@@ -1,8 +1,8 @@
1
- import type { ConfirmSwapError } from '../types';
1
+ import type { QuoteError } from '../types';
2
2
 
3
3
  import { i18n } from '@lingui/core';
4
4
 
5
- import { ConfirmSwapErrorTypes } from '../types';
5
+ import { QuoteErrorType } from '../types';
6
6
 
7
7
  export const errorMessages = () => {
8
8
  return {
@@ -13,7 +13,7 @@ export const errorMessages = () => {
13
13
  'You have limited the liquidity sources and this might result in Rango finding no routes. Please consider resetting your liquidity sources'
14
14
  ),
15
15
  },
16
- noRoutesError: {
16
+ noResultError: {
17
17
  title: i18n.t('No Routes Found'),
18
18
  description: i18n.t(
19
19
  "Reasons why Rango couldn't find a route: low liquidity on token, very low input amount or no routes available for the selected input/output token combination."
@@ -31,7 +31,7 @@ export const errorMessages = () => {
31
31
  ),
32
32
  confirmMessage: i18n.t('Confirm High price impact'),
33
33
  },
34
- routeUpdatedWithHighValueLoss: {
34
+ quoteUpdatedWithHighValueLoss: {
35
35
  title: i18n.t(
36
36
  'Route updated and price impact is too high, try again later!'
37
37
  ),
@@ -47,14 +47,12 @@ export const errorMessages = () => {
47
47
  };
48
48
  };
49
49
 
50
- export function getConfirmSwapErrorMessage(error: ConfirmSwapError) {
50
+ export function getQuoteErrorMessage(error: QuoteError) {
51
51
  switch (error.type) {
52
- case ConfirmSwapErrorTypes.NO_ROUTE:
53
- return error.diagnosisMessage ?? errorMessages().noRoutesError.title;
54
- case ConfirmSwapErrorTypes.REQUEST_FAILED:
52
+ case QuoteErrorType.NO_RESULT:
53
+ return error.diagnosisMessage ?? errorMessages().noResultError.title;
54
+ case QuoteErrorType.REQUEST_FAILED:
55
55
  return errorMessages().genericServerError;
56
- case ConfirmSwapErrorTypes.ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS:
57
- return errorMessages().routeUpdatedWithHighValueLoss.title;
58
56
  default:
59
57
  return '';
60
58
  }
@@ -5,6 +5,6 @@ export const swapButtonTitles = () => {
5
5
  connectWallet: i18n.t('Connect Wallet'),
6
6
  swap: i18n.t('Swap'),
7
7
  swapAnyway: i18n.t('Swap anyway'),
8
- ethRouteWarning: i18n.t('The route goes through Ethereum. Continue?'),
8
+ ethWarning: i18n.t('The route goes through Ethereum. Continue?'),
9
9
  };
10
10
  };