@lifi/widget 4.1.0 → 4.2.0

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 (204) hide show
  1. package/dist/esm/AppDefault.js +14 -0
  2. package/dist/esm/AppDefault.js.map +1 -1
  3. package/dist/esm/components/AmountInput/AmountInput.js +2 -1
  4. package/dist/esm/components/AmountInput/AmountInput.js.map +1 -1
  5. package/dist/esm/components/AmountInput/AmountInputEndAdornment.js +4 -2
  6. package/dist/esm/components/AmountInput/AmountInputEndAdornment.js.map +1 -1
  7. package/dist/esm/components/AmountInput/AmountInputEndAdornment.style.js +1 -1
  8. package/dist/esm/components/AmountInput/AmountInputEndAdornment.style.js.map +1 -1
  9. package/dist/esm/components/AmountInput/PriceFormHelperText.js +4 -2
  10. package/dist/esm/components/AmountInput/PriceFormHelperText.js.map +1 -1
  11. package/dist/esm/components/AmountInputCard/AmountInputCard.style.js +98 -0
  12. package/dist/esm/components/AmountInputCard/AmountInputCard.style.js.map +1 -0
  13. package/dist/esm/components/AmountInputCard/AmountInputCardPair.js +25 -0
  14. package/dist/esm/components/AmountInputCard/AmountInputCardPair.js.map +1 -0
  15. package/dist/esm/components/AmountInputCard/BalanceDisplay.js +35 -0
  16. package/dist/esm/components/AmountInputCard/BalanceDisplay.js.map +1 -0
  17. package/dist/esm/components/AmountInputCard/BalanceDisplay.style.js +11 -0
  18. package/dist/esm/components/AmountInputCard/BalanceDisplay.style.js.map +1 -0
  19. package/dist/esm/components/AmountInputCard/FiatValueToggle.js +41 -0
  20. package/dist/esm/components/AmountInputCard/FiatValueToggle.js.map +1 -0
  21. package/dist/esm/components/AmountInputCard/PercentageChips.js +80 -0
  22. package/dist/esm/components/AmountInputCard/PercentageChips.js.map +1 -0
  23. package/dist/esm/components/AmountInputCard/PercentageChips.style.js +43 -0
  24. package/dist/esm/components/AmountInputCard/PercentageChips.style.js.map +1 -0
  25. package/dist/esm/components/AmountInputCard/ReceiveAmountCard.js +137 -0
  26. package/dist/esm/components/AmountInputCard/ReceiveAmountCard.js.map +1 -0
  27. package/dist/esm/components/AmountInputCard/SendAmountCard.js +102 -0
  28. package/dist/esm/components/AmountInputCard/SendAmountCard.js.map +1 -0
  29. package/dist/esm/components/Avatar/Avatar.js +12 -3
  30. package/dist/esm/components/Avatar/Avatar.js.map +1 -1
  31. package/dist/esm/components/Chains/VirtualizedChainList.js +2 -1
  32. package/dist/esm/components/Chains/VirtualizedChainList.js.map +1 -1
  33. package/dist/esm/components/Header/HeaderNavigationTabs.js +14 -1
  34. package/dist/esm/components/Header/HeaderNavigationTabs.js.map +1 -1
  35. package/dist/esm/components/IconCircle/IconCircle.style.js +1 -1
  36. package/dist/esm/components/LimitOrderSettings/LimitOrderSettings.js +99 -0
  37. package/dist/esm/components/LimitOrderSettings/LimitOrderSettings.js.map +1 -0
  38. package/dist/esm/components/LimitOrderSettings/LimitOrderSettings.style.js +52 -0
  39. package/dist/esm/components/LimitOrderSettings/LimitOrderSettings.style.js.map +1 -0
  40. package/dist/esm/components/LimitPriceCard/LimitPriceCard.js +115 -0
  41. package/dist/esm/components/LimitPriceCard/LimitPriceCard.js.map +1 -0
  42. package/dist/esm/components/LimitPriceCard/LimitPriceCard.style.js +89 -0
  43. package/dist/esm/components/LimitPriceCard/LimitPriceCard.style.js.map +1 -0
  44. package/dist/esm/components/LimitPriceCard/LimitPricePresets.js +91 -0
  45. package/dist/esm/components/LimitPriceCard/LimitPricePresets.js.map +1 -0
  46. package/dist/esm/components/RouteCard/RouteProviderCard.js +118 -0
  47. package/dist/esm/components/RouteCard/RouteProviderCard.js.map +1 -0
  48. package/dist/esm/components/Routes/LimitOrderRoutes.js +34 -0
  49. package/dist/esm/components/Routes/LimitOrderRoutes.js.map +1 -0
  50. package/dist/esm/components/Routes/Routes.js +2 -2
  51. package/dist/esm/components/Routes/Routes.js.map +1 -1
  52. package/dist/esm/components/SettingsPanel/SettingsPanel.js +51 -0
  53. package/dist/esm/components/SettingsPanel/SettingsPanel.js.map +1 -0
  54. package/dist/esm/components/SettingsPanel/SettingsPanel.style.js +33 -0
  55. package/dist/esm/components/SettingsPanel/SettingsPanel.style.js.map +1 -0
  56. package/dist/esm/components/SettingsPanel/utils.js +14 -0
  57. package/dist/esm/components/SettingsPanel/utils.js.map +1 -0
  58. package/dist/esm/components/SwapButton/SwapButton.js +50 -0
  59. package/dist/esm/components/SwapButton/SwapButton.js.map +1 -0
  60. package/dist/esm/components/SwapButton/SwapButton.style.js +24 -0
  61. package/dist/esm/components/SwapButton/SwapButton.style.js.map +1 -0
  62. package/dist/esm/components/TokenPillButton/TokenPillButton.js +52 -0
  63. package/dist/esm/components/TokenPillButton/TokenPillButton.js.map +1 -0
  64. package/dist/esm/components/TokenPillButton/TokenPillButton.style.js +39 -0
  65. package/dist/esm/components/TokenPillButton/TokenPillButton.style.js.map +1 -0
  66. package/dist/esm/config/version.d.ts +1 -1
  67. package/dist/esm/config/version.js +1 -1
  68. package/dist/esm/config/version.js.map +1 -1
  69. package/dist/esm/hooks/useChainSearch.js +2 -1
  70. package/dist/esm/hooks/useChainSearch.js.map +1 -1
  71. package/dist/esm/hooks/useLimitMarketRate.js +24 -0
  72. package/dist/esm/hooks/useLimitMarketRate.js.map +1 -0
  73. package/dist/esm/hooks/useLinkedLimitFields.js +49 -0
  74. package/dist/esm/hooks/useLinkedLimitFields.js.map +1 -0
  75. package/dist/esm/hooks/useRoutes.js +23 -6
  76. package/dist/esm/hooks/useRoutes.js.map +1 -1
  77. package/dist/esm/hooks/useTokens.js +16 -14
  78. package/dist/esm/hooks/useTokens.js.map +1 -1
  79. package/dist/esm/hooks/useWideVariant.js +5 -2
  80. package/dist/esm/hooks/useWideVariant.js.map +1 -1
  81. package/dist/esm/i18n/en.json +22 -0
  82. package/dist/esm/index.d.ts +2 -2
  83. package/dist/esm/pages/MainPage/LimitPageContent.js +23 -0
  84. package/dist/esm/pages/MainPage/LimitPageContent.js.map +1 -0
  85. package/dist/esm/pages/MainPage/MainPage.js +19 -22
  86. package/dist/esm/pages/MainPage/MainPage.js.map +1 -1
  87. package/dist/esm/pages/MainPage/MainPageActions.js +28 -0
  88. package/dist/esm/pages/MainPage/MainPageActions.js.map +1 -0
  89. package/dist/esm/pages/MainPage/ReviewButton.js +9 -2
  90. package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
  91. package/dist/esm/pages/RoutePriorityPage.js +48 -0
  92. package/dist/esm/pages/RoutePriorityPage.js.map +1 -0
  93. package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js +2 -2
  94. package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js.map +1 -1
  95. package/dist/esm/pages/SettingsPage/RoutePrioritySettings.js +12 -27
  96. package/dist/esm/pages/SettingsPage/RoutePrioritySettings.js.map +1 -1
  97. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippagePage.js +133 -0
  98. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippagePage.js.map +1 -0
  99. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js +14 -72
  100. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js.map +1 -1
  101. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js +26 -14
  102. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js.map +1 -1
  103. package/dist/esm/pages/SettingsPage/ThemeSettings.js +4 -0
  104. package/dist/esm/pages/SettingsPage/ThemeSettings.js.map +1 -1
  105. package/dist/esm/pages/TransactionPage/TransactionReview.js +4 -1
  106. package/dist/esm/pages/TransactionPage/TransactionReview.js.map +1 -1
  107. package/dist/esm/providers/I18nProvider/I18nProvider.js +1 -1
  108. package/dist/esm/providers/I18nProvider/enResource.d.ts +1 -1
  109. package/dist/esm/providers/I18nProvider/enResource.js +1 -1
  110. package/dist/esm/providers/I18nProvider/types.d.ts +2 -2
  111. package/dist/esm/providers/SDKClientProvider.js +25 -24
  112. package/dist/esm/providers/SDKClientProvider.js.map +1 -1
  113. package/dist/esm/providers/WidgetProvider/WidgetProvider.js +22 -21
  114. package/dist/esm/providers/WidgetProvider/WidgetProvider.js.map +1 -1
  115. package/dist/esm/stores/form/URLSearchParamsBuilder.js +14 -3
  116. package/dist/esm/stores/form/URLSearchParamsBuilder.js.map +1 -1
  117. package/dist/esm/stores/form/createFormStore.js +6 -2
  118. package/dist/esm/stores/form/createFormStore.js.map +1 -1
  119. package/dist/esm/stores/form/getDefaultValuesFromQueryString.js +3 -0
  120. package/dist/esm/stores/form/getDefaultValuesFromQueryString.js.map +1 -1
  121. package/dist/esm/stores/form/types.d.ts +9 -1
  122. package/dist/esm/stores/form/types.d.ts.map +1 -1
  123. package/dist/esm/stores/form/types.js.map +1 -1
  124. package/dist/esm/stores/form/useClearAmountFields.js +1 -0
  125. package/dist/esm/stores/form/useClearAmountFields.js.map +1 -1
  126. package/dist/esm/stores/navigationTabs/useNavigationTabsStore.js +4 -2
  127. package/dist/esm/stores/navigationTabs/useNavigationTabsStore.js.map +1 -1
  128. package/dist/esm/stores/navigationTabs/utils.js +38 -8
  129. package/dist/esm/stores/navigationTabs/utils.js.map +1 -1
  130. package/dist/esm/types/events.d.ts +10 -1
  131. package/dist/esm/types/events.d.ts.map +1 -1
  132. package/dist/esm/types/events.js +2 -0
  133. package/dist/esm/types/events.js.map +1 -1
  134. package/dist/esm/types/widget.d.ts +9 -0
  135. package/dist/esm/types/widget.d.ts.map +1 -1
  136. package/dist/esm/types/widget.js.map +1 -1
  137. package/dist/esm/utils/format.d.ts +1 -1
  138. package/dist/esm/utils/format.d.ts.map +1 -1
  139. package/dist/esm/utils/format.js +2 -2
  140. package/dist/esm/utils/format.js.map +1 -1
  141. package/dist/esm/utils/limitOrder.js +61 -0
  142. package/dist/esm/utils/limitOrder.js.map +1 -0
  143. package/dist/esm/utils/navigationRoutes.d.ts +2 -0
  144. package/dist/esm/utils/navigationRoutes.d.ts.map +1 -1
  145. package/dist/esm/utils/navigationRoutes.js +6 -0
  146. package/dist/esm/utils/navigationRoutes.js.map +1 -1
  147. package/package.json +11 -11
  148. package/src/AppDefault.tsx +16 -0
  149. package/src/components/AmountInput/AmountInputEndAdornment.style.ts +1 -1
  150. package/src/components/AmountInput/AmountInputEndAdornment.tsx +5 -2
  151. package/src/components/AmountInputCard/AmountInputCard.style.tsx +157 -0
  152. package/src/components/AmountInputCard/AmountInputCardPair.tsx +25 -0
  153. package/src/components/AmountInputCard/BalanceDisplay.style.tsx +9 -0
  154. package/src/components/AmountInputCard/BalanceDisplay.tsx +46 -0
  155. package/src/components/AmountInputCard/FiatValueToggle.tsx +55 -0
  156. package/src/components/AmountInputCard/PercentageChips.style.tsx +60 -0
  157. package/src/components/AmountInputCard/PercentageChips.tsx +100 -0
  158. package/src/components/AmountInputCard/ReceiveAmountCard.tsx +219 -0
  159. package/src/components/AmountInputCard/SendAmountCard.tsx +179 -0
  160. package/src/components/Avatar/Avatar.tsx +8 -3
  161. package/src/components/Header/HeaderNavigationTabs.tsx +19 -2
  162. package/src/components/LimitOrderSettings/LimitOrderSettings.style.tsx +69 -0
  163. package/src/components/LimitOrderSettings/LimitOrderSettings.tsx +124 -0
  164. package/src/components/LimitPriceCard/LimitPriceCard.style.tsx +103 -0
  165. package/src/components/LimitPriceCard/LimitPriceCard.tsx +153 -0
  166. package/src/components/LimitPriceCard/LimitPricePresets.tsx +139 -0
  167. package/src/components/RouteCard/RouteProviderCard.tsx +113 -0
  168. package/src/components/Routes/LimitOrderRoutes.tsx +64 -0
  169. package/src/components/Routes/Routes.tsx +3 -2
  170. package/src/components/SettingsPanel/SettingsPanel.style.tsx +41 -0
  171. package/src/components/SettingsPanel/SettingsPanel.tsx +73 -0
  172. package/src/components/SettingsPanel/utils.ts +27 -0
  173. package/src/components/SwapButton/SwapButton.style.tsx +28 -0
  174. package/src/components/SwapButton/SwapButton.tsx +71 -0
  175. package/src/components/TokenPillButton/TokenPillButton.style.tsx +50 -0
  176. package/src/components/TokenPillButton/TokenPillButton.tsx +81 -0
  177. package/src/config/version.ts +1 -1
  178. package/src/hooks/useLimitMarketRate.ts +39 -0
  179. package/src/hooks/useLinkedLimitFields.ts +74 -0
  180. package/src/hooks/useRoutes.ts +45 -4
  181. package/src/hooks/useWideVariant.ts +8 -2
  182. package/src/pages/MainPage/LimitPageContent.tsx +18 -0
  183. package/src/pages/MainPage/MainPage.tsx +43 -30
  184. package/src/pages/MainPage/MainPageActions.tsx +35 -0
  185. package/src/pages/MainPage/ReviewButton.tsx +13 -1
  186. package/src/pages/RoutePriorityPage.tsx +55 -0
  187. package/src/pages/SettingsPage/RoutePrioritySettings.tsx +14 -38
  188. package/src/pages/SettingsPage/SlippageSettings/SlippagePage.tsx +176 -0
  189. package/src/pages/SettingsPage/SlippageSettings/SlippageSettings.style.tsx +32 -25
  190. package/src/pages/SettingsPage/SlippageSettings/SlippageSettings.tsx +14 -128
  191. package/src/pages/SettingsPage/ThemeSettings.tsx +4 -0
  192. package/src/stores/form/URLSearchParamsBuilder.tsx +25 -3
  193. package/src/stores/form/createFormStore.ts +7 -3
  194. package/src/stores/form/getDefaultValuesFromQueryString.ts +11 -0
  195. package/src/stores/form/types.ts +14 -1
  196. package/src/stores/form/useClearAmountFields.ts +1 -0
  197. package/src/stores/navigationTabs/types.ts +6 -0
  198. package/src/stores/navigationTabs/useNavigationTabsStore.tsx +8 -3
  199. package/src/stores/navigationTabs/utils.ts +67 -5
  200. package/src/types/events.ts +12 -0
  201. package/src/types/widget.ts +9 -0
  202. package/src/utils/format.ts +6 -2
  203. package/src/utils/limitOrder.ts +88 -0
  204. package/src/utils/navigationRoutes.ts +6 -0
@@ -3,6 +3,7 @@ import "../../types/events.js";
3
3
  import { useWidgetConfig } from "../../providers/WidgetProvider/WidgetProvider.js";
4
4
  import { navigationRoutes } from "../../utils/navigationRoutes.js";
5
5
  import { useSplitMode } from "../../stores/navigationTabs/useNavigationTabsStore.js";
6
+ import { useFieldValues } from "../../stores/form/useFieldValues.js";
6
7
  import { useRoutes } from "../../hooks/useRoutes.js";
7
8
  import { useToAddressRequirements } from "../../hooks/useToAddressRequirements.js";
8
9
  import { BaseTransactionButton } from "../../components/BaseTransactionButton/BaseTransactionButton.js";
@@ -18,7 +19,8 @@ const ReviewButton = () => {
18
19
  const splitState = useSplitMode();
19
20
  const { toAddress, requiredToAddress } = useToAddressRequirements();
20
21
  const { routes, setReviewableRoute } = useRoutes();
21
- const currentRoute = routes?.[0];
22
+ const [selectedRouteId] = useFieldValues("selectedRouteId");
23
+ const currentRoute = (mode === "limit" ? routes?.find((route) => route.id === selectedRouteId) : void 0) ?? routes?.[0];
22
24
  const handleClick = async () => {
23
25
  if (!currentRoute) return;
24
26
  setReviewableRoute(currentRoute);
@@ -35,11 +37,16 @@ const ReviewButton = () => {
35
37
  if (currentRoute) switch (mode) {
36
38
  case "custom": return t(`button.${modeOptions?.custom?.type ?? "checkout"}Review`);
37
39
  case "refuel": return t("button.getGas");
38
- default: return t(`button.${currentRoute.fromChainId === currentRoute.toChainId ? "swap" : "bridge"}Review`);
40
+ case "limit": return t("button.review");
41
+ default: {
42
+ const transactionType = currentRoute.fromChainId === currentRoute.toChainId ? "swap" : "bridge";
43
+ return t(`button.${transactionType}Review`);
44
+ }
39
45
  }
40
46
  switch (mode) {
41
47
  case "custom": return modeOptions?.custom?.type === "deposit" ? t("button.deposit") : t("button.buy");
42
48
  case "refuel": return t("button.getGas");
49
+ case "limit": return t("button.review");
43
50
  case "split":
44
51
  if (splitState) return t(`button.${splitState}`);
45
52
  return t("button.exchange");
@@ -1 +1 @@
1
- {"version":3,"file":"ReviewButton.js","names":[],"sources":["../../../../src/pages/MainPage/ReviewButton.tsx"],"sourcesContent":["import { useNavigate } from '@tanstack/react-router'\nimport { useTranslation } from 'react-i18next'\nimport { BaseTransactionButton } from '../../components/BaseTransactionButton/BaseTransactionButton.js'\nimport { useRoutes } from '../../hooks/useRoutes.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useWidgetEvents } from '../../hooks/useWidgetEvents.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useSplitMode } from '../../stores/navigationTabs/useNavigationTabsStore.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\n\nexport const ReviewButton: React.FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const emitter = useWidgetEvents()\n const { mode, modeOptions } = useWidgetConfig()\n const splitState = useSplitMode()\n const { toAddress, requiredToAddress } = useToAddressRequirements()\n const { routes, setReviewableRoute } = useRoutes()\n\n const currentRoute = routes?.[0]\n\n const handleClick = async () => {\n if (!currentRoute) {\n return\n }\n\n setReviewableRoute(currentRoute)\n navigate({\n to: navigationRoutes.transactionExecution,\n search: { routeId: currentRoute.id },\n })\n emitter.emit(WidgetEvent.RouteSelected, {\n route: currentRoute,\n routes: routes!,\n })\n }\n\n const getButtonText = (): string => {\n if (currentRoute) {\n switch (mode) {\n case 'custom':\n return t(`button.${modeOptions?.custom?.type ?? 'checkout'}Review`)\n case 'refuel':\n return t('button.getGas')\n default: {\n const transactionType =\n currentRoute.fromChainId === currentRoute.toChainId\n ? 'swap'\n : 'bridge'\n return t(`button.${transactionType}Review`)\n }\n }\n }\n switch (mode) {\n case 'custom':\n return modeOptions?.custom?.type === 'deposit'\n ? t('button.deposit')\n : t('button.buy')\n case 'refuel':\n return t('button.getGas')\n case 'split':\n if (splitState) {\n return t(`button.${splitState}`)\n }\n return t('button.exchange')\n default:\n return t('button.exchange')\n }\n }\n\n return (\n <BaseTransactionButton\n text={getButtonText()}\n onClick={handleClick}\n disabled={currentRoute && requiredToAddress && !toAddress}\n route={currentRoute}\n sx={{ flex: 1 }}\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,qBAA+B;CAC1C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,gBAAgB;CAChC,MAAM,EAAE,MAAM,gBAAgB,gBAAgB;CAC9C,MAAM,aAAa,aAAa;CAChC,MAAM,EAAE,WAAW,sBAAsB,yBAAyB;CAClE,MAAM,EAAE,QAAQ,uBAAuB,UAAU;CAEjD,MAAM,eAAe,SAAS;CAE9B,MAAM,cAAc,YAAY;EAC9B,IAAI,CAAC,cACH;EAGF,mBAAmB,YAAY;EAC/B,SAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,EAAE,SAAS,aAAa,GAAG;EACrC,CAAC;EACD,QAAQ,KAAA,iBAAgC;GACtC,OAAO;GACC;EACV,CAAC;CACH;CAEA,MAAM,sBAA8B;EAClC,IAAI,cACF,QAAQ,MAAR;GACE,KAAK,UACH,OAAO,EAAE,UAAU,aAAa,QAAQ,QAAQ,WAAW,OAAO;GACpE,KAAK,UACH,OAAO,EAAE,eAAe;GAC1B,SAKE,OAAO,EAAE,UAHP,aAAa,gBAAgB,aAAa,YACtC,SACA,SAC6B,OAAO;EAE9C;EAEF,QAAQ,MAAR;GACE,KAAK,UACH,OAAO,aAAa,QAAQ,SAAS,YACjC,EAAE,gBAAgB,IAClB,EAAE,YAAY;GACpB,KAAK,UACH,OAAO,EAAE,eAAe;GAC1B,KAAK;IACH,IAAI,YACF,OAAO,EAAE,UAAU,YAAY;IAEjC,OAAO,EAAE,iBAAiB;GAC5B,SACE,OAAO,EAAE,iBAAiB;EAC9B;CACF;CAEA,OACE,oBAAC,uBAAD;EACE,MAAM,cAAc;EACpB,SAAS;EACT,UAAU,gBAAgB,qBAAqB,CAAC;EAChD,OAAO;EACP,IAAI,EAAE,MAAM,EAAE;CACf,CAAA;AAEL"}
1
+ {"version":3,"file":"ReviewButton.js","names":[],"sources":["../../../../src/pages/MainPage/ReviewButton.tsx"],"sourcesContent":["import { useNavigate } from '@tanstack/react-router'\nimport { useTranslation } from 'react-i18next'\nimport { BaseTransactionButton } from '../../components/BaseTransactionButton/BaseTransactionButton.js'\nimport { useRoutes } from '../../hooks/useRoutes.js'\nimport { useToAddressRequirements } from '../../hooks/useToAddressRequirements.js'\nimport { useWidgetEvents } from '../../hooks/useWidgetEvents.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldValues } from '../../stores/form/useFieldValues.js'\nimport { useSplitMode } from '../../stores/navigationTabs/useNavigationTabsStore.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\n\nexport const ReviewButton: React.FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const emitter = useWidgetEvents()\n const { mode, modeOptions } = useWidgetConfig()\n const splitState = useSplitMode()\n const { toAddress, requiredToAddress } = useToAddressRequirements()\n const { routes, setReviewableRoute } = useRoutes()\n const [selectedRouteId] = useFieldValues('selectedRouteId')\n\n // The provider pick only applies in limit mode (it's the only flow that sets\n // it). Honoring it in other modes would be wrong, since provider/tool keys\n // can collide across modes. Everywhere else, fall back to the best route.\n const currentRoute =\n (mode === 'limit'\n ? routes?.find((route) => route.id === selectedRouteId)\n : undefined) ?? routes?.[0]\n\n const handleClick = async () => {\n if (!currentRoute) {\n return\n }\n\n setReviewableRoute(currentRoute)\n navigate({\n to: navigationRoutes.transactionExecution,\n search: { routeId: currentRoute.id },\n })\n emitter.emit(WidgetEvent.RouteSelected, {\n route: currentRoute,\n routes: routes!,\n })\n }\n\n const getButtonText = (): string => {\n if (currentRoute) {\n switch (mode) {\n case 'custom':\n return t(`button.${modeOptions?.custom?.type ?? 'checkout'}Review`)\n case 'refuel':\n return t('button.getGas')\n case 'limit':\n return t('button.review')\n default: {\n const transactionType =\n currentRoute.fromChainId === currentRoute.toChainId\n ? 'swap'\n : 'bridge'\n return t(`button.${transactionType}Review`)\n }\n }\n }\n switch (mode) {\n case 'custom':\n return modeOptions?.custom?.type === 'deposit'\n ? t('button.deposit')\n : t('button.buy')\n case 'refuel':\n return t('button.getGas')\n case 'limit':\n return t('button.review')\n case 'split':\n if (splitState) {\n return t(`button.${splitState}`)\n }\n return t('button.exchange')\n default:\n return t('button.exchange')\n }\n }\n\n return (\n <BaseTransactionButton\n text={getButtonText()}\n onClick={handleClick}\n disabled={currentRoute && requiredToAddress && !toAddress}\n route={currentRoute}\n sx={{ flex: 1 }}\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,MAAa,qBAA+B;CAC1C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,gBAAgB;CAChC,MAAM,EAAE,MAAM,gBAAgB,gBAAgB;CAC9C,MAAM,aAAa,aAAa;CAChC,MAAM,EAAE,WAAW,sBAAsB,yBAAyB;CAClE,MAAM,EAAE,QAAQ,uBAAuB,UAAU;CACjD,MAAM,CAAC,mBAAmB,eAAe,iBAAiB;CAK1D,MAAM,gBACH,SAAS,UACN,QAAQ,MAAM,UAAU,MAAM,OAAO,eAAe,IACpD,KAAA,MAAc,SAAS;CAE7B,MAAM,cAAc,YAAY;EAC9B,IAAI,CAAC,cACH;EAGF,mBAAmB,YAAY;EAC/B,SAAS;GACP,IAAI,iBAAiB;GACrB,QAAQ,EAAE,SAAS,aAAa,GAAG;EACrC,CAAC;EACD,QAAQ,KAAA,iBAAgC;GACtC,OAAO;GACC;EACV,CAAC;CACH;CAEA,MAAM,sBAA8B;EAClC,IAAI,cACF,QAAQ,MAAR;GACE,KAAK,UACH,OAAO,EAAE,UAAU,aAAa,QAAQ,QAAQ,WAAW,OAAO;GACpE,KAAK,UACH,OAAO,EAAE,eAAe;GAC1B,KAAK,SACH,OAAO,EAAE,eAAe;GAC1B,SAAS;IACP,MAAM,kBACJ,aAAa,gBAAgB,aAAa,YACtC,SACA;IACN,OAAO,EAAE,UAAU,gBAAgB,OAAO;GAC5C;EACF;EAEF,QAAQ,MAAR;GACE,KAAK,UACH,OAAO,aAAa,QAAQ,SAAS,YACjC,EAAE,gBAAgB,IAClB,EAAE,YAAY;GACpB,KAAK,UACH,OAAO,EAAE,eAAe;GAC1B,KAAK,SACH,OAAO,EAAE,eAAe;GAC1B,KAAK;IACH,IAAI,YACF,OAAO,EAAE,UAAU,YAAY;IAEjC,OAAO,EAAE,iBAAiB;GAC5B,SACE,OAAO,EAAE,iBAAiB;EAC9B;CACF;CAEA,OACE,oBAAC,uBAAD;EACE,MAAM,cAAc;EACpB,SAAS;EACT,UAAU,gBAAgB,qBAAqB,CAAC;EAChD,OAAO;EACP,IAAI,EAAE,MAAM,EAAE;CACf,CAAA;AAEL"}
@@ -0,0 +1,48 @@
1
+ import { useSettingsActions } from "../stores/settings/useSettingsActions.js";
2
+ import { PageContainer } from "../components/PageContainer.js";
3
+ import { useSettings } from "../stores/settings/useSettings.js";
4
+ import { useHeader } from "../hooks/useHeader.js";
5
+ import { useListHeight } from "../hooks/useListHeight.js";
6
+ import { ListItemText as ListItemText$1 } from "../components/ListItemText.js";
7
+ import { SettingsListItemButton } from "../components/SettingsListItemButton.js";
8
+ import { useRef } from "react";
9
+ import { List } from "@mui/material";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ import { useTranslation } from "react-i18next";
12
+ import Check from "@mui/icons-material/Check";
13
+ //#region src/pages/RoutePriorityPage.tsx
14
+ const routePriorities = ["CHEAPEST", "FASTEST"];
15
+ const RoutePriorityPage = () => {
16
+ const { t } = useTranslation();
17
+ const { setValue } = useSettingsActions();
18
+ const { routePriority } = useSettings(["routePriority"]);
19
+ const listParentRef = useRef(null);
20
+ const { listHeight } = useListHeight({ listParentRef });
21
+ useHeader(t("settings.routePriority"));
22
+ return /* @__PURE__ */ jsx(PageContainer, {
23
+ disableGutters: true,
24
+ children: /* @__PURE__ */ jsx(List, {
25
+ className: "long-list",
26
+ ref: listParentRef,
27
+ style: {
28
+ height: listHeight,
29
+ overflow: "auto"
30
+ },
31
+ sx: { padding: 1.5 },
32
+ children: routePriorities.map((priority) => {
33
+ const key = priority.toLowerCase();
34
+ return /* @__PURE__ */ jsxs(SettingsListItemButton, {
35
+ onClick: () => setValue("routePriority", priority),
36
+ children: [/* @__PURE__ */ jsx(ListItemText$1, {
37
+ primary: t(`settings.routePriorityOptions.${key}.title`),
38
+ secondary: t(`settings.routePriorityOptions.${key}.description`)
39
+ }), routePriority === priority && /* @__PURE__ */ jsx(Check, { color: "primary" })]
40
+ }, priority);
41
+ })
42
+ })
43
+ });
44
+ };
45
+ //#endregion
46
+ export { RoutePriorityPage };
47
+
48
+ //# sourceMappingURL=RoutePriorityPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoutePriorityPage.js","names":["ListItemText"],"sources":["../../../src/pages/RoutePriorityPage.tsx"],"sourcesContent":["import type { Order } from '@lifi/sdk'\nimport Check from '@mui/icons-material/Check'\nimport { List } from '@mui/material'\nimport { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ListItemText } from '../components/ListItemText.js'\nimport { PageContainer } from '../components/PageContainer.js'\nimport { SettingsListItemButton } from '../components/SettingsListItemButton.js'\nimport { useHeader } from '../hooks/useHeader.js'\nimport { useListHeight } from '../hooks/useListHeight.js'\nimport { useSettings } from '../stores/settings/useSettings.js'\nimport { useSettingsActions } from '../stores/settings/useSettingsActions.js'\n\nconst routePriorities: Order[] = ['CHEAPEST', 'FASTEST']\n\nexport const RoutePriorityPage: React.FC = () => {\n const { t } = useTranslation()\n const { setValue } = useSettingsActions()\n const { routePriority } = useSettings(['routePriority'])\n const listParentRef = useRef<HTMLUListElement | null>(null)\n const { listHeight } = useListHeight({ listParentRef })\n\n useHeader(t('settings.routePriority'))\n\n return (\n <PageContainer disableGutters>\n <List\n className=\"long-list\"\n ref={listParentRef}\n style={{ height: listHeight, overflow: 'auto' }}\n sx={{\n padding: 1.5,\n }}\n >\n {routePriorities.map((priority) => {\n const key = priority.toLowerCase()\n return (\n <SettingsListItemButton\n key={priority}\n onClick={() => setValue('routePriority', priority)}\n >\n <ListItemText\n primary={t(`settings.routePriorityOptions.${key}.title` as any)}\n secondary={t(\n `settings.routePriorityOptions.${key}.description` as any\n )}\n />\n {routePriority === priority && <Check color=\"primary\" />}\n </SettingsListItemButton>\n )\n })}\n </List>\n </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,MAAM,kBAA2B,CAAC,YAAY,SAAS;AAEvD,MAAa,0BAAoC;CAC/C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,EAAE,aAAa,mBAAmB;CACxC,MAAM,EAAE,kBAAkB,YAAY,CAAC,eAAe,CAAC;CACvD,MAAM,gBAAgB,OAAgC,IAAI;CAC1D,MAAM,EAAE,eAAe,cAAc,EAAE,cAAc,CAAC;CAEtD,UAAU,EAAE,wBAAwB,CAAC;CAErC,OACE,oBAAC,eAAD;EAAe,gBAAA;YACb,oBAAC,MAAD;GACE,WAAU;GACV,KAAK;GACL,OAAO;IAAE,QAAQ;IAAY,UAAU;GAAO;GAC9C,IAAI,EACF,SAAS,IACX;aAEC,gBAAgB,KAAK,aAAa;IACjC,MAAM,MAAM,SAAS,YAAY;IACjC,OACE,qBAAC,wBAAD;KAEE,eAAe,SAAS,iBAAiB,QAAQ;eAFnD,CAIE,oBAACA,gBAAD;MACE,SAAS,EAAE,iCAAiC,IAAI,OAAc;MAC9D,WAAW,EACT,iCAAiC,IAAI,aACvC;KACD,CAAA,GACA,kBAAkB,YAAY,oBAAC,OAAD,EAAO,OAAM,UAAW,CAAA,CACjC;OAVjB,QAUiB;GAE5B,CAAC;EACG,CAAA;CACO,CAAA;AAEnB"}
@@ -7,12 +7,12 @@ import { BadgedValue } from "./SettingsCard/BadgedValue.js";
7
7
  import { useNavigate } from "@tanstack/react-router";
8
8
  import { jsx } from "react/jsx-runtime";
9
9
  import { useTranslation } from "react-i18next";
10
+ import SwapHorizIcon from "@mui/icons-material/SwapHoriz";
10
11
  import AirlineStops from "@mui/icons-material/AirlineStops";
11
- import SwapHoriz from "@mui/icons-material/SwapHoriz";
12
12
  //#region src/pages/SettingsPage/BridgeAndExchangeSettings.tsx
13
13
  const supportedIcons = {
14
14
  Bridges: AirlineStops,
15
- Exchanges: SwapHoriz
15
+ Exchanges: SwapHorizIcon
16
16
  };
17
17
  const BridgeAndExchangeSettings = ({ type }) => {
18
18
  const { isBridgesChanged, isExchangesChanged } = useSettingMonitor();
@@ -1 +1 @@
1
- {"version":3,"file":"BridgeAndExchangeSettings.js","names":[],"sources":["../../../../src/pages/SettingsPage/BridgeAndExchangeSettings.tsx"],"sourcesContent":["import AirlineStops from '@mui/icons-material/AirlineStops'\nimport SwapHoriz from '@mui/icons-material/SwapHoriz'\nimport { useNavigate } from '@tanstack/react-router'\nimport { useTranslation } from 'react-i18next'\nimport { CardButton } from '../../components/Card/CardButton.js'\nimport { useSettingMonitor } from '../../hooks/useSettingMonitor.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useSettingsStore } from '../../stores/settings/SettingsStore.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { BadgedValue } from './SettingsCard/BadgedValue.js'\n\nconst supportedIcons = {\n Bridges: AirlineStops,\n Exchanges: SwapHoriz,\n}\n\nexport const BridgeAndExchangeSettings: React.FC<{\n type: 'Bridges' | 'Exchanges'\n}> = ({ type }) => {\n const { isBridgesChanged, isExchangesChanged } = useSettingMonitor()\n const { t } = useTranslation()\n const navigate = useNavigate()\n const [enabledTools, tools] = useSettingsStore((state) => {\n const enabledTools = Object.values(state[`_enabled${type}`])\n return [enabledTools.filter(Boolean).length, enabledTools.length]\n })\n\n const { hiddenUI } = useWidgetConfig()\n\n if (type === 'Bridges' && hiddenUI?.bridgesSettings) {\n return null\n }\n\n const customisationLookUp = {\n Bridges: isBridgesChanged,\n Exchanges: isExchangesChanged,\n }\n\n const handleClick = () => {\n navigate({\n to: navigationRoutes[type.toLowerCase() as 'bridges' | 'exchanges'],\n })\n }\n\n const Icon = supportedIcons[type]\n\n return (\n <CardButton\n onClick={handleClick}\n icon={<Icon />}\n title={t(`settings.enabled${type}`)}\n >\n <BadgedValue\n badgeColor=\"info\"\n showBadge={customisationLookUp[type]}\n >{`${enabledTools}/${tools}`}</BadgedValue>\n </CardButton>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAWA,MAAM,iBAAiB;CACrB,SAAS;CACT,WAAW;AACb;AAEA,MAAa,6BAEP,EAAE,WAAW;CACjB,MAAM,EAAE,kBAAkB,uBAAuB,kBAAkB;CACnE,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,CAAC,cAAc,SAAS,kBAAkB,UAAU;EACxD,MAAM,eAAe,OAAO,OAAO,MAAM,WAAW,OAAO;EAC3D,OAAO,CAAC,aAAa,OAAO,OAAO,CAAC,CAAC,QAAQ,aAAa,MAAM;CAClE,CAAC;CAED,MAAM,EAAE,aAAa,gBAAgB;CAErC,IAAI,SAAS,aAAa,UAAU,iBAClC,OAAO;CAGT,MAAM,sBAAsB;EAC1B,SAAS;EACT,WAAW;CACb;CAEA,MAAM,oBAAoB;EACxB,SAAS,EACP,IAAI,iBAAiB,KAAK,YAAY,GACxC,CAAC;CACH;CAEA,MAAM,OAAO,eAAe;CAE5B,OACE,oBAAC,YAAD;EACE,SAAS;EACT,MAAM,oBAAC,MAAD,CAAO,CAAA;EACb,OAAO,EAAE,mBAAmB,MAAM;YAElC,oBAAC,aAAD;GACE,YAAW;GACX,WAAW,oBAAoB;aAC/B,GAAG,aAAa,GAAG;EAAqB,CAAA;CAChC,CAAA;AAEhB"}
1
+ {"version":3,"file":"BridgeAndExchangeSettings.js","names":["SwapHoriz"],"sources":["../../../../src/pages/SettingsPage/BridgeAndExchangeSettings.tsx"],"sourcesContent":["import AirlineStops from '@mui/icons-material/AirlineStops'\nimport SwapHoriz from '@mui/icons-material/SwapHoriz'\nimport { useNavigate } from '@tanstack/react-router'\nimport { useTranslation } from 'react-i18next'\nimport { CardButton } from '../../components/Card/CardButton.js'\nimport { useSettingMonitor } from '../../hooks/useSettingMonitor.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useSettingsStore } from '../../stores/settings/SettingsStore.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { BadgedValue } from './SettingsCard/BadgedValue.js'\n\nconst supportedIcons = {\n Bridges: AirlineStops,\n Exchanges: SwapHoriz,\n}\n\nexport const BridgeAndExchangeSettings: React.FC<{\n type: 'Bridges' | 'Exchanges'\n}> = ({ type }) => {\n const { isBridgesChanged, isExchangesChanged } = useSettingMonitor()\n const { t } = useTranslation()\n const navigate = useNavigate()\n const [enabledTools, tools] = useSettingsStore((state) => {\n const enabledTools = Object.values(state[`_enabled${type}`])\n return [enabledTools.filter(Boolean).length, enabledTools.length]\n })\n\n const { hiddenUI } = useWidgetConfig()\n\n if (type === 'Bridges' && hiddenUI?.bridgesSettings) {\n return null\n }\n\n const customisationLookUp = {\n Bridges: isBridgesChanged,\n Exchanges: isExchangesChanged,\n }\n\n const handleClick = () => {\n navigate({\n to: navigationRoutes[type.toLowerCase() as 'bridges' | 'exchanges'],\n })\n }\n\n const Icon = supportedIcons[type]\n\n return (\n <CardButton\n onClick={handleClick}\n icon={<Icon />}\n title={t(`settings.enabled${type}`)}\n >\n <BadgedValue\n badgeColor=\"info\"\n showBadge={customisationLookUp[type]}\n >{`${enabledTools}/${tools}`}</BadgedValue>\n </CardButton>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAWA,MAAM,iBAAiB;CACrB,SAAS;CACT,WAAWA;AACb;AAEA,MAAa,6BAEP,EAAE,WAAW;CACjB,MAAM,EAAE,kBAAkB,uBAAuB,kBAAkB;CACnE,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,CAAC,cAAc,SAAS,kBAAkB,UAAU;EACxD,MAAM,eAAe,OAAO,OAAO,MAAM,WAAW,OAAO;EAC3D,OAAO,CAAC,aAAa,OAAO,OAAO,CAAC,CAAC,QAAQ,aAAa,MAAM;CAClE,CAAC;CAED,MAAM,EAAE,aAAa,gBAAgB;CAErC,IAAI,SAAS,aAAa,UAAU,iBAClC,OAAO;CAGT,MAAM,sBAAsB;EAC1B,SAAS;EACT,WAAW;CACb;CAEA,MAAM,oBAAoB;EACxB,SAAS,EACP,IAAI,iBAAiB,KAAK,YAAY,GACxC,CAAC;CACH;CAEA,MAAM,OAAO,eAAe;CAE5B,OACE,oBAAC,YAAD;EACE,SAAS;EACT,MAAM,oBAAC,MAAD,CAAO,CAAA;EACb,OAAO,EAAE,mBAAmB,MAAM;YAElC,oBAAC,aAAD;GACE,YAAW;GACX,WAAW,oBAAoB;aAC/B,GAAG,aAAa,GAAG;EAAqB,CAAA;CAChC,CAAA;AAEhB"}
@@ -1,44 +1,29 @@
1
- import { useSettingsActions } from "../../stores/settings/useSettingsActions.js";
1
+ import { navigationRoutes } from "../../utils/navigationRoutes.js";
2
2
  import { useSettings } from "../../stores/settings/useSettings.js";
3
- import { CardTabs, Tab } from "../../components/Tabs/Tabs.style.js";
4
3
  import { useSettingMonitor } from "../../hooks/useSettingMonitor.js";
4
+ import { CardButton } from "../../components/Card/CardButton.js";
5
5
  import { BadgedValue } from "./SettingsCard/BadgedValue.js";
6
- import { SettingCardExpandable } from "./SettingsCard/SettingCardExpandable.js";
6
+ import { useNavigate } from "@tanstack/react-router";
7
7
  import { jsx } from "react/jsx-runtime";
8
8
  import { useTranslation } from "react-i18next";
9
9
  import Route from "@mui/icons-material/Route";
10
10
  //#region src/pages/SettingsPage/RoutePrioritySettings.tsx
11
- const Priorities = ["CHEAPEST", "FASTEST"];
12
11
  const RoutePrioritySettings = () => {
13
12
  const { t } = useTranslation();
14
- const { setValue } = useSettingsActions();
13
+ const navigate = useNavigate();
15
14
  const { isRoutePriorityChanged } = useSettingMonitor();
16
15
  const { routePriority } = useSettings(["routePriority"]);
17
- const currentRoutePriority = routePriority ?? "";
18
- const handleRoutePriorityChange = (_, routePriority) => {
19
- setValue("routePriority", routePriority);
16
+ const handleClick = () => {
17
+ navigate({ to: navigationRoutes.routePriority });
20
18
  };
21
- return /* @__PURE__ */ jsx(SettingCardExpandable, {
22
- value: /* @__PURE__ */ jsx(BadgedValue, {
23
- badgeColor: "info",
24
- showBadge: isRoutePriorityChanged,
25
- children: t(`main.tags.${currentRoutePriority.toLowerCase()}`)
26
- }),
19
+ return /* @__PURE__ */ jsx(CardButton, {
20
+ onClick: handleClick,
27
21
  icon: /* @__PURE__ */ jsx(Route, {}),
28
22
  title: t("settings.routePriority"),
29
- children: /* @__PURE__ */ jsx(CardTabs, {
30
- value: currentRoutePriority,
31
- "aria-label": "tabs",
32
- indicatorColor: "primary",
33
- onChange: handleRoutePriorityChange,
34
- sx: { mt: 1.5 },
35
- children: Priorities.map((priority) => {
36
- return /* @__PURE__ */ jsx(Tab, {
37
- label: t(`main.tags.${priority.toLowerCase()}`),
38
- value: priority,
39
- disableRipple: true
40
- }, priority);
41
- })
23
+ children: /* @__PURE__ */ jsx(BadgedValue, {
24
+ badgeColor: "info",
25
+ showBadge: isRoutePriorityChanged,
26
+ children: routePriority === "FASTEST" ? t("settings.routePriorityOptions.fastest.title") : t("settings.routePriorityOptions.cheapest.title")
42
27
  })
43
28
  });
44
29
  };
@@ -1 +1 @@
1
- {"version":3,"file":"RoutePrioritySettings.js","names":[],"sources":["../../../../src/pages/SettingsPage/RoutePrioritySettings.tsx"],"sourcesContent":["import type { Order } from '@lifi/sdk'\nimport Route from '@mui/icons-material/Route'\nimport { useTranslation } from 'react-i18next'\nimport { CardTabs, Tab } from '../../components/Tabs/Tabs.style.js'\nimport { useSettingMonitor } from '../../hooks/useSettingMonitor.js'\nimport { useSettings } from '../../stores/settings/useSettings.js'\nimport { useSettingsActions } from '../../stores/settings/useSettingsActions.js'\nimport { BadgedValue } from './SettingsCard/BadgedValue.js'\nimport { SettingCardExpandable } from './SettingsCard/SettingCardExpandable.js'\n\nconst Priorities: Order[] = ['CHEAPEST', 'FASTEST']\n\nexport const RoutePrioritySettings: React.FC = () => {\n const { t } = useTranslation()\n const { setValue } = useSettingsActions()\n const { isRoutePriorityChanged } = useSettingMonitor()\n const { routePriority } = useSettings(['routePriority'])\n const currentRoutePriority = routePriority ?? ''\n\n const handleRoutePriorityChange = (\n _: React.SyntheticEvent,\n routePriority: Order\n ) => {\n setValue('routePriority', routePriority)\n }\n\n return (\n <SettingCardExpandable\n value={\n <BadgedValue badgeColor=\"info\" showBadge={isRoutePriorityChanged}>\n {t(`main.tags.${currentRoutePriority.toLowerCase()}` as any)}\n </BadgedValue>\n }\n icon={<Route />}\n title={t('settings.routePriority')}\n >\n <CardTabs\n value={currentRoutePriority}\n aria-label=\"tabs\"\n indicatorColor=\"primary\"\n onChange={handleRoutePriorityChange}\n sx={{ mt: 1.5 }}\n >\n {Priorities.map((priority) => {\n return (\n <Tab\n key={priority}\n label={t(`main.tags.${priority.toLowerCase()}` as any)}\n value={priority}\n disableRipple\n />\n )\n })}\n </CardTabs>\n </SettingCardExpandable>\n )\n}\n"],"mappings":";;;;;;;;;;AAUA,MAAM,aAAsB,CAAC,YAAY,SAAS;AAElD,MAAa,8BAAwC;CACnD,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,EAAE,aAAa,mBAAmB;CACxC,MAAM,EAAE,2BAA2B,kBAAkB;CACrD,MAAM,EAAE,kBAAkB,YAAY,CAAC,eAAe,CAAC;CACvD,MAAM,uBAAuB,iBAAiB;CAE9C,MAAM,6BACJ,GACA,kBACG;EACH,SAAS,iBAAiB,aAAa;CACzC;CAEA,OACE,oBAAC,uBAAD;EACE,OACE,oBAAC,aAAD;GAAa,YAAW;GAAO,WAAW;aACvC,EAAE,aAAa,qBAAqB,YAAY,GAAU;EAChD,CAAA;EAEf,MAAM,oBAAC,OAAD,CAAQ,CAAA;EACd,OAAO,EAAE,wBAAwB;YAEjC,oBAAC,UAAD;GACE,OAAO;GACP,cAAW;GACX,gBAAe;GACf,UAAU;GACV,IAAI,EAAE,IAAI,IAAI;aAEb,WAAW,KAAK,aAAa;IAC5B,OACE,oBAAC,KAAD;KAEE,OAAO,EAAE,aAAa,SAAS,YAAY,GAAU;KACrD,OAAO;KACP,eAAA;IACD,GAJM,QAIN;GAEL,CAAC;EACO,CAAA;CACW,CAAA;AAE3B"}
1
+ {"version":3,"file":"RoutePrioritySettings.js","names":[],"sources":["../../../../src/pages/SettingsPage/RoutePrioritySettings.tsx"],"sourcesContent":["import Route from '@mui/icons-material/Route'\nimport { useNavigate } from '@tanstack/react-router'\nimport { useTranslation } from 'react-i18next'\nimport { CardButton } from '../../components/Card/CardButton.js'\nimport { useSettingMonitor } from '../../hooks/useSettingMonitor.js'\nimport { useSettings } from '../../stores/settings/useSettings.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { BadgedValue } from './SettingsCard/BadgedValue.js'\n\nexport const RoutePrioritySettings: React.FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const { isRoutePriorityChanged } = useSettingMonitor()\n const { routePriority } = useSettings(['routePriority'])\n\n const handleClick = () => {\n navigate({ to: navigationRoutes.routePriority })\n }\n\n return (\n <CardButton\n onClick={handleClick}\n icon={<Route />}\n title={t('settings.routePriority')}\n >\n <BadgedValue badgeColor=\"info\" showBadge={isRoutePriorityChanged}>\n {routePriority === 'FASTEST'\n ? t('settings.routePriorityOptions.fastest.title')\n : t('settings.routePriorityOptions.cheapest.title')}\n </BadgedValue>\n </CardButton>\n )\n}\n"],"mappings":";;;;;;;;;;AASA,MAAa,8BAAwC;CACnD,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,EAAE,2BAA2B,kBAAkB;CACrD,MAAM,EAAE,kBAAkB,YAAY,CAAC,eAAe,CAAC;CAEvD,MAAM,oBAAoB;EACxB,SAAS,EAAE,IAAI,iBAAiB,cAAc,CAAC;CACjD;CAEA,OACE,oBAAC,YAAD;EACE,SAAS;EACT,MAAM,oBAAC,OAAD,CAAQ,CAAA;EACd,OAAO,EAAE,wBAAwB;YAEjC,oBAAC,aAAD;GAAa,YAAW;GAAO,WAAW;aACvC,kBAAkB,YACf,EAAE,6CAA6C,IAC/C,EAAE,8CAA8C;EACzC,CAAA;CACH,CAAA;AAEhB"}
@@ -0,0 +1,133 @@
1
+ import { useSettingsActions } from "../../../stores/settings/useSettingsActions.js";
2
+ import { formatInputAmount, formatSlippage } from "../../../utils/format.js";
3
+ import { PageContainer } from "../../../components/PageContainer.js";
4
+ import { useSettings } from "../../../stores/settings/useSettings.js";
5
+ import { useSettingMonitor } from "../../../hooks/useSettingMonitor.js";
6
+ import { useHeader } from "../../../hooks/useHeader.js";
7
+ import { useListHeight } from "../../../hooks/useListHeight.js";
8
+ import { ListItemText as ListItemText$1 } from "../../../components/ListItemText.js";
9
+ import { SettingsListItemButton } from "../../../components/SettingsListItemButton.js";
10
+ import { SlippageClearButton, SlippageInput, SlippageLimitsWarningContainer } from "./SlippageSettings.style.js";
11
+ import { useRef, useState } from "react";
12
+ import { Box, Collapse, List, Typography } from "@mui/material";
13
+ import { jsx, jsxs } from "react/jsx-runtime";
14
+ import { useTranslation } from "react-i18next";
15
+ import CloseRounded from "@mui/icons-material/CloseRounded";
16
+ import WarningRounded from "@mui/icons-material/WarningRounded";
17
+ import Check from "@mui/icons-material/Check";
18
+ //#region src/pages/SettingsPage/SlippageSettings/SlippagePage.tsx
19
+ const slippagePresets = ["0.5", "1"];
20
+ const maxFractionDigits = 5;
21
+ const SlippagePage = () => {
22
+ const { t } = useTranslation();
23
+ const { isSlippageNotRecommended, isSlippageUnderRecommendedLimits, isSlippageOutsideRecommendedLimits } = useSettingMonitor();
24
+ const { slippage } = useSettings(["slippage"]);
25
+ const { setValue } = useSettingsActions();
26
+ const defaultValue = useRef(slippage);
27
+ const listParentRef = useRef(null);
28
+ const { listHeight } = useListHeight({ listParentRef });
29
+ useHeader(t("settings.slippage"));
30
+ const isAuto = !slippage || slippage === void 0;
31
+ const isPreset = !!slippage && slippagePresets.includes(slippage);
32
+ const isCustom = !isAuto && !isPreset;
33
+ const [customMode, setCustomMode] = useState(isCustom);
34
+ const [inputValue, setInputValue] = useState(isCustom ? slippage ?? "" : "");
35
+ const handleAuto = () => {
36
+ setCustomMode(false);
37
+ setInputValue("");
38
+ setValue("slippage", void 0);
39
+ };
40
+ const handlePreset = (preset) => {
41
+ setCustomMode(false);
42
+ setValue("slippage", preset);
43
+ };
44
+ const handleCustom = () => {
45
+ setCustomMode(true);
46
+ const initialValue = slippage || "";
47
+ if (initialValue) {
48
+ setInputValue(initialValue);
49
+ setValue("slippage", initialValue);
50
+ }
51
+ };
52
+ const formatAndSetSlippage = (value, returnInitial = false) => {
53
+ const formattedSlippage = formatSlippage(value, defaultValue.current, returnInitial);
54
+ const formattedValue = Number(formattedSlippage) === 0 && !returnInitial ? "0" : formatInputAmount(formattedSlippage, maxFractionDigits, returnInitial);
55
+ const maxLength = Number(formattedValue) < 10 ? 7 : 8;
56
+ const slicedValue = formattedValue.slice(0, maxLength);
57
+ setInputValue(slicedValue);
58
+ setValue("slippage", slicedValue.length ? slicedValue : void 0);
59
+ };
60
+ const handleInputUpdate = (event) => {
61
+ formatAndSetSlippage(event.target.value, true);
62
+ };
63
+ const handleInputFocus = (event) => {
64
+ formatAndSetSlippage(event.target.value);
65
+ };
66
+ const handleInputBlur = (event) => {
67
+ formatAndSetSlippage(event.target.value);
68
+ };
69
+ const slippageWarningText = isSlippageOutsideRecommendedLimits ? t("warning.message.slippageOutsideRecommendedLimits") : isSlippageUnderRecommendedLimits ? t("warning.message.slippageUnderRecommendedLimits") : "";
70
+ return /* @__PURE__ */ jsx(PageContainer, {
71
+ disableGutters: true,
72
+ children: /* @__PURE__ */ jsxs(List, {
73
+ className: "long-list",
74
+ ref: listParentRef,
75
+ style: {
76
+ height: listHeight,
77
+ overflow: "auto"
78
+ },
79
+ sx: { padding: 1.5 },
80
+ children: [
81
+ /* @__PURE__ */ jsxs(SettingsListItemButton, {
82
+ onClick: handleAuto,
83
+ children: [/* @__PURE__ */ jsx(ListItemText$1, {
84
+ primary: t("button.auto"),
85
+ secondary: t("settings.slippageAutoDescription")
86
+ }), !customMode && isAuto && /* @__PURE__ */ jsx(Check, { color: "primary" })]
87
+ }),
88
+ slippagePresets.map((preset) => /* @__PURE__ */ jsxs(SettingsListItemButton, {
89
+ onClick: () => handlePreset(preset),
90
+ children: [/* @__PURE__ */ jsx(ListItemText$1, { primary: `${preset}%` }), !customMode && slippage === preset && /* @__PURE__ */ jsx(Check, { color: "primary" })]
91
+ }, preset)),
92
+ /* @__PURE__ */ jsxs(SettingsListItemButton, {
93
+ onClick: handleCustom,
94
+ children: [/* @__PURE__ */ jsx(ListItemText$1, { primary: t("settings.custom") }), customMode && /* @__PURE__ */ jsx(Check, { color: "primary" })]
95
+ }),
96
+ /* @__PURE__ */ jsx(Collapse, {
97
+ in: customMode,
98
+ children: /* @__PURE__ */ jsxs(Box, {
99
+ sx: {
100
+ px: 1.5,
101
+ pt: 1
102
+ },
103
+ children: [/* @__PURE__ */ jsx(SlippageInput, {
104
+ placeholder: "0.5",
105
+ inputProps: { inputMode: "decimal" },
106
+ value: inputValue,
107
+ onChange: handleInputUpdate,
108
+ onFocus: handleInputFocus,
109
+ onBlur: handleInputBlur,
110
+ autoComplete: "off",
111
+ endAdornment: !isAuto && /* @__PURE__ */ jsx(SlippageClearButton, {
112
+ size: "small",
113
+ onClick: handleAuto,
114
+ "aria-label": "Clear",
115
+ children: /* @__PURE__ */ jsx(CloseRounded, { fontSize: "small" })
116
+ })
117
+ }), isSlippageNotRecommended && /* @__PURE__ */ jsxs(SlippageLimitsWarningContainer, { children: [/* @__PURE__ */ jsx(WarningRounded, { color: "warning" }), /* @__PURE__ */ jsx(Typography, {
118
+ sx: {
119
+ fontSize: 13,
120
+ fontWeight: 400
121
+ },
122
+ children: slippageWarningText
123
+ })] })]
124
+ })
125
+ })
126
+ ]
127
+ })
128
+ });
129
+ };
130
+ //#endregion
131
+ export { SlippagePage };
132
+
133
+ //# sourceMappingURL=SlippagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlippagePage.js","names":["ListItemText"],"sources":["../../../../../src/pages/SettingsPage/SlippageSettings/SlippagePage.tsx"],"sourcesContent":["import Check from '@mui/icons-material/Check'\nimport CloseRounded from '@mui/icons-material/CloseRounded'\nimport WarningRounded from '@mui/icons-material/WarningRounded'\nimport { Box, Collapse, List, Typography } from '@mui/material'\nimport type { ChangeEventHandler, FocusEventHandler } from 'react'\nimport { useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ListItemText } from '../../../components/ListItemText.js'\nimport { PageContainer } from '../../../components/PageContainer.js'\nimport { SettingsListItemButton } from '../../../components/SettingsListItemButton.js'\nimport { useHeader } from '../../../hooks/useHeader.js'\nimport { useListHeight } from '../../../hooks/useListHeight.js'\nimport { useSettingMonitor } from '../../../hooks/useSettingMonitor.js'\nimport { defaultSlippage } from '../../../stores/settings/createSettingsStore.js'\nimport { useSettings } from '../../../stores/settings/useSettings.js'\nimport { useSettingsActions } from '../../../stores/settings/useSettingsActions.js'\nimport { formatInputAmount, formatSlippage } from '../../../utils/format.js'\nimport {\n SlippageClearButton,\n SlippageInput,\n SlippageLimitsWarningContainer,\n} from './SlippageSettings.style.js'\n\nconst slippagePresets = ['0.5', '1']\nconst maxFractionDigits = 5\n\nexport const SlippagePage: React.FC = () => {\n const { t } = useTranslation()\n const {\n isSlippageNotRecommended,\n isSlippageUnderRecommendedLimits,\n isSlippageOutsideRecommendedLimits,\n } = useSettingMonitor()\n const { slippage } = useSettings(['slippage'])\n const { setValue } = useSettingsActions()\n const defaultValue = useRef(slippage)\n const listParentRef = useRef<HTMLUListElement | null>(null)\n const { listHeight } = useListHeight({ listParentRef })\n\n useHeader(t('settings.slippage'))\n\n const isAuto = !slippage || slippage === defaultSlippage\n const isPreset = !!slippage && slippagePresets.includes(slippage)\n const isCustom = !isAuto && !isPreset\n\n const [customMode, setCustomMode] = useState(isCustom)\n const [inputValue, setInputValue] = useState(isCustom ? (slippage ?? '') : '')\n\n const handleAuto = () => {\n setCustomMode(false)\n setInputValue('')\n setValue('slippage', defaultSlippage)\n }\n\n const handlePreset = (preset: string) => {\n setCustomMode(false)\n setValue('slippage', preset)\n }\n\n const handleCustom = () => {\n setCustomMode(true)\n const initialValue = slippage || ''\n if (initialValue) {\n setInputValue(initialValue)\n setValue('slippage', initialValue)\n }\n }\n\n const formatAndSetSlippage = (value: string, returnInitial = false) => {\n const formattedSlippage = formatSlippage(\n value,\n defaultValue.current,\n returnInitial\n )\n const formattedValue =\n Number(formattedSlippage) === 0 && !returnInitial\n ? '0'\n : formatInputAmount(formattedSlippage, maxFractionDigits, returnInitial)\n const maxLength =\n Number(formattedValue) < 10\n ? maxFractionDigits + 2\n : maxFractionDigits + 3\n const slicedValue = formattedValue.slice(0, maxLength)\n setInputValue(slicedValue)\n setValue('slippage', slicedValue.length ? slicedValue : defaultSlippage)\n }\n\n const handleInputUpdate: ChangeEventHandler<HTMLInputElement> = (event) => {\n formatAndSetSlippage(event.target.value, true)\n }\n\n const handleInputFocus: FocusEventHandler<HTMLInputElement> = (event) => {\n formatAndSetSlippage(event.target.value)\n }\n\n const handleInputBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n formatAndSetSlippage(event.target.value)\n }\n\n const slippageWarningText = isSlippageOutsideRecommendedLimits\n ? t('warning.message.slippageOutsideRecommendedLimits')\n : isSlippageUnderRecommendedLimits\n ? t('warning.message.slippageUnderRecommendedLimits')\n : ''\n\n return (\n <PageContainer disableGutters>\n <List\n className=\"long-list\"\n ref={listParentRef}\n style={{ height: listHeight, overflow: 'auto' }}\n sx={{\n padding: 1.5,\n }}\n >\n <SettingsListItemButton onClick={handleAuto}>\n <ListItemText\n primary={t('button.auto')}\n secondary={t('settings.slippageAutoDescription')}\n />\n {!customMode && isAuto && <Check color=\"primary\" />}\n </SettingsListItemButton>\n {slippagePresets.map((preset) => (\n <SettingsListItemButton\n key={preset}\n onClick={() => handlePreset(preset)}\n >\n <ListItemText primary={`${preset}%`} />\n {!customMode && slippage === preset && <Check color=\"primary\" />}\n </SettingsListItemButton>\n ))}\n <SettingsListItemButton onClick={handleCustom}>\n <ListItemText primary={t('settings.custom')} />\n {customMode && <Check color=\"primary\" />}\n </SettingsListItemButton>\n <Collapse in={customMode}>\n <Box sx={{ px: 1.5, pt: 1 }}>\n <SlippageInput\n placeholder=\"0.5\"\n inputProps={{ inputMode: 'decimal' }}\n value={inputValue}\n onChange={handleInputUpdate}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n autoComplete=\"off\"\n endAdornment={\n !isAuto && (\n <SlippageClearButton\n size=\"small\"\n onClick={handleAuto}\n aria-label=\"Clear\"\n >\n <CloseRounded fontSize=\"small\" />\n </SlippageClearButton>\n )\n }\n />\n {isSlippageNotRecommended && (\n <SlippageLimitsWarningContainer>\n <WarningRounded color=\"warning\" />\n <Typography\n sx={{\n fontSize: 13,\n fontWeight: 400,\n }}\n >\n {slippageWarningText}\n </Typography>\n </SlippageLimitsWarningContainer>\n )}\n </Box>\n </Collapse>\n </List>\n </PageContainer>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAuBA,MAAM,kBAAkB,CAAC,OAAO,GAAG;AACnC,MAAM,oBAAoB;AAE1B,MAAa,qBAA+B;CAC1C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,EACJ,0BACA,kCACA,uCACE,kBAAkB;CACtB,MAAM,EAAE,aAAa,YAAY,CAAC,UAAU,CAAC;CAC7C,MAAM,EAAE,aAAa,mBAAmB;CACxC,MAAM,eAAe,OAAO,QAAQ;CACpC,MAAM,gBAAgB,OAAgC,IAAI;CAC1D,MAAM,EAAE,eAAe,cAAc,EAAE,cAAc,CAAC;CAEtD,UAAU,EAAE,mBAAmB,CAAC;CAEhC,MAAM,SAAS,CAAC,YAAY,aAAA,KAAA;CAC5B,MAAM,WAAW,CAAC,CAAC,YAAY,gBAAgB,SAAS,QAAQ;CAChE,MAAM,WAAW,CAAC,UAAU,CAAC;CAE7B,MAAM,CAAC,YAAY,iBAAiB,SAAS,QAAQ;CACrD,MAAM,CAAC,YAAY,iBAAiB,SAAS,WAAY,YAAY,KAAM,EAAE;CAE7E,MAAM,mBAAmB;EACvB,cAAc,KAAK;EACnB,cAAc,EAAE;EAChB,SAAS,YAAA,KAAA,CAA2B;CACtC;CAEA,MAAM,gBAAgB,WAAmB;EACvC,cAAc,KAAK;EACnB,SAAS,YAAY,MAAM;CAC7B;CAEA,MAAM,qBAAqB;EACzB,cAAc,IAAI;EAClB,MAAM,eAAe,YAAY;EACjC,IAAI,cAAc;GAChB,cAAc,YAAY;GAC1B,SAAS,YAAY,YAAY;EACnC;CACF;CAEA,MAAM,wBAAwB,OAAe,gBAAgB,UAAU;EACrE,MAAM,oBAAoB,eACxB,OACA,aAAa,SACb,aACF;EACA,MAAM,iBACJ,OAAO,iBAAiB,MAAM,KAAK,CAAC,gBAChC,MACA,kBAAkB,mBAAmB,mBAAmB,aAAa;EAC3E,MAAM,YACJ,OAAO,cAAc,IAAI,KACrB,IACA;EACN,MAAM,cAAc,eAAe,MAAM,GAAG,SAAS;EACrD,cAAc,WAAW;EACzB,SAAS,YAAY,YAAY,SAAS,cAAA,KAAA,CAA6B;CACzE;CAEA,MAAM,qBAA2D,UAAU;EACzE,qBAAqB,MAAM,OAAO,OAAO,IAAI;CAC/C;CAEA,MAAM,oBAAyD,UAAU;EACvE,qBAAqB,MAAM,OAAO,KAAK;CACzC;CAEA,MAAM,mBAAwD,UAAU;EACtE,qBAAqB,MAAM,OAAO,KAAK;CACzC;CAEA,MAAM,sBAAsB,qCACxB,EAAE,kDAAkD,IACpD,mCACE,EAAE,gDAAgD,IAClD;CAEN,OACE,oBAAC,eAAD;EAAe,gBAAA;YACb,qBAAC,MAAD;GACE,WAAU;GACV,KAAK;GACL,OAAO;IAAE,QAAQ;IAAY,UAAU;GAAO;GAC9C,IAAI,EACF,SAAS,IACX;aANF;IAQE,qBAAC,wBAAD;KAAwB,SAAS;eAAjC,CACE,oBAACA,gBAAD;MACE,SAAS,EAAE,aAAa;MACxB,WAAW,EAAE,kCAAkC;KAChD,CAAA,GACA,CAAC,cAAc,UAAU,oBAAC,OAAD,EAAO,OAAM,UAAW,CAAA,CAC5B;;IACvB,gBAAgB,KAAK,WACpB,qBAAC,wBAAD;KAEE,eAAe,aAAa,MAAM;eAFpC,CAIE,oBAACA,gBAAD,EAAc,SAAS,GAAG,OAAO,GAAK,CAAA,GACrC,CAAC,cAAc,aAAa,UAAU,oBAAC,OAAD,EAAO,OAAM,UAAW,CAAA,CACzC;OALjB,MAKiB,CACzB;IACD,qBAAC,wBAAD;KAAwB,SAAS;eAAjC,CACE,oBAACA,gBAAD,EAAc,SAAS,EAAE,iBAAiB,EAAI,CAAA,GAC7C,cAAc,oBAAC,OAAD,EAAO,OAAM,UAAW,CAAA,CACjB;;IACxB,oBAAC,UAAD;KAAU,IAAI;eACZ,qBAAC,KAAD;MAAK,IAAI;OAAE,IAAI;OAAK,IAAI;MAAE;gBAA1B,CACE,oBAAC,eAAD;OACE,aAAY;OACZ,YAAY,EAAE,WAAW,UAAU;OACnC,OAAO;OACP,UAAU;OACV,SAAS;OACT,QAAQ;OACR,cAAa;OACb,cACE,CAAC,UACC,oBAAC,qBAAD;QACE,MAAK;QACL,SAAS;QACT,cAAW;kBAEX,oBAAC,cAAD,EAAc,UAAS,QAAS,CAAA;OACb,CAAA;MAG1B,CAAA,GACA,4BACC,qBAAC,gCAAD,EAAA,UAAA,CACE,oBAAC,gBAAD,EAAgB,OAAM,UAAW,CAAA,GACjC,oBAAC,YAAD;OACE,IAAI;QACF,UAAU;QACV,YAAY;OACd;iBAEC;MACS,CAAA,CACkB,EAAA,CAAA,CAE/B;;IACG,CAAA;GACN;;CACO,CAAA;AAEnB"}
@@ -1,88 +1,30 @@
1
- import { useSettingsActions } from "../../../stores/settings/useSettingsActions.js";
2
- import { formatInputAmount, formatSlippage } from "../../../utils/format.js";
1
+ import { navigationRoutes } from "../../../utils/navigationRoutes.js";
3
2
  import { useSettings } from "../../../stores/settings/useSettings.js";
4
3
  import { useSettingMonitor } from "../../../hooks/useSettingMonitor.js";
4
+ import { CardButton } from "../../../components/Card/CardButton.js";
5
5
  import { BadgedValue } from "../SettingsCard/BadgedValue.js";
6
- import { SettingCardExpandable } from "../SettingsCard/SettingCardExpandable.js";
7
- import { SettingsCustomInput, SettingsDefaultButton, SettingsFieldSet, SlippageLimitsWarningContainer } from "./SlippageSettings.style.js";
8
- import { useRef, useState } from "react";
9
- import { Box, Typography } from "@mui/material";
10
- import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { useNavigate } from "@tanstack/react-router";
7
+ import { jsx } from "react/jsx-runtime";
11
8
  import { useTranslation } from "react-i18next";
12
- import WarningRounded from "@mui/icons-material/WarningRounded";
13
9
  import Percent from "@mui/icons-material/Percent";
14
10
  //#region src/pages/SettingsPage/SlippageSettings/SlippageSettings.tsx
15
- const defaultSlippageInputValue = "0.5";
16
- const maxFractionDigits = 5;
17
11
  const SlippageSettings = () => {
18
12
  const { t } = useTranslation();
19
- const { isSlippageNotRecommended, isSlippageUnderRecommendedLimits, isSlippageOutsideRecommendedLimits, isSlippageChanged } = useSettingMonitor();
13
+ const navigate = useNavigate();
14
+ const { isSlippageNotRecommended, isSlippageChanged } = useSettingMonitor();
20
15
  const { slippage } = useSettings(["slippage"]);
21
- const { setValue } = useSettingsActions();
22
- const defaultValue = useRef(slippage);
23
- const [focused, setFocused] = useState();
24
- const [inputValue, setInputValue] = useState(!slippage || slippage === void 0 ? defaultSlippageInputValue : slippage);
25
- const handleDefaultClick = () => {
26
- setValue("slippage", void 0);
27
- };
28
- const formatAndSetSlippage = (value, returnInitial = false) => {
29
- const formattedSlippage = formatSlippage(value, defaultValue.current, returnInitial);
30
- const formattedValue = Number(formattedSlippage) === 0 && !returnInitial ? "0" : formatInputAmount(formattedSlippage, maxFractionDigits, returnInitial);
31
- const maxLength = Number(formattedValue) < 10 ? 7 : 8;
32
- const slicedValue = formattedValue.slice(0, maxLength);
33
- setInputValue(slicedValue);
34
- setValue("slippage", slicedValue.length ? slicedValue : void 0);
35
- };
36
- const handleInputUpdate = (event) => {
37
- formatAndSetSlippage(event.target.value, true);
38
- };
39
- const handleInputFocus = (event) => {
40
- setFocused("input");
41
- formatAndSetSlippage(event.target.value);
42
- };
43
- const handleInputBlur = (event) => {
44
- setFocused(void 0);
45
- formatAndSetSlippage(event.target.value);
46
- };
47
16
  const badgeColor = isSlippageNotRecommended ? "warning" : isSlippageChanged ? "info" : void 0;
48
- const slippageWarningText = isSlippageOutsideRecommendedLimits ? t("warning.message.slippageOutsideRecommendedLimits") : isSlippageUnderRecommendedLimits ? t("warning.message.slippageUnderRecommendedLimits") : "";
49
- return /* @__PURE__ */ jsx(SettingCardExpandable, {
50
- value: /* @__PURE__ */ jsx(BadgedValue, {
17
+ const handleClick = () => {
18
+ navigate({ to: navigationRoutes.slippage });
19
+ };
20
+ return /* @__PURE__ */ jsx(CardButton, {
21
+ onClick: handleClick,
22
+ icon: /* @__PURE__ */ jsx(Percent, {}),
23
+ title: t("settings.slippage"),
24
+ children: /* @__PURE__ */ jsx(BadgedValue, {
51
25
  badgeColor,
52
26
  showBadge: !!badgeColor,
53
27
  children: slippage ? `${slippage}%` : t("button.auto")
54
- }),
55
- icon: /* @__PURE__ */ jsx(Percent, {}),
56
- title: t("settings.slippage"),
57
- children: /* @__PURE__ */ jsxs(Box, {
58
- sx: { mt: 1.5 },
59
- children: [/* @__PURE__ */ jsxs(SettingsFieldSet, { children: [/* @__PURE__ */ jsx(SettingsDefaultButton, {
60
- selected: void 0 === slippage && focused !== "input",
61
- onFocus: () => {
62
- setFocused("button");
63
- },
64
- onBlur: () => {
65
- setFocused(void 0);
66
- },
67
- onClick: handleDefaultClick,
68
- disableRipple: true,
69
- children: t("button.auto")
70
- }), /* @__PURE__ */ jsx(SettingsCustomInput, {
71
- selected: void 0 !== slippage && focused !== "button",
72
- placeholder: focused === "input" ? "" : t("settings.custom"),
73
- inputProps: { inputMode: "decimal" },
74
- onChange: handleInputUpdate,
75
- onFocus: handleInputFocus,
76
- value: inputValue,
77
- autoComplete: "off",
78
- onBlur: handleInputBlur
79
- })] }), isSlippageNotRecommended && /* @__PURE__ */ jsxs(SlippageLimitsWarningContainer, { children: [/* @__PURE__ */ jsx(WarningRounded, { color: "warning" }), /* @__PURE__ */ jsx(Typography, {
80
- sx: {
81
- fontSize: 13,
82
- fontWeight: 400
83
- },
84
- children: slippageWarningText
85
- })] })]
86
28
  })
87
29
  });
88
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"SlippageSettings.js","names":[],"sources":["../../../../../src/pages/SettingsPage/SlippageSettings/SlippageSettings.tsx"],"sourcesContent":["import Percent from '@mui/icons-material/Percent'\nimport WarningRounded from '@mui/icons-material/WarningRounded'\nimport { Box, Typography } from '@mui/material'\nimport type { ChangeEventHandler, FocusEventHandler } from 'react'\nimport { useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useSettingMonitor } from '../../../hooks/useSettingMonitor.js'\nimport { defaultSlippage } from '../../../stores/settings/createSettingsStore.js'\nimport { useSettings } from '../../../stores/settings/useSettings.js'\nimport { useSettingsActions } from '../../../stores/settings/useSettingsActions.js'\nimport { formatInputAmount, formatSlippage } from '../../../utils/format.js'\nimport { BadgedValue } from '../SettingsCard/BadgedValue.js'\nimport { SettingCardExpandable } from '../SettingsCard/SettingCardExpandable.js'\nimport {\n SettingsCustomInput,\n SettingsDefaultButton,\n SettingsFieldSet,\n SlippageLimitsWarningContainer,\n} from './SlippageSettings.style.js'\n\nconst defaultSlippageInputValue = '0.5'\nconst maxFractionDigits = 5\n\nexport const SlippageSettings: React.FC = () => {\n const { t } = useTranslation()\n const {\n isSlippageNotRecommended,\n isSlippageUnderRecommendedLimits,\n isSlippageOutsideRecommendedLimits,\n isSlippageChanged,\n } = useSettingMonitor()\n const { slippage } = useSettings(['slippage'])\n const { setValue } = useSettingsActions()\n const defaultValue = useRef(slippage)\n const [focused, setFocused] = useState<'input' | 'button'>()\n\n const customInputValue =\n !slippage || slippage === defaultSlippage\n ? defaultSlippageInputValue\n : slippage\n\n const [inputValue, setInputValue] = useState(customInputValue)\n\n const handleDefaultClick = () => {\n setValue('slippage', defaultSlippage)\n }\n\n const formatAndSetSlippage = (value: string, returnInitial = false) => {\n const formattedSlippage = formatSlippage(\n value,\n defaultValue.current,\n returnInitial\n )\n const formattedValue =\n Number(formattedSlippage) === 0 && !returnInitial\n ? '0'\n : formatInputAmount(formattedSlippage, maxFractionDigits, returnInitial)\n const maxLength =\n Number(formattedValue) < 10\n ? maxFractionDigits + 2\n : maxFractionDigits + 3\n const slicedValue = formattedValue.slice(0, maxLength)\n setInputValue(slicedValue)\n setValue('slippage', slicedValue.length ? slicedValue : defaultSlippage)\n }\n\n const handleInputUpdate: ChangeEventHandler<HTMLInputElement> = (event) => {\n formatAndSetSlippage(event.target.value, true)\n }\n\n const handleInputFocus: FocusEventHandler<HTMLInputElement> = (event) => {\n setFocused('input')\n formatAndSetSlippage(event.target.value)\n }\n\n const handleInputBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n setFocused(undefined)\n formatAndSetSlippage(event.target.value)\n }\n\n const badgeColor = isSlippageNotRecommended\n ? 'warning'\n : isSlippageChanged\n ? 'info'\n : undefined\n\n const slippageWarningText = isSlippageOutsideRecommendedLimits\n ? t('warning.message.slippageOutsideRecommendedLimits')\n : isSlippageUnderRecommendedLimits\n ? t('warning.message.slippageUnderRecommendedLimits')\n : ''\n\n return (\n <SettingCardExpandable\n value={\n <BadgedValue badgeColor={badgeColor} showBadge={!!badgeColor}>\n {slippage ? `${slippage}%` : t('button.auto')}\n </BadgedValue>\n }\n icon={<Percent />}\n title={t('settings.slippage')}\n >\n <Box\n sx={{\n mt: 1.5,\n }}\n >\n <SettingsFieldSet>\n <SettingsDefaultButton\n selected={defaultSlippage === slippage && focused !== 'input'}\n onFocus={() => {\n setFocused('button')\n }}\n onBlur={() => {\n setFocused(undefined)\n }}\n onClick={handleDefaultClick}\n disableRipple\n >\n {t('button.auto')}\n </SettingsDefaultButton>\n <SettingsCustomInput\n selected={defaultSlippage !== slippage && focused !== 'button'}\n placeholder={focused === 'input' ? '' : t('settings.custom')}\n inputProps={{\n inputMode: 'decimal',\n }}\n onChange={handleInputUpdate}\n onFocus={handleInputFocus}\n value={inputValue}\n autoComplete=\"off\"\n onBlur={handleInputBlur}\n />\n </SettingsFieldSet>\n {isSlippageNotRecommended && (\n <SlippageLimitsWarningContainer>\n <WarningRounded color=\"warning\" />\n <Typography\n sx={{\n fontSize: 13,\n fontWeight: 400,\n }}\n >\n {slippageWarningText}\n </Typography>\n </SlippageLimitsWarningContainer>\n )}\n </Box>\n </SettingCardExpandable>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;AAoBA,MAAM,4BAA4B;AAClC,MAAM,oBAAoB;AAE1B,MAAa,yBAAmC;CAC9C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,EACJ,0BACA,kCACA,oCACA,sBACE,kBAAkB;CACtB,MAAM,EAAE,aAAa,YAAY,CAAC,UAAU,CAAC;CAC7C,MAAM,EAAE,aAAa,mBAAmB;CACxC,MAAM,eAAe,OAAO,QAAQ;CACpC,MAAM,CAAC,SAAS,cAAc,SAA6B;CAO3D,MAAM,CAAC,YAAY,iBAAiB,SAJlC,CAAC,YAAY,aAAA,KAAA,IACT,4BACA,QAEuD;CAE7D,MAAM,2BAA2B;EAC/B,SAAS,YAAA,KAAA,CAA2B;CACtC;CAEA,MAAM,wBAAwB,OAAe,gBAAgB,UAAU;EACrE,MAAM,oBAAoB,eACxB,OACA,aAAa,SACb,aACF;EACA,MAAM,iBACJ,OAAO,iBAAiB,MAAM,KAAK,CAAC,gBAChC,MACA,kBAAkB,mBAAmB,mBAAmB,aAAa;EAC3E,MAAM,YACJ,OAAO,cAAc,IAAI,KACrB,IACA;EACN,MAAM,cAAc,eAAe,MAAM,GAAG,SAAS;EACrD,cAAc,WAAW;EACzB,SAAS,YAAY,YAAY,SAAS,cAAA,KAAA,CAA6B;CACzE;CAEA,MAAM,qBAA2D,UAAU;EACzE,qBAAqB,MAAM,OAAO,OAAO,IAAI;CAC/C;CAEA,MAAM,oBAAyD,UAAU;EACvE,WAAW,OAAO;EAClB,qBAAqB,MAAM,OAAO,KAAK;CACzC;CAEA,MAAM,mBAAwD,UAAU;EACtE,WAAW,KAAA,CAAS;EACpB,qBAAqB,MAAM,OAAO,KAAK;CACzC;CAEA,MAAM,aAAa,2BACf,YACA,oBACE,SACA,KAAA;CAEN,MAAM,sBAAsB,qCACxB,EAAE,kDAAkD,IACpD,mCACE,EAAE,gDAAgD,IAClD;CAEN,OACE,oBAAC,uBAAD;EACE,OACE,oBAAC,aAAD;GAAyB;GAAY,WAAW,CAAC,CAAC;aAC/C,WAAW,GAAG,SAAS,KAAK,EAAE,aAAa;EACjC,CAAA;EAEf,MAAM,oBAAC,SAAD,CAAU,CAAA;EAChB,OAAO,EAAE,mBAAmB;YAE5B,qBAAC,KAAD;GACE,IAAI,EACF,IAAI,IACN;aAHF,CAKE,qBAAC,kBAAD,EAAA,UAAA,CACE,oBAAC,uBAAD;IACE,UAAA,KAAA,MAA8B,YAAY,YAAY;IACtD,eAAe;KACb,WAAW,QAAQ;IACrB;IACA,cAAc;KACZ,WAAW,KAAA,CAAS;IACtB;IACA,SAAS;IACT,eAAA;cAEC,EAAE,aAAa;GACK,CAAA,GACvB,oBAAC,qBAAD;IACE,UAAA,KAAA,MAA8B,YAAY,YAAY;IACtD,aAAa,YAAY,UAAU,KAAK,EAAE,iBAAiB;IAC3D,YAAY,EACV,WAAW,UACb;IACA,UAAU;IACV,SAAS;IACT,OAAO;IACP,cAAa;IACb,QAAQ;GACT,CAAA,CACe,EAAA,CAAA,GACjB,4BACC,qBAAC,gCAAD,EAAA,UAAA,CACE,oBAAC,gBAAD,EAAgB,OAAM,UAAW,CAAA,GACjC,oBAAC,YAAD;IACE,IAAI;KACF,UAAU;KACV,YAAY;IACd;cAEC;GACS,CAAA,CACkB,EAAA,CAAA,CAE/B;;CACgB,CAAA;AAE3B"}
1
+ {"version":3,"file":"SlippageSettings.js","names":[],"sources":["../../../../../src/pages/SettingsPage/SlippageSettings/SlippageSettings.tsx"],"sourcesContent":["import Percent from '@mui/icons-material/Percent'\nimport { useNavigate } from '@tanstack/react-router'\nimport { useTranslation } from 'react-i18next'\nimport { CardButton } from '../../../components/Card/CardButton.js'\nimport { useSettingMonitor } from '../../../hooks/useSettingMonitor.js'\nimport { useSettings } from '../../../stores/settings/useSettings.js'\nimport { navigationRoutes } from '../../../utils/navigationRoutes.js'\nimport { BadgedValue } from '../SettingsCard/BadgedValue.js'\n\nexport const SlippageSettings: React.FC = () => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const { isSlippageNotRecommended, isSlippageChanged } = useSettingMonitor()\n const { slippage } = useSettings(['slippage'])\n\n const badgeColor = isSlippageNotRecommended\n ? 'warning'\n : isSlippageChanged\n ? 'info'\n : undefined\n\n const handleClick = () => {\n navigate({ to: navigationRoutes.slippage })\n }\n\n return (\n <CardButton\n onClick={handleClick}\n icon={<Percent />}\n title={t('settings.slippage')}\n >\n <BadgedValue badgeColor={badgeColor} showBadge={!!badgeColor}>\n {slippage ? `${slippage}%` : t('button.auto')}\n </BadgedValue>\n </CardButton>\n )\n}\n"],"mappings":";;;;;;;;;;AASA,MAAa,yBAAmC;CAC9C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,EAAE,0BAA0B,sBAAsB,kBAAkB;CAC1E,MAAM,EAAE,aAAa,YAAY,CAAC,UAAU,CAAC;CAE7C,MAAM,aAAa,2BACf,YACA,oBACE,SACA,KAAA;CAEN,MAAM,oBAAoB;EACxB,SAAS,EAAE,IAAI,iBAAiB,SAAS,CAAC;CAC5C;CAEA,OACE,oBAAC,YAAD;EACE,SAAS;EACT,MAAM,oBAAC,SAAD,CAAU,CAAA;EAChB,OAAO,EAAE,mBAAmB;YAE5B,oBAAC,aAAD;GAAyB;GAAY,WAAW,CAAC,CAAC;aAC/C,WAAW,GAAG,SAAS,KAAK,EAAE,aAAa;EACjC,CAAA;CACH,CAAA;AAEhB"}
@@ -1,4 +1,4 @@
1
- import { Box, ButtonBase, InputBase, inputBaseClasses, styled } from "@mui/material";
1
+ import { Box, IconButton, InputBase, inputBaseClasses, styled } from "@mui/material";
2
2
  //#region src/pages/SettingsPage/SlippageSettings/SlippageSettings.style.tsx
3
3
  const SettingsFieldSet = styled(Box)(({ theme }) => ({
4
4
  display: "flex",
@@ -18,18 +18,6 @@ const settingsControlSelected = (theme) => ({
18
18
  }),
19
19
  borderRadius: `calc(${theme.vars.shape.borderRadius} - 4px)`
20
20
  });
21
- const SettingsDefaultButton = styled(ButtonBase)(({ theme, selected }) => {
22
- const settingsControlSelectedStyles = settingsControlSelected(theme);
23
- const selectedStyle = selected ? { "&:not(:focus)": { ...settingsControlSelectedStyles } } : {};
24
- return {
25
- height: "100%",
26
- width: "100%",
27
- fontSize: "1rem",
28
- fontWeight: 700,
29
- "&:focus": { ...settingsControlSelectedStyles },
30
- ...selectedStyle
31
- };
32
- });
33
21
  const SettingsCustomInput = styled(InputBase)(({ theme, selected }) => {
34
22
  const settingsControlSelectedStyles = settingsControlSelected(theme);
35
23
  const selectedStyle = selected ? { "&:not(:focus)": { ...settingsControlSelectedStyles } } : {};
@@ -56,7 +44,31 @@ const SlippageLimitsWarningContainer = styled(Box)(({ theme }) => ({
56
44
  gap: theme.spacing(1.25),
57
45
  marginTop: theme.spacing(1.5)
58
46
  }));
47
+ const SlippageInput = styled(InputBase)(({ theme }) => ({
48
+ minHeight: 44,
49
+ width: "100%",
50
+ backgroundColor: theme.vars.palette.background.default,
51
+ border: "1px solid",
52
+ borderColor: theme.vars.palette.divider,
53
+ borderRadius: theme.vars.shape.borderRadius,
54
+ paddingRight: theme.spacing(1),
55
+ [`.${inputBaseClasses.input}`]: {
56
+ padding: theme.spacing(1.5),
57
+ fontSize: 16,
58
+ fontWeight: 500,
59
+ lineHeight: "20px",
60
+ "&::placeholder": {
61
+ opacity: 1,
62
+ color: theme.vars.palette.text.secondary
63
+ },
64
+ "&::-webkit-outer-spin-button, &::-webkit-inner-spin-button": { display: "none" }
65
+ }
66
+ }));
67
+ const SlippageClearButton = styled(IconButton)(({ theme }) => ({
68
+ padding: theme.spacing(.5),
69
+ flexShrink: 0
70
+ }));
59
71
  //#endregion
60
- export { SettingsCustomInput, SettingsDefaultButton, SettingsFieldSet, SlippageLimitsWarningContainer };
72
+ export { SettingsCustomInput, SettingsFieldSet, SlippageClearButton, SlippageInput, SlippageLimitsWarningContainer };
61
73
 
62
74
  //# sourceMappingURL=SlippageSettings.style.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SlippageSettings.style.js","names":[],"sources":["../../../../../src/pages/SettingsPage/SlippageSettings/SlippageSettings.style.tsx"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport {\n Box,\n ButtonBase,\n InputBase,\n inputBaseClasses,\n styled,\n} from '@mui/material'\nimport type React from 'react'\n\nexport const SettingsFieldSet: React.FC<\n React.ComponentProps<typeof Box> & SettingsControlProps\n> = styled(Box)(({ theme }) => ({\n display: 'flex',\n borderRadius: theme.vars.shape.borderRadius,\n padding: theme.spacing(0.5),\n gap: theme.spacing(0.5),\n height: '3.5rem',\n backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.onBackground} 4%, transparent)`,\n ...theme.applyStyles('dark', {\n backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.onBackground} 8%, transparent)`,\n }),\n}))\n\nconst settingsControlSelected = (theme: Theme) => ({\n backgroundColor: theme.vars.palette.background.paper,\n boxShadow: `0px 2px 4px color-mix(in srgb, ${theme.vars.palette.common.onBackground} 4%, transparent)`,\n ...theme.applyStyles('dark', {\n backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.background} 56%, transparent)`,\n boxShadow: `0px 2px 4px color-mix(in srgb, ${theme.vars.palette.common.background} 4%, transparent)`,\n }),\n borderRadius: `calc(${theme.vars.shape.borderRadius} - 4px)`,\n})\n\ninterface SettingsControlProps {\n selected?: boolean\n}\n\nexport const SettingsDefaultButton: React.FC<\n React.ComponentProps<typeof ButtonBase> & SettingsControlProps\n> = styled(ButtonBase)<SettingsControlProps>(({ theme, selected }) => {\n const settingsControlSelectedStyles = settingsControlSelected(theme)\n const selectedStyle = selected\n ? {\n '&:not(:focus)': {\n ...settingsControlSelectedStyles,\n },\n }\n : {}\n\n return {\n height: '100%',\n width: '100%',\n fontSize: '1rem',\n fontWeight: 700,\n '&:focus': {\n ...settingsControlSelectedStyles,\n },\n ...selectedStyle,\n }\n})\n\nexport const SettingsCustomInput: React.FC<\n React.ComponentProps<typeof InputBase> & SettingsControlProps\n> = styled(InputBase)<SettingsControlProps>(({ theme, selected }) => {\n const settingsControlSelectedStyles = settingsControlSelected(theme)\n const selectedStyle = selected\n ? {\n '&:not(:focus)': {\n ...settingsControlSelectedStyles,\n },\n }\n : {}\n\n return {\n height: '100%',\n width: '100%',\n [`.${inputBaseClasses.input}`]: {\n height: '100%',\n width: '100%',\n padding: 0,\n textAlign: 'center',\n '&::placeholder': {\n fontSize: '1rem',\n fontWeight: 700,\n opacity: 1,\n },\n '&:focus': {\n ...settingsControlSelectedStyles,\n },\n ...selectedStyle,\n },\n }\n})\n\nexport const SlippageLimitsWarningContainer: React.FC<\n React.ComponentProps<typeof Box>\n> = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(1.25),\n marginTop: theme.spacing(1.5),\n}))\n"],"mappings":";;AAUA,MAAa,mBAET,OAAO,GAAG,CAAC,EAAE,EAAE,aAAa;CAC9B,SAAS;CACT,cAAc,MAAM,KAAK,MAAM;CAC/B,SAAS,MAAM,QAAQ,EAAG;CAC1B,KAAK,MAAM,QAAQ,EAAG;CACtB,QAAQ;CACR,iBAAiB,sBAAsB,MAAM,KAAK,QAAQ,OAAO,aAAa;CAC9E,GAAG,MAAM,YAAY,QAAQ,EAC3B,iBAAiB,sBAAsB,MAAM,KAAK,QAAQ,OAAO,aAAa,mBAChF,CAAC;AACH,EAAE;AAEF,MAAM,2BAA2B,WAAkB;CACjD,iBAAiB,MAAM,KAAK,QAAQ,WAAW;CAC/C,WAAW,kCAAkC,MAAM,KAAK,QAAQ,OAAO,aAAa;CACpF,GAAG,MAAM,YAAY,QAAQ;EAC3B,iBAAiB,sBAAsB,MAAM,KAAK,QAAQ,OAAO,WAAW;EAC5E,WAAW,kCAAkC,MAAM,KAAK,QAAQ,OAAO,WAAW;CACpF,CAAC;CACD,cAAc,QAAQ,MAAM,KAAK,MAAM,aAAa;AACtD;AAMA,MAAa,wBAET,OAAO,UAAU,CAAC,EAAwB,EAAE,OAAO,eAAe;CACpE,MAAM,gCAAgC,wBAAwB,KAAK;CACnE,MAAM,gBAAgB,WAClB,EACE,iBAAiB,EACf,GAAG,8BACL,EACF,IACA,CAAC;CAEL,OAAO;EACL,QAAQ;EACR,OAAO;EACP,UAAU;EACV,YAAY;EACZ,WAAW,EACT,GAAG,8BACL;EACA,GAAG;CACL;AACF,CAAC;AAED,MAAa,sBAET,OAAO,SAAS,CAAC,EAAwB,EAAE,OAAO,eAAe;CACnE,MAAM,gCAAgC,wBAAwB,KAAK;CACnE,MAAM,gBAAgB,WAClB,EACE,iBAAiB,EACf,GAAG,8BACL,EACF,IACA,CAAC;CAEL,OAAO;EACL,QAAQ;EACR,OAAO;GACN,IAAI,iBAAiB,UAAU;GAC9B,QAAQ;GACR,OAAO;GACP,SAAS;GACT,WAAW;GACX,kBAAkB;IAChB,UAAU;IACV,YAAY;IACZ,SAAS;GACX;GACA,WAAW,EACT,GAAG,8BACL;GACA,GAAG;EACL;CACF;AACF,CAAC;AAED,MAAa,iCAET,OAAO,GAAG,CAAC,EAAE,EAAE,aAAa;CAC9B,SAAS;CACT,KAAK,MAAM,QAAQ,IAAI;CACvB,WAAW,MAAM,QAAQ,GAAG;AAC9B,EAAE"}
1
+ {"version":3,"file":"SlippageSettings.style.js","names":[],"sources":["../../../../../src/pages/SettingsPage/SlippageSettings/SlippageSettings.style.tsx"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport {\n Box,\n IconButton,\n InputBase,\n inputBaseClasses,\n styled,\n} from '@mui/material'\nimport type React from 'react'\n\nexport const SettingsFieldSet: React.FC<\n React.ComponentProps<typeof Box> & SettingsControlProps\n> = styled(Box)(({ theme }) => ({\n display: 'flex',\n borderRadius: theme.vars.shape.borderRadius,\n padding: theme.spacing(0.5),\n gap: theme.spacing(0.5),\n height: '3.5rem',\n backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.onBackground} 4%, transparent)`,\n ...theme.applyStyles('dark', {\n backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.onBackground} 8%, transparent)`,\n }),\n}))\n\nconst settingsControlSelected = (theme: Theme) => ({\n backgroundColor: theme.vars.palette.background.paper,\n boxShadow: `0px 2px 4px color-mix(in srgb, ${theme.vars.palette.common.onBackground} 4%, transparent)`,\n ...theme.applyStyles('dark', {\n backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.background} 56%, transparent)`,\n boxShadow: `0px 2px 4px color-mix(in srgb, ${theme.vars.palette.common.background} 4%, transparent)`,\n }),\n borderRadius: `calc(${theme.vars.shape.borderRadius} - 4px)`,\n})\n\ninterface SettingsControlProps {\n selected?: boolean\n}\n\nexport const SettingsCustomInput: React.FC<\n React.ComponentProps<typeof InputBase> & SettingsControlProps\n> = styled(InputBase)<SettingsControlProps>(({ theme, selected }) => {\n const settingsControlSelectedStyles = settingsControlSelected(theme)\n const selectedStyle = selected\n ? {\n '&:not(:focus)': {\n ...settingsControlSelectedStyles,\n },\n }\n : {}\n\n return {\n height: '100%',\n width: '100%',\n [`.${inputBaseClasses.input}`]: {\n height: '100%',\n width: '100%',\n padding: 0,\n textAlign: 'center',\n '&::placeholder': {\n fontSize: '1rem',\n fontWeight: 700,\n opacity: 1,\n },\n '&:focus': {\n ...settingsControlSelectedStyles,\n },\n ...selectedStyle,\n },\n }\n})\n\nexport const SlippageLimitsWarningContainer: React.FC<\n React.ComponentProps<typeof Box>\n> = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(1.25),\n marginTop: theme.spacing(1.5),\n}))\n\nexport const SlippageInput: React.FC<React.ComponentProps<typeof InputBase>> =\n styled(InputBase)(({ theme }) => ({\n minHeight: 44,\n width: '100%',\n backgroundColor: theme.vars.palette.background.default,\n border: '1px solid',\n borderColor: theme.vars.palette.divider,\n borderRadius: theme.vars.shape.borderRadius,\n paddingRight: theme.spacing(1),\n [`.${inputBaseClasses.input}`]: {\n padding: theme.spacing(1.5),\n fontSize: 16,\n fontWeight: 500,\n lineHeight: '20px',\n '&::placeholder': {\n opacity: 1,\n color: theme.vars.palette.text.secondary,\n },\n '&::-webkit-outer-spin-button, &::-webkit-inner-spin-button': {\n display: 'none',\n },\n },\n }))\n\nexport const SlippageClearButton: React.FC<\n React.ComponentProps<typeof IconButton>\n> = styled(IconButton)(({ theme }) => ({\n padding: theme.spacing(0.5),\n flexShrink: 0,\n}))\n"],"mappings":";;AAUA,MAAa,mBAET,OAAO,GAAG,CAAC,EAAE,EAAE,aAAa;CAC9B,SAAS;CACT,cAAc,MAAM,KAAK,MAAM;CAC/B,SAAS,MAAM,QAAQ,EAAG;CAC1B,KAAK,MAAM,QAAQ,EAAG;CACtB,QAAQ;CACR,iBAAiB,sBAAsB,MAAM,KAAK,QAAQ,OAAO,aAAa;CAC9E,GAAG,MAAM,YAAY,QAAQ,EAC3B,iBAAiB,sBAAsB,MAAM,KAAK,QAAQ,OAAO,aAAa,mBAChF,CAAC;AACH,EAAE;AAEF,MAAM,2BAA2B,WAAkB;CACjD,iBAAiB,MAAM,KAAK,QAAQ,WAAW;CAC/C,WAAW,kCAAkC,MAAM,KAAK,QAAQ,OAAO,aAAa;CACpF,GAAG,MAAM,YAAY,QAAQ;EAC3B,iBAAiB,sBAAsB,MAAM,KAAK,QAAQ,OAAO,WAAW;EAC5E,WAAW,kCAAkC,MAAM,KAAK,QAAQ,OAAO,WAAW;CACpF,CAAC;CACD,cAAc,QAAQ,MAAM,KAAK,MAAM,aAAa;AACtD;AAMA,MAAa,sBAET,OAAO,SAAS,CAAC,EAAwB,EAAE,OAAO,eAAe;CACnE,MAAM,gCAAgC,wBAAwB,KAAK;CACnE,MAAM,gBAAgB,WAClB,EACE,iBAAiB,EACf,GAAG,8BACL,EACF,IACA,CAAC;CAEL,OAAO;EACL,QAAQ;EACR,OAAO;GACN,IAAI,iBAAiB,UAAU;GAC9B,QAAQ;GACR,OAAO;GACP,SAAS;GACT,WAAW;GACX,kBAAkB;IAChB,UAAU;IACV,YAAY;IACZ,SAAS;GACX;GACA,WAAW,EACT,GAAG,8BACL;GACA,GAAG;EACL;CACF;AACF,CAAC;AAED,MAAa,iCAET,OAAO,GAAG,CAAC,EAAE,EAAE,aAAa;CAC9B,SAAS;CACT,KAAK,MAAM,QAAQ,IAAI;CACvB,WAAW,MAAM,QAAQ,GAAG;AAC9B,EAAE;AAEF,MAAa,gBACX,OAAO,SAAS,CAAC,EAAE,EAAE,aAAa;CAChC,WAAW;CACX,OAAO;CACP,iBAAiB,MAAM,KAAK,QAAQ,WAAW;CAC/C,QAAQ;CACR,aAAa,MAAM,KAAK,QAAQ;CAChC,cAAc,MAAM,KAAK,MAAM;CAC/B,cAAc,MAAM,QAAQ,CAAC;EAC5B,IAAI,iBAAiB,UAAU;EAC9B,SAAS,MAAM,QAAQ,GAAG;EAC1B,UAAU;EACV,YAAY;EACZ,YAAY;EACZ,kBAAkB;GAChB,SAAS;GACT,OAAO,MAAM,KAAK,QAAQ,KAAK;EACjC;EACA,8DAA8D,EAC5D,SAAS,OACX;CACF;AACF,EAAE;AAEJ,MAAa,sBAET,OAAO,UAAU,CAAC,EAAE,EAAE,aAAa;CACrC,SAAS,MAAM,QAAQ,EAAG;CAC1B,YAAY;AACd,EAAE"}