@lifi/widget 4.0.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 (485) hide show
  1. package/dist/esm/App.d.ts +4 -2
  2. package/dist/esm/App.d.ts.map +1 -1
  3. package/dist/esm/App.js +4 -4
  4. package/dist/esm/App.js.map +1 -1
  5. package/dist/esm/AppDefault.js +14 -0
  6. package/dist/esm/AppDefault.js.map +1 -1
  7. package/dist/esm/AppDrawer.d.ts +1 -1
  8. package/dist/esm/AppDrawer.d.ts.map +1 -1
  9. package/dist/esm/AppDrawer.js +5 -6
  10. package/dist/esm/AppDrawer.js.map +1 -1
  11. package/dist/esm/AppDrawerContext.js +2 -2
  12. package/dist/esm/AppDrawerContext.js.map +1 -1
  13. package/dist/esm/components/ActionRow/ActionRow.style.js.map +1 -1
  14. package/dist/esm/components/AmountInput/AmountInput.js +2 -1
  15. package/dist/esm/components/AmountInput/AmountInput.js.map +1 -1
  16. package/dist/esm/components/AmountInput/AmountInput.style.js.map +1 -1
  17. package/dist/esm/components/AmountInput/AmountInputEndAdornment.js +4 -2
  18. package/dist/esm/components/AmountInput/AmountInputEndAdornment.js.map +1 -1
  19. package/dist/esm/components/AmountInput/AmountInputEndAdornment.style.js +1 -1
  20. package/dist/esm/components/AmountInput/AmountInputEndAdornment.style.js.map +1 -1
  21. package/dist/esm/components/AmountInput/PriceFormHelperText.js +4 -2
  22. package/dist/esm/components/AmountInput/PriceFormHelperText.js.map +1 -1
  23. package/dist/esm/components/AmountInput/PriceFormHelperText.style.js.map +1 -1
  24. package/dist/esm/components/AmountInputCard/AmountInputCard.style.js +98 -0
  25. package/dist/esm/components/AmountInputCard/AmountInputCard.style.js.map +1 -0
  26. package/dist/esm/components/AmountInputCard/AmountInputCardPair.js +25 -0
  27. package/dist/esm/components/AmountInputCard/AmountInputCardPair.js.map +1 -0
  28. package/dist/esm/components/AmountInputCard/BalanceDisplay.js +35 -0
  29. package/dist/esm/components/AmountInputCard/BalanceDisplay.js.map +1 -0
  30. package/dist/esm/components/AmountInputCard/BalanceDisplay.style.js +11 -0
  31. package/dist/esm/components/AmountInputCard/BalanceDisplay.style.js.map +1 -0
  32. package/dist/esm/components/AmountInputCard/FiatValueToggle.js +41 -0
  33. package/dist/esm/components/AmountInputCard/FiatValueToggle.js.map +1 -0
  34. package/dist/esm/components/AmountInputCard/PercentageChips.js +80 -0
  35. package/dist/esm/components/AmountInputCard/PercentageChips.js.map +1 -0
  36. package/dist/esm/components/AmountInputCard/PercentageChips.style.js +43 -0
  37. package/dist/esm/components/AmountInputCard/PercentageChips.style.js.map +1 -0
  38. package/dist/esm/components/AmountInputCard/ReceiveAmountCard.js +137 -0
  39. package/dist/esm/components/AmountInputCard/ReceiveAmountCard.js.map +1 -0
  40. package/dist/esm/components/AmountInputCard/SendAmountCard.js +102 -0
  41. package/dist/esm/components/AmountInputCard/SendAmountCard.js.map +1 -0
  42. package/dist/esm/components/AppContainer.js.map +1 -1
  43. package/dist/esm/components/Avatar/AccountAvatar.js.map +1 -1
  44. package/dist/esm/components/Avatar/Avatar.js +12 -3
  45. package/dist/esm/components/Avatar/Avatar.js.map +1 -1
  46. package/dist/esm/components/Avatar/Avatar.style.js.map +1 -1
  47. package/dist/esm/components/Avatar/SmallAvatar.js.map +1 -1
  48. package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.js +1 -0
  49. package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.js.map +1 -1
  50. package/dist/esm/components/BottomSheet/BottomSheet.js +3 -3
  51. package/dist/esm/components/BottomSheet/BottomSheet.js.map +1 -1
  52. package/dist/esm/components/ButtonTertiary.js.map +1 -1
  53. package/dist/esm/components/Card/Card.js.map +1 -1
  54. package/dist/esm/components/Card/CardButton.style.js.map +1 -1
  55. package/dist/esm/components/Card/CardHeader.js.map +1 -1
  56. package/dist/esm/components/Card/CardIconButton.js.map +1 -1
  57. package/dist/esm/components/Card/CardLabel.js.map +1 -1
  58. package/dist/esm/components/Card/CardTitle.js.map +1 -1
  59. package/dist/esm/components/Card/InputCard.js.map +1 -1
  60. package/dist/esm/components/ChainSelect/ChainSelect.js.map +1 -1
  61. package/dist/esm/components/ChainSelect/ChainSelect.style.js.map +1 -1
  62. package/dist/esm/components/ChainSelect/useChainSelect.js.map +1 -1
  63. package/dist/esm/components/Chains/AllChainsAvatar.js.map +1 -1
  64. package/dist/esm/components/Chains/ChainList.js.map +1 -1
  65. package/dist/esm/components/Chains/ChainList.style.js.map +1 -1
  66. package/dist/esm/components/Chains/ChainsExpanded.style.js.map +1 -1
  67. package/dist/esm/components/Chains/VirtualizedChainList.js +2 -1
  68. package/dist/esm/components/Chains/VirtualizedChainList.js.map +1 -1
  69. package/dist/esm/components/ContextMenu.style.js.map +1 -1
  70. package/dist/esm/components/ContractComponent/NFT/NFT.style.js.map +1 -1
  71. package/dist/esm/components/Dialog/Dialog.style.js.map +1 -1
  72. package/dist/esm/components/EmptyListIndicator/EmptyListIndicator.style.js.map +1 -1
  73. package/dist/esm/components/ExecutionStatusCard/StatusIcon.js.map +1 -1
  74. package/dist/esm/components/ExecutionStatusCard/StatusIcon.style.js.map +1 -1
  75. package/dist/esm/components/ExecutionStatusCard/iconKey.js.map +1 -1
  76. package/dist/esm/components/Expansion/Expansion.style.js.map +1 -1
  77. package/dist/esm/components/Header/ActivitiesButton.style.js.map +1 -1
  78. package/dist/esm/components/Header/CloseDrawerButton.js +1 -0
  79. package/dist/esm/components/Header/CloseDrawerButton.js.map +1 -1
  80. package/dist/esm/components/Header/Header.js +7 -10
  81. package/dist/esm/components/Header/Header.js.map +1 -1
  82. package/dist/esm/components/Header/Header.style.js.map +1 -1
  83. package/dist/esm/components/Header/HeaderNavigationTabs.js +39 -0
  84. package/dist/esm/components/Header/HeaderNavigationTabs.js.map +1 -0
  85. package/dist/esm/components/Header/HeaderTabs.js +33 -0
  86. package/dist/esm/components/Header/HeaderTabs.js.map +1 -0
  87. package/dist/esm/components/Header/NavigationHeader.js +7 -5
  88. package/dist/esm/components/Header/NavigationHeader.js.map +1 -1
  89. package/dist/esm/components/Header/SettingsButton.style.js.map +1 -1
  90. package/dist/esm/components/Header/WalletMenu.style.js.map +1 -1
  91. package/dist/esm/components/IconCircle/IconCircle.style.js +1 -1
  92. package/dist/esm/components/IconCircle/IconCircle.style.js.map +1 -1
  93. package/dist/esm/components/IconTypography.js.map +1 -1
  94. package/dist/esm/components/Input.js.map +1 -1
  95. package/dist/esm/components/LimitOrderSettings/LimitOrderSettings.js +99 -0
  96. package/dist/esm/components/LimitOrderSettings/LimitOrderSettings.js.map +1 -0
  97. package/dist/esm/components/LimitOrderSettings/LimitOrderSettings.style.js +52 -0
  98. package/dist/esm/components/LimitOrderSettings/LimitOrderSettings.style.js.map +1 -0
  99. package/dist/esm/components/LimitPriceCard/LimitPriceCard.js +115 -0
  100. package/dist/esm/components/LimitPriceCard/LimitPriceCard.js.map +1 -0
  101. package/dist/esm/components/LimitPriceCard/LimitPriceCard.style.js +89 -0
  102. package/dist/esm/components/LimitPriceCard/LimitPriceCard.style.js.map +1 -0
  103. package/dist/esm/components/LimitPriceCard/LimitPricePresets.js +91 -0
  104. package/dist/esm/components/LimitPriceCard/LimitPricePresets.js.map +1 -0
  105. package/dist/esm/components/ListItem/ListItem.js.map +1 -1
  106. package/dist/esm/components/ListItem/ListItemButton.js.map +1 -1
  107. package/dist/esm/components/ListItemButton.js.map +1 -1
  108. package/dist/esm/components/ListItemText.js.map +1 -1
  109. package/dist/esm/components/Menu.js.map +1 -1
  110. package/dist/esm/components/Messages/AlertMessage.style.js.map +1 -1
  111. package/dist/esm/components/Messages/GasRefuelMessage.style.js.map +1 -1
  112. package/dist/esm/components/Messages/WarningMessages.js.map +1 -1
  113. package/dist/esm/components/PageContainer.js.map +1 -1
  114. package/dist/esm/components/PoweredBy/PoweredBy.js.map +1 -1
  115. package/dist/esm/components/PoweredBy/PoweredBy.style.js.map +1 -1
  116. package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js +1 -0
  117. package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js.map +1 -1
  118. package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.style.js.map +1 -1
  119. package/dist/esm/components/RouteCard/RouteDetails.js.map +1 -1
  120. package/dist/esm/components/RouteCard/RouteDetails.style.js +2 -2
  121. package/dist/esm/components/RouteCard/RouteDetails.style.js.map +1 -1
  122. package/dist/esm/components/RouteCard/RouteProviderCard.js +118 -0
  123. package/dist/esm/components/RouteCard/RouteProviderCard.js.map +1 -0
  124. package/dist/esm/components/RouteCard/RouteToken.style.js.map +1 -1
  125. package/dist/esm/components/RouteCard/RouteTokens.js.map +1 -1
  126. package/dist/esm/components/RouteCard/getMatchingLabels.js.map +1 -1
  127. package/dist/esm/components/Routes/LimitOrderRoutes.js +34 -0
  128. package/dist/esm/components/Routes/LimitOrderRoutes.js.map +1 -0
  129. package/dist/esm/components/Routes/Routes.js +2 -2
  130. package/dist/esm/components/Routes/Routes.js.map +1 -1
  131. package/dist/esm/components/Routes/RoutesContent.js.map +1 -1
  132. package/dist/esm/components/Routes/RoutesExpanded.style.js.map +1 -1
  133. package/dist/esm/components/Search/SearchInput.style.js.map +1 -1
  134. package/dist/esm/components/Search/SearchNotFound.style.js.map +1 -1
  135. package/dist/esm/components/SelectTokenButton/SelectTokenButton.style.js.map +1 -1
  136. package/dist/esm/components/SendToWallet/SendToWalletButton.style.js.map +1 -1
  137. package/dist/esm/components/SettingsListItemButton.js.map +1 -1
  138. package/dist/esm/components/SettingsPanel/SettingsPanel.js +51 -0
  139. package/dist/esm/components/SettingsPanel/SettingsPanel.js.map +1 -0
  140. package/dist/esm/components/SettingsPanel/SettingsPanel.style.js +33 -0
  141. package/dist/esm/components/SettingsPanel/SettingsPanel.style.js.map +1 -0
  142. package/dist/esm/components/SettingsPanel/utils.js +14 -0
  143. package/dist/esm/components/SettingsPanel/utils.js.map +1 -0
  144. package/dist/esm/components/Skeleton/WidgetSkeleton.js +50 -47
  145. package/dist/esm/components/Skeleton/WidgetSkeleton.js.map +1 -1
  146. package/dist/esm/components/Skeleton/WidgetSkeleton.style.js.map +1 -1
  147. package/dist/esm/components/Step/StepActions.js.map +1 -1
  148. package/dist/esm/components/Step/StepActions.style.js.map +1 -1
  149. package/dist/esm/components/StepActions/SentToWalletRow.style.js.map +1 -1
  150. package/dist/esm/components/StepActions/StepActionRow.style.js.map +1 -1
  151. package/dist/esm/components/SwapButton/SwapButton.js +50 -0
  152. package/dist/esm/components/SwapButton/SwapButton.js.map +1 -0
  153. package/dist/esm/components/SwapButton/SwapButton.style.js +24 -0
  154. package/dist/esm/components/SwapButton/SwapButton.style.js.map +1 -0
  155. package/dist/esm/components/Switch.js.map +1 -1
  156. package/dist/esm/components/Tabs/NavigationTabs.js +3 -0
  157. package/dist/esm/components/Tabs/NavigationTabs.js.map +1 -1
  158. package/dist/esm/components/Tabs/Tabs.style.js.map +1 -1
  159. package/dist/esm/components/Timer/StepStatusTimer.style.js.map +1 -1
  160. package/dist/esm/components/Token/Token.style.js.map +1 -1
  161. package/dist/esm/components/TokenList/PinTokenButton.js.map +1 -1
  162. package/dist/esm/components/TokenList/TokenDetailsSheet.js +4 -4
  163. package/dist/esm/components/TokenList/TokenDetailsSheet.js.map +1 -1
  164. package/dist/esm/components/TokenList/TokenDetailsSheetContent.js +4 -4
  165. package/dist/esm/components/TokenList/TokenDetailsSheetContent.js.map +1 -1
  166. package/dist/esm/components/TokenList/TokenDetailsSheetContent.style.js.map +1 -1
  167. package/dist/esm/components/TokenList/TokenList.style.js.map +1 -1
  168. package/dist/esm/components/TokenList/TokenListItem.js +2 -2
  169. package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
  170. package/dist/esm/components/TokenList/VirtualizedTokenList.js.map +1 -1
  171. package/dist/esm/components/TokenList/useTokenSelect.js +3 -3
  172. package/dist/esm/components/TokenList/useTokenSelect.js.map +1 -1
  173. package/dist/esm/components/TokenPillButton/TokenPillButton.js +52 -0
  174. package/dist/esm/components/TokenPillButton/TokenPillButton.js.map +1 -0
  175. package/dist/esm/components/TokenPillButton/TokenPillButton.style.js +39 -0
  176. package/dist/esm/components/TokenPillButton/TokenPillButton.style.js.map +1 -0
  177. package/dist/esm/components/TokenRate/TokenRate.style.js.map +1 -1
  178. package/dist/esm/components/TransactionCard/ActiveTransactionCard.js.map +1 -1
  179. package/dist/esm/components/TransactionCard/ActiveTransactionCard.style.js.map +1 -1
  180. package/dist/esm/components/TransactionCard/TransactionCard.style.js.map +1 -1
  181. package/dist/esm/config/version.d.ts +1 -1
  182. package/dist/esm/config/version.js +1 -1
  183. package/dist/esm/config/version.js.map +1 -1
  184. package/dist/esm/hooks/timer/validate.js.map +1 -1
  185. package/dist/esm/hooks/useAccountsBalancesData.js.map +1 -1
  186. package/dist/esm/hooks/useAvailableChains.js +1 -1
  187. package/dist/esm/hooks/useChainSearch.js +2 -1
  188. package/dist/esm/hooks/useChainSearch.js.map +1 -1
  189. package/dist/esm/hooks/useChains.js +1 -1
  190. package/dist/esm/hooks/useExplorer.js.map +1 -1
  191. package/dist/esm/hooks/useFilteredByTokenBalances.js +1 -1
  192. package/dist/esm/hooks/useFilteredByTokenBalances.js.map +1 -1
  193. package/dist/esm/hooks/useFromTokenSufficiency.js.map +1 -1
  194. package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
  195. package/dist/esm/hooks/useLanguages.js +2 -2
  196. package/dist/esm/hooks/useLanguages.js.map +1 -1
  197. package/dist/esm/hooks/useLimitMarketRate.js +24 -0
  198. package/dist/esm/hooks/useLimitMarketRate.js.map +1 -0
  199. package/dist/esm/hooks/useLinkedLimitFields.js +49 -0
  200. package/dist/esm/hooks/useLinkedLimitFields.js.map +1 -0
  201. package/dist/esm/hooks/useRouteExecution.js.map +1 -1
  202. package/dist/esm/hooks/useRouteExecutionMessage.js.map +1 -1
  203. package/dist/esm/hooks/useRouteRequiredAccountConnection.js.map +1 -1
  204. package/dist/esm/hooks/useRoutes.js +23 -6
  205. package/dist/esm/hooks/useRoutes.js.map +1 -1
  206. package/dist/esm/hooks/useSwapOnly.js +2 -4
  207. package/dist/esm/hooks/useSwapOnly.js.map +1 -1
  208. package/dist/esm/hooks/useToAddressRequirements.js +2 -2
  209. package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
  210. package/dist/esm/hooks/useToken.js.map +1 -1
  211. package/dist/esm/hooks/useTokenBalance.js.map +1 -1
  212. package/dist/esm/hooks/useTokenBalances.js.map +1 -1
  213. package/dist/esm/hooks/useTokenBalancesQueries.js.map +1 -1
  214. package/dist/esm/hooks/useTokenSearch.js +1 -1
  215. package/dist/esm/hooks/useTokenSearch.js.map +1 -1
  216. package/dist/esm/hooks/useTokens.js +17 -15
  217. package/dist/esm/hooks/useTokens.js.map +1 -1
  218. package/dist/esm/hooks/useTools.js +1 -1
  219. package/dist/esm/hooks/useTransactionDetails.js.map +1 -1
  220. package/dist/esm/hooks/useTransactionHistory.js.map +1 -1
  221. package/dist/esm/hooks/useTransactionList.js.map +1 -1
  222. package/dist/esm/hooks/useWideVariant.js +5 -2
  223. package/dist/esm/hooks/useWideVariant.js.map +1 -1
  224. package/dist/esm/i18n/en.json +25 -0
  225. package/dist/esm/index.d.ts +3 -3
  226. package/dist/esm/pages/ActivitiesPage/ActivitiesPage.js.map +1 -1
  227. package/dist/esm/pages/MainPage/LimitPageContent.js +23 -0
  228. package/dist/esm/pages/MainPage/LimitPageContent.js.map +1 -0
  229. package/dist/esm/pages/MainPage/MainPage.js +19 -22
  230. package/dist/esm/pages/MainPage/MainPage.js.map +1 -1
  231. package/dist/esm/pages/MainPage/MainPageActions.js +28 -0
  232. package/dist/esm/pages/MainPage/MainPageActions.js.map +1 -0
  233. package/dist/esm/pages/MainPage/ReviewButton.js +11 -4
  234. package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
  235. package/dist/esm/pages/RoutePriorityPage.js +48 -0
  236. package/dist/esm/pages/RoutePriorityPage.js.map +1 -0
  237. package/dist/esm/pages/RoutesPage/RoutesPage.js.map +1 -1
  238. package/dist/esm/pages/RoutesPage/RoutesPage.style.js.map +1 -1
  239. package/dist/esm/pages/SelectEnabledToolsPage.js.map +1 -1
  240. package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js +3 -3
  241. package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js.map +1 -1
  242. package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js +3 -3
  243. package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js.map +1 -1
  244. package/dist/esm/pages/SendToWallet/SendToWalletPage.js.map +1 -1
  245. package/dist/esm/pages/SendToWallet/SendToWalletPage.style.js.map +1 -1
  246. package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js +2 -2
  247. package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js.map +1 -1
  248. package/dist/esm/pages/SettingsPage/GasPriceSettings.js +1 -1
  249. package/dist/esm/pages/SettingsPage/ResetSettingsButton.style.js.map +1 -1
  250. package/dist/esm/pages/SettingsPage/RoutePrioritySettings.js +12 -27
  251. package/dist/esm/pages/SettingsPage/RoutePrioritySettings.js.map +1 -1
  252. package/dist/esm/pages/SettingsPage/SettingsCard/SettingCard.style.js.map +1 -1
  253. package/dist/esm/pages/SettingsPage/SettingsCard/SettingCardExpandable.js +3 -3
  254. package/dist/esm/pages/SettingsPage/SettingsCard/SettingCardExpandable.js.map +1 -1
  255. package/dist/esm/pages/SettingsPage/SettingsCard/SettingsAccordian.js +3 -3
  256. package/dist/esm/pages/SettingsPage/SettingsCard/SettingsAccordian.js.map +1 -1
  257. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippagePage.js +133 -0
  258. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippagePage.js.map +1 -0
  259. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js +14 -72
  260. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js.map +1 -1
  261. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js +26 -14
  262. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js.map +1 -1
  263. package/dist/esm/pages/SettingsPage/ThemeSettings.js +4 -0
  264. package/dist/esm/pages/SettingsPage/ThemeSettings.js.map +1 -1
  265. package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.style.js.map +1 -1
  266. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js.map +1 -1
  267. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsSkeleton.js.map +1 -1
  268. package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js +3 -3
  269. package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js.map +1 -1
  270. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js +16 -15
  271. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js.map +1 -1
  272. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.style.js.map +1 -1
  273. package/dist/esm/pages/TransactionPage/RouteTracker.js.map +1 -1
  274. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js +3 -3
  275. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
  276. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.style.js.map +1 -1
  277. package/dist/esm/pages/TransactionPage/TransactionExecutionContent.js +27 -31
  278. package/dist/esm/pages/TransactionPage/TransactionExecutionContent.js.map +1 -1
  279. package/dist/esm/pages/TransactionPage/TransactionReview.js +4 -1
  280. package/dist/esm/pages/TransactionPage/TransactionReview.js.map +1 -1
  281. package/dist/esm/pages/TransactionPage/utils.js.map +1 -1
  282. package/dist/esm/providers/I18nProvider/I18nProvider.js +1 -1
  283. package/dist/esm/providers/I18nProvider/I18nProvider.js.map +1 -1
  284. package/dist/esm/providers/I18nProvider/enResource.d.ts +1 -1
  285. package/dist/esm/providers/I18nProvider/enResource.js +1 -1
  286. package/dist/esm/providers/I18nProvider/i18n.js.map +1 -1
  287. package/dist/esm/providers/I18nProvider/types.d.ts +2 -2
  288. package/dist/esm/providers/QueryClientProvider.js +2 -2
  289. package/dist/esm/providers/QueryClientProvider.js.map +1 -1
  290. package/dist/esm/providers/SDKClientProvider.js +3 -3
  291. package/dist/esm/providers/SDKClientProvider.js.map +1 -1
  292. package/dist/esm/providers/WidgetProvider/WidgetProvider.js +4 -5
  293. package/dist/esm/providers/WidgetProvider/WidgetProvider.js.map +1 -1
  294. package/dist/esm/stores/StoreProvider.js +3 -4
  295. package/dist/esm/stores/StoreProvider.js.map +1 -1
  296. package/dist/esm/stores/bookmarks/BookmarkStore.js +3 -3
  297. package/dist/esm/stores/bookmarks/BookmarkStore.js.map +1 -1
  298. package/dist/esm/stores/bookmarks/createBookmarkStore.js.map +1 -1
  299. package/dist/esm/stores/chains/ChainOrderStore.js +4 -4
  300. package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
  301. package/dist/esm/stores/chains/createChainOrderStore.js.map +1 -1
  302. package/dist/esm/stores/form/FormStore.js +1 -1
  303. package/dist/esm/stores/form/FormStore.js.map +1 -1
  304. package/dist/esm/stores/form/URLSearchParamsBuilder.js +14 -3
  305. package/dist/esm/stores/form/URLSearchParamsBuilder.js.map +1 -1
  306. package/dist/esm/stores/form/createFormStore.js +6 -2
  307. package/dist/esm/stores/form/createFormStore.js.map +1 -1
  308. package/dist/esm/stores/form/getDefaultValuesFromQueryString.js +3 -0
  309. package/dist/esm/stores/form/getDefaultValuesFromQueryString.js.map +1 -1
  310. package/dist/esm/stores/form/types.d.ts +9 -1
  311. package/dist/esm/stores/form/types.d.ts.map +1 -1
  312. package/dist/esm/stores/form/types.js.map +1 -1
  313. package/dist/esm/stores/form/useClearAmountFields.js +1 -0
  314. package/dist/esm/stores/form/useClearAmountFields.js.map +1 -1
  315. package/dist/esm/stores/form/useFieldActions.js.map +1 -1
  316. package/dist/esm/stores/form/useFieldValues.js.map +1 -1
  317. package/dist/esm/stores/form/useFormRef.js.map +1 -1
  318. package/dist/esm/stores/form/useFormStore.js +2 -2
  319. package/dist/esm/stores/form/useFormStore.js.map +1 -1
  320. package/dist/esm/stores/header/useHeaderStore.js +3 -3
  321. package/dist/esm/stores/header/useHeaderStore.js.map +1 -1
  322. package/dist/esm/stores/inputMode/useInputModeStore.js.map +1 -1
  323. package/dist/esm/stores/navigationTabs/useNavigationTabLabel.js +22 -0
  324. package/dist/esm/stores/navigationTabs/useNavigationTabLabel.js.map +1 -0
  325. package/dist/esm/stores/navigationTabs/useNavigationTabsStore.js +64 -0
  326. package/dist/esm/stores/navigationTabs/useNavigationTabsStore.js.map +1 -0
  327. package/dist/esm/stores/navigationTabs/utils.js +122 -0
  328. package/dist/esm/stores/navigationTabs/utils.js.map +1 -0
  329. package/dist/esm/stores/pinnedTokens/PinnedTokensStore.js +3 -3
  330. package/dist/esm/stores/pinnedTokens/PinnedTokensStore.js.map +1 -1
  331. package/dist/esm/stores/pinnedTokens/createPinnedTokensStore.js.map +1 -1
  332. package/dist/esm/stores/routes/RouteExecutionStore.js +3 -3
  333. package/dist/esm/stores/routes/RouteExecutionStore.js.map +1 -1
  334. package/dist/esm/stores/routes/createRouteExecutionStore.js.map +1 -1
  335. package/dist/esm/stores/routes/useIntermediateRoutesStore.js.map +1 -1
  336. package/dist/esm/stores/routes/useRouteExecutionIndicator.js.map +1 -1
  337. package/dist/esm/stores/routes/utils.js.map +1 -1
  338. package/dist/esm/stores/settings/SettingsStore.js +3 -3
  339. package/dist/esm/stores/settings/SettingsStore.js.map +1 -1
  340. package/dist/esm/stores/settings/createSettingsStore.js +122 -96
  341. package/dist/esm/stores/settings/createSettingsStore.js.map +1 -1
  342. package/dist/esm/stores/settings/types.d.ts +0 -2
  343. package/dist/esm/stores/settings/types.d.ts.map +1 -1
  344. package/dist/esm/stores/settings/types.js.map +1 -1
  345. package/dist/esm/stores/settings/useSettingsActions.js.map +1 -1
  346. package/dist/esm/themes/createTheme.js.map +1 -1
  347. package/dist/esm/themes/utils.js.map +1 -1
  348. package/dist/esm/types/events.d.ts +10 -1
  349. package/dist/esm/types/events.d.ts.map +1 -1
  350. package/dist/esm/types/events.js +2 -0
  351. package/dist/esm/types/events.js.map +1 -1
  352. package/dist/esm/types/widget.d.ts +28 -2
  353. package/dist/esm/types/widget.d.ts.map +1 -1
  354. package/dist/esm/types/widget.js.map +1 -1
  355. package/dist/esm/utils/compactNumberFormatter.js.map +1 -1
  356. package/dist/esm/utils/converters.js.map +1 -1
  357. package/dist/esm/utils/deepEqual.js.map +1 -1
  358. package/dist/esm/utils/fees.js.map +1 -1
  359. package/dist/esm/utils/format.d.ts +1 -1
  360. package/dist/esm/utils/format.d.ts.map +1 -1
  361. package/dist/esm/utils/format.js +2 -2
  362. package/dist/esm/utils/format.js.map +1 -1
  363. package/dist/esm/utils/getActionMessage.js.map +1 -1
  364. package/dist/esm/utils/getErrorMessage.js.map +1 -1
  365. package/dist/esm/utils/item.js.map +1 -1
  366. package/dist/esm/utils/limitOrder.js +61 -0
  367. package/dist/esm/utils/limitOrder.js.map +1 -0
  368. package/dist/esm/utils/{variant.js → mode.js} +2 -2
  369. package/dist/esm/utils/mode.js.map +1 -0
  370. package/dist/esm/utils/navigationRoutes.d.ts +2 -0
  371. package/dist/esm/utils/navigationRoutes.d.ts.map +1 -1
  372. package/dist/esm/utils/navigationRoutes.js +6 -0
  373. package/dist/esm/utils/navigationRoutes.js.map +1 -1
  374. package/dist/esm/utils/prepareActions.js +1 -1
  375. package/dist/esm/utils/prepareActions.js.map +1 -1
  376. package/dist/esm/utils/timer.js.map +1 -1
  377. package/dist/esm/utils/token.js +1 -1
  378. package/dist/esm/utils/token.js.map +1 -1
  379. package/dist/esm/utils/tokenList.js.map +1 -1
  380. package/package.json +13 -13
  381. package/src/App.tsx +7 -7
  382. package/src/AppDefault.tsx +16 -0
  383. package/src/AppDrawer.tsx +77 -78
  384. package/src/AppDrawerContext.ts +2 -2
  385. package/src/components/AmountInput/AmountInputEndAdornment.style.ts +1 -1
  386. package/src/components/AmountInput/AmountInputEndAdornment.tsx +5 -2
  387. package/src/components/AmountInputCard/AmountInputCard.style.tsx +157 -0
  388. package/src/components/AmountInputCard/AmountInputCardPair.tsx +25 -0
  389. package/src/components/AmountInputCard/BalanceDisplay.style.tsx +9 -0
  390. package/src/components/AmountInputCard/BalanceDisplay.tsx +46 -0
  391. package/src/components/AmountInputCard/FiatValueToggle.tsx +55 -0
  392. package/src/components/AmountInputCard/PercentageChips.style.tsx +60 -0
  393. package/src/components/AmountInputCard/PercentageChips.tsx +100 -0
  394. package/src/components/AmountInputCard/ReceiveAmountCard.tsx +219 -0
  395. package/src/components/AmountInputCard/SendAmountCard.tsx +179 -0
  396. package/src/components/Avatar/Avatar.tsx +8 -3
  397. package/src/components/BaseTransactionButton/BaseTransactionButton.tsx +1 -0
  398. package/src/components/BottomSheet/BottomSheet.tsx +56 -52
  399. package/src/components/Header/CloseDrawerButton.tsx +5 -1
  400. package/src/components/Header/Header.tsx +20 -18
  401. package/src/components/Header/HeaderNavigationTabs.tsx +42 -0
  402. package/src/components/Header/HeaderTabs.tsx +48 -0
  403. package/src/components/Header/NavigationHeader.tsx +11 -8
  404. package/src/components/LimitOrderSettings/LimitOrderSettings.style.tsx +69 -0
  405. package/src/components/LimitOrderSettings/LimitOrderSettings.tsx +124 -0
  406. package/src/components/LimitPriceCard/LimitPriceCard.style.tsx +103 -0
  407. package/src/components/LimitPriceCard/LimitPriceCard.tsx +153 -0
  408. package/src/components/LimitPriceCard/LimitPricePresets.tsx +139 -0
  409. package/src/components/ReverseTokensButton/ReverseTokensButton.tsx +4 -1
  410. package/src/components/RouteCard/RouteProviderCard.tsx +113 -0
  411. package/src/components/Routes/LimitOrderRoutes.tsx +64 -0
  412. package/src/components/Routes/Routes.tsx +3 -2
  413. package/src/components/SettingsPanel/SettingsPanel.style.tsx +41 -0
  414. package/src/components/SettingsPanel/SettingsPanel.tsx +73 -0
  415. package/src/components/SettingsPanel/utils.ts +27 -0
  416. package/src/components/Skeleton/WidgetSkeleton.tsx +1 -1
  417. package/src/components/SwapButton/SwapButton.style.tsx +28 -0
  418. package/src/components/SwapButton/SwapButton.tsx +71 -0
  419. package/src/components/Tabs/NavigationTabs.tsx +3 -0
  420. package/src/components/TokenList/TokenDetailsSheet.tsx +9 -7
  421. package/src/components/TokenList/TokenDetailsSheetContent.tsx +176 -177
  422. package/src/components/TokenList/useTokenSelect.ts +2 -2
  423. package/src/components/TokenPillButton/TokenPillButton.style.tsx +50 -0
  424. package/src/components/TokenPillButton/TokenPillButton.tsx +81 -0
  425. package/src/config/version.ts +1 -1
  426. package/src/hooks/useLimitMarketRate.ts +39 -0
  427. package/src/hooks/useLinkedLimitFields.ts +74 -0
  428. package/src/hooks/useRoutes.ts +45 -4
  429. package/src/hooks/useSwapOnly.ts +2 -5
  430. package/src/hooks/useToAddressRequirements.ts +2 -2
  431. package/src/hooks/useWideVariant.ts +8 -2
  432. package/src/pages/MainPage/LimitPageContent.tsx +18 -0
  433. package/src/pages/MainPage/MainPage.tsx +43 -30
  434. package/src/pages/MainPage/MainPageActions.tsx +35 -0
  435. package/src/pages/MainPage/ReviewButton.tsx +15 -3
  436. package/src/pages/RoutePriorityPage.tsx +55 -0
  437. package/src/pages/SendToWallet/BookmarkAddressSheet.tsx +176 -185
  438. package/src/pages/SendToWallet/ConfirmAddressSheet.tsx +9 -6
  439. package/src/pages/SettingsPage/RoutePrioritySettings.tsx +14 -38
  440. package/src/pages/SettingsPage/SettingsCard/SettingCardExpandable.tsx +58 -65
  441. package/src/pages/SettingsPage/SettingsCard/SettingsAccordian.tsx +4 -4
  442. package/src/pages/SettingsPage/SlippageSettings/SlippagePage.tsx +176 -0
  443. package/src/pages/SettingsPage/SlippageSettings/SlippageSettings.style.tsx +32 -25
  444. package/src/pages/SettingsPage/SlippageSettings/SlippageSettings.tsx +14 -128
  445. package/src/pages/SettingsPage/ThemeSettings.tsx +4 -0
  446. package/src/pages/TransactionPage/ConfirmToAddressSheet.tsx +9 -6
  447. package/src/pages/TransactionPage/ExchangeRateBottomSheet.tsx +53 -58
  448. package/src/pages/TransactionPage/TokenValueBottomSheet.tsx +24 -21
  449. package/src/pages/TransactionPage/TransactionExecutionContent.tsx +8 -6
  450. package/src/providers/QueryClientProvider.tsx +2 -2
  451. package/src/providers/SDKClientProvider.tsx +3 -7
  452. package/src/providers/WidgetProvider/WidgetProvider.tsx +6 -7
  453. package/src/stores/StoreProvider.tsx +3 -10
  454. package/src/stores/bookmarks/BookmarkStore.tsx +4 -4
  455. package/src/stores/chains/ChainOrderStore.tsx +4 -4
  456. package/src/stores/form/FormStore.tsx +2 -2
  457. package/src/stores/form/URLSearchParamsBuilder.tsx +25 -3
  458. package/src/stores/form/createFormStore.ts +7 -3
  459. package/src/stores/form/getDefaultValuesFromQueryString.ts +11 -0
  460. package/src/stores/form/types.ts +14 -1
  461. package/src/stores/form/useClearAmountFields.ts +1 -0
  462. package/src/stores/form/useFormStore.ts +2 -2
  463. package/src/stores/header/useHeaderStore.tsx +3 -5
  464. package/src/stores/navigationTabs/types.ts +33 -0
  465. package/src/stores/navigationTabs/useNavigationTabLabel.ts +28 -0
  466. package/src/stores/navigationTabs/useNavigationTabsStore.tsx +113 -0
  467. package/src/stores/navigationTabs/utils.ts +196 -0
  468. package/src/stores/pinnedTokens/PinnedTokensStore.tsx +4 -4
  469. package/src/stores/routes/RouteExecutionStore.tsx +4 -4
  470. package/src/stores/settings/SettingsStore.tsx +4 -4
  471. package/src/stores/settings/createSettingsStore.ts +48 -12
  472. package/src/stores/settings/types.ts +1 -16
  473. package/src/types/events.ts +12 -0
  474. package/src/types/widget.ts +40 -1
  475. package/src/utils/format.ts +6 -2
  476. package/src/utils/limitOrder.ts +88 -0
  477. package/src/utils/navigationRoutes.ts +6 -0
  478. package/dist/esm/components/Header/SplitNavigationTabs.js +0 -33
  479. package/dist/esm/components/Header/SplitNavigationTabs.js.map +0 -1
  480. package/dist/esm/stores/settings/useSplitModeStore.js +0 -36
  481. package/dist/esm/stores/settings/useSplitModeStore.js.map +0 -1
  482. package/dist/esm/utils/variant.js.map +0 -1
  483. package/src/components/Header/SplitNavigationTabs.tsx +0 -32
  484. package/src/stores/settings/useSplitModeStore.tsx +0 -58
  485. /package/src/utils/{variant.ts → mode.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"FormStore.js","names":[],"sources":["../../../../src/stores/form/FormStore.tsx"],"sourcesContent":["import type { PropsWithChildren } from 'react'\nimport { useMemo, useRef } from 'react'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormRef } from '../../types/widget.js'\nimport { createFormStore, formDefaultValues } from './createFormStore.js'\nimport { FormStoreContext } from './FormStoreContext.js'\nimport { FormUpdater } from './FormUpdater.js'\nimport { getDefaultValuesFromQueryString } from './getDefaultValuesFromQueryString.js'\nimport type { DefaultValues, FormStoreStore } from './types.js'\nimport { useFormRef } from './useFormRef.js'\n\n// decorates and initialise the form date for use in the form store\nconst initialiseDefaultValues = (defaultValues: Partial<DefaultValues>) => ({\n ...formDefaultValues,\n ...defaultValues,\n fromAmount:\n (typeof defaultValues.fromAmount === 'number'\n ? (defaultValues.fromAmount as number)?.toPrecision?.()\n : defaultValues.fromAmount) || formDefaultValues.fromAmount,\n toAmount:\n (typeof defaultValues.toAmount === 'number'\n ? (defaultValues.toAmount as number)?.toPrecision?.()\n : defaultValues.toAmount) || formDefaultValues.toAmount,\n // Prevent setting address when the field is hidden\n toAddress: defaultValues.toAddress || formDefaultValues.toAddress,\n})\n\ninterface FormStoreProviderProps extends PropsWithChildren {\n formRef?: FormRef\n}\n\nexport const FormStoreProvider: React.FC<FormStoreProviderProps> = ({\n children,\n formRef,\n}) => {\n const widgetConfig = useWidgetConfig()\n\n const {\n fromChain,\n fromToken,\n toChain,\n toToken,\n fromAmount,\n toAmount,\n toAddress,\n formUpdateKey,\n buildUrl,\n } = widgetConfig\n\n const storeRef = useRef<FormStoreStore>(null)\n\n const configHasFromChain = Object.hasOwn(widgetConfig, 'fromChain')\n const configHasFromToken = Object.hasOwn(widgetConfig, 'fromToken')\n const configHasFromAmount = Object.hasOwn(widgetConfig, 'fromAmount')\n const configHasToAmount = Object.hasOwn(widgetConfig, 'toAmount')\n const configHasToAddress = Object.hasOwn(widgetConfig, 'toAddress')\n const configHasToChain = Object.hasOwn(widgetConfig, 'toChain')\n const configHasToToken = Object.hasOwn(widgetConfig, 'toToken')\n\n // We use the presence/absence of a property to decide if the form values in state need to be updated\n // We only build and set a property on the memoized form values here if they are included in the\n // config - undefined is considered a valid value that will reset that form field\n // biome-ignore lint/correctness/useExhaustiveDependencies: formUpdateKey is needed here.\n const reactiveFormValues = useMemo(\n () => ({\n ...(configHasFromChain ? { fromChain } : undefined),\n ...(configHasFromToken ? { fromToken } : undefined),\n ...(configHasFromAmount\n ? {\n fromAmount:\n (typeof fromAmount === 'number'\n ? fromAmount?.toPrecision()\n : fromAmount) || formDefaultValues.fromAmount,\n }\n : undefined),\n ...(configHasToAmount\n ? {\n toAmount:\n (typeof toAmount === 'number'\n ? toAmount?.toPrecision()\n : toAmount) || formDefaultValues.toAmount,\n }\n : undefined),\n ...(configHasToChain ? { toChain } : undefined),\n ...(configHasToToken ? { toToken } : undefined),\n ...(configHasToAddress\n ? {\n toAddress: toAddress?.address || formDefaultValues.toAddress,\n }\n : undefined),\n }),\n [\n fromAmount,\n toAmount,\n fromChain,\n fromToken,\n toAddress,\n toChain,\n toToken,\n // formUpdateKey should be a randomly assigned unique key. It can be used to force updates for the form field values\n formUpdateKey,\n configHasFromChain,\n configHasFromToken,\n configHasFromAmount,\n configHasToAmount,\n configHasToAddress,\n configHasToChain,\n configHasToToken,\n ]\n )\n\n if (!storeRef.current) {\n const queryDefaults = getDefaultValuesFromQueryString({\n buildUrl,\n includeToAddress: false,\n })\n storeRef.current = createFormStore(\n initialiseDefaultValues({\n ...reactiveFormValues,\n ...queryDefaults,\n })\n )\n }\n\n useFormRef(storeRef.current, formRef)\n\n return (\n <FormStoreContext.Provider value={storeRef.current}>\n {children}\n <FormUpdater reactiveFormValues={reactiveFormValues} />\n </FormStoreContext.Provider>\n )\n}\n"],"mappings":";;;;;;;;;AAYA,MAAM,2BAA2B,mBAA2C;CAC1E,GAAG;CACH,GAAG;CACH,aACG,OAAO,cAAc,eAAe,WAChC,cAAc,YAAuB,cAAc,IACpD,cAAc,eAAe,kBAAkB;CACrD,WACG,OAAO,cAAc,aAAa,WAC9B,cAAc,UAAqB,cAAc,IAClD,cAAc,aAAa,kBAAkB;CAEnD,WAAW,cAAc,aAAa,kBAAkB;AAC1D;AAMA,MAAa,qBAAuD,EAClE,UACA,cACI;CACJ,MAAM,eAAe,gBAAgB;CAErC,MAAM,EACJ,WACA,WACA,SACA,SACA,YACA,UACA,WACA,eACA,aACE;CAEJ,MAAM,WAAW,OAAuB,IAAI;CAE5C,MAAM,qBAAqB,OAAO,OAAO,cAAc,WAAW;CAClE,MAAM,qBAAqB,OAAO,OAAO,cAAc,WAAW;CAClE,MAAM,sBAAsB,OAAO,OAAO,cAAc,YAAY;CACpE,MAAM,oBAAoB,OAAO,OAAO,cAAc,UAAU;CAChE,MAAM,qBAAqB,OAAO,OAAO,cAAc,WAAW;CAClE,MAAM,mBAAmB,OAAO,OAAO,cAAc,SAAS;CAC9D,MAAM,mBAAmB,OAAO,OAAO,cAAc,SAAS;CAM9D,MAAM,qBAAqB,eAClB;EACL,GAAI,qBAAqB,EAAE,UAAU,IAAI,KAAA;EACzC,GAAI,qBAAqB,EAAE,UAAU,IAAI,KAAA;EACzC,GAAI,sBACA,EACE,aACG,OAAO,eAAe,WACnB,YAAY,YAAY,IACxB,eAAe,kBAAkB,WACzC,IACA,KAAA;EACJ,GAAI,oBACA,EACE,WACG,OAAO,aAAa,WACjB,UAAU,YAAY,IACtB,aAAa,kBAAkB,SACvC,IACA,KAAA;EACJ,GAAI,mBAAmB,EAAE,QAAQ,IAAI,KAAA;EACrC,GAAI,mBAAmB,EAAE,QAAQ,IAAI,KAAA;EACrC,GAAI,qBACA,EACE,WAAW,WAAW,WAAW,kBAAkB,UACrD,IACA,KAAA;CACN,IACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,IAAI,CAAC,SAAS,SAAS;EACrB,MAAM,gBAAgB,gCAAgC;GACpD;GACA,kBAAkB;EACpB,CAAC;EACD,SAAS,UAAU,gBACjB,wBAAwB;GACtB,GAAG;GACH,GAAG;EACL,CAAC,CACH;CACF;CAEA,WAAW,SAAS,SAAS,OAAO;CAEpC,OACE,qBAAC,iBAAiB,UAAlB;EAA2B,OAAO,SAAS;YAA3C,CACG,UACD,oBAAC,aAAD,EAAiC,mBAAqB,CAAA,CAC7B;;AAE/B"}
1
+ {"version":3,"file":"FormStore.js","names":[],"sources":["../../../../src/stores/form/FormStore.tsx"],"sourcesContent":["import type { PropsWithChildren } from 'react'\nimport { useMemo, useRef } from 'react'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormRef } from '../../types/widget.js'\nimport { createFormStore, formDefaultValues } from './createFormStore.js'\nimport { FormStoreContext } from './FormStoreContext.js'\nimport { FormUpdater } from './FormUpdater.js'\nimport { getDefaultValuesFromQueryString } from './getDefaultValuesFromQueryString.js'\nimport type { DefaultValues, FormStoreStore } from './types.js'\nimport { useFormRef } from './useFormRef.js'\n\n// decorates and initialise the form date for use in the form store\nconst initialiseDefaultValues = (defaultValues: Partial<DefaultValues>) => ({\n ...formDefaultValues,\n ...defaultValues,\n fromAmount:\n (typeof defaultValues.fromAmount === 'number'\n ? (defaultValues.fromAmount as number)?.toPrecision?.()\n : defaultValues.fromAmount) || formDefaultValues.fromAmount,\n toAmount:\n (typeof defaultValues.toAmount === 'number'\n ? (defaultValues.toAmount as number)?.toPrecision?.()\n : defaultValues.toAmount) || formDefaultValues.toAmount,\n // Prevent setting address when the field is hidden\n toAddress: defaultValues.toAddress || formDefaultValues.toAddress,\n})\n\ninterface FormStoreProviderProps extends PropsWithChildren {\n formRef?: FormRef\n}\n\nexport const FormStoreProvider: React.FC<FormStoreProviderProps> = ({\n children,\n formRef,\n}) => {\n const widgetConfig = useWidgetConfig()\n\n const {\n fromChain,\n fromToken,\n toChain,\n toToken,\n fromAmount,\n toAmount,\n toAddress,\n formUpdateKey,\n buildUrl,\n } = widgetConfig\n\n const storeRef = useRef<FormStoreStore>(null)\n\n const configHasFromChain = Object.hasOwn(widgetConfig, 'fromChain')\n const configHasFromToken = Object.hasOwn(widgetConfig, 'fromToken')\n const configHasFromAmount = Object.hasOwn(widgetConfig, 'fromAmount')\n const configHasToAmount = Object.hasOwn(widgetConfig, 'toAmount')\n const configHasToAddress = Object.hasOwn(widgetConfig, 'toAddress')\n const configHasToChain = Object.hasOwn(widgetConfig, 'toChain')\n const configHasToToken = Object.hasOwn(widgetConfig, 'toToken')\n\n // We use the presence/absence of a property to decide if the form values in state need to be updated\n // We only build and set a property on the memoized form values here if they are included in the\n // config - undefined is considered a valid value that will reset that form field\n // biome-ignore lint/correctness/useExhaustiveDependencies: formUpdateKey is needed here.\n const reactiveFormValues = useMemo(\n () => ({\n ...(configHasFromChain ? { fromChain } : undefined),\n ...(configHasFromToken ? { fromToken } : undefined),\n ...(configHasFromAmount\n ? {\n fromAmount:\n (typeof fromAmount === 'number'\n ? fromAmount?.toPrecision()\n : fromAmount) || formDefaultValues.fromAmount,\n }\n : undefined),\n ...(configHasToAmount\n ? {\n toAmount:\n (typeof toAmount === 'number'\n ? toAmount?.toPrecision()\n : toAmount) || formDefaultValues.toAmount,\n }\n : undefined),\n ...(configHasToChain ? { toChain } : undefined),\n ...(configHasToToken ? { toToken } : undefined),\n ...(configHasToAddress\n ? {\n toAddress: toAddress?.address || formDefaultValues.toAddress,\n }\n : undefined),\n }),\n [\n fromAmount,\n toAmount,\n fromChain,\n fromToken,\n toAddress,\n toChain,\n toToken,\n // formUpdateKey should be a randomly assigned unique key. It can be used to force updates for the form field values\n formUpdateKey,\n configHasFromChain,\n configHasFromToken,\n configHasFromAmount,\n configHasToAmount,\n configHasToAddress,\n configHasToChain,\n configHasToToken,\n ]\n )\n\n if (!storeRef.current) {\n const queryDefaults = getDefaultValuesFromQueryString({\n buildUrl,\n includeToAddress: false,\n })\n storeRef.current = createFormStore(\n initialiseDefaultValues({\n ...reactiveFormValues,\n ...queryDefaults,\n })\n )\n }\n\n useFormRef(storeRef.current, formRef)\n\n return (\n <FormStoreContext value={storeRef.current}>\n {children}\n <FormUpdater reactiveFormValues={reactiveFormValues} />\n </FormStoreContext>\n )\n}\n"],"mappings":";;;;;;;;;AAYA,MAAM,2BAA2B,mBAA2C;CAC1E,GAAG;CACH,GAAG;CACH,aACG,OAAO,cAAc,eAAe,WAChC,cAAc,YAAuB,cAAc,IACpD,cAAc,eAAe,kBAAkB;CACrD,WACG,OAAO,cAAc,aAAa,WAC9B,cAAc,UAAqB,cAAc,IAClD,cAAc,aAAa,kBAAkB;CAEnD,WAAW,cAAc,aAAa,kBAAkB;AAC1D;AAMA,MAAa,qBAAuD,EAClE,UACA,cACI;CACJ,MAAM,eAAe,gBAAgB;CAErC,MAAM,EACJ,WACA,WACA,SACA,SACA,YACA,UACA,WACA,eACA,aACE;CAEJ,MAAM,WAAW,OAAuB,IAAI;CAE5C,MAAM,qBAAqB,OAAO,OAAO,cAAc,WAAW;CAClE,MAAM,qBAAqB,OAAO,OAAO,cAAc,WAAW;CAClE,MAAM,sBAAsB,OAAO,OAAO,cAAc,YAAY;CACpE,MAAM,oBAAoB,OAAO,OAAO,cAAc,UAAU;CAChE,MAAM,qBAAqB,OAAO,OAAO,cAAc,WAAW;CAClE,MAAM,mBAAmB,OAAO,OAAO,cAAc,SAAS;CAC9D,MAAM,mBAAmB,OAAO,OAAO,cAAc,SAAS;CAM9D,MAAM,qBAAqB,eAClB;EACL,GAAI,qBAAqB,EAAE,UAAU,IAAI,KAAA;EACzC,GAAI,qBAAqB,EAAE,UAAU,IAAI,KAAA;EACzC,GAAI,sBACA,EACE,aACG,OAAO,eAAe,WACnB,YAAY,YAAY,IACxB,eAAe,kBAAkB,WACzC,IACA,KAAA;EACJ,GAAI,oBACA,EACE,WACG,OAAO,aAAa,WACjB,UAAU,YAAY,IACtB,aAAa,kBAAkB,SACvC,IACA,KAAA;EACJ,GAAI,mBAAmB,EAAE,QAAQ,IAAI,KAAA;EACrC,GAAI,mBAAmB,EAAE,QAAQ,IAAI,KAAA;EACrC,GAAI,qBACA,EACE,WAAW,WAAW,WAAW,kBAAkB,UACrD,IACA,KAAA;CACN,IACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,IAAI,CAAC,SAAS,SAAS;EACrB,MAAM,gBAAgB,gCAAgC;GACpD;GACA,kBAAkB;EACpB,CAAC;EACD,SAAS,UAAU,gBACjB,wBAAwB;GACtB,GAAG;GACH,GAAG;EACL,CAAC,CACH;CACF;CAEA,WAAW,SAAS,SAAS,OAAO;CAEpC,OACE,qBAAC,kBAAD;EAAkB,OAAO,SAAS;YAAlC,CACG,UACD,oBAAC,aAAD,EAAiC,mBAAqB,CAAA,CACtC;;AAEtB"}
@@ -16,13 +16,18 @@ const formValueKeys = [
16
16
  "toChain",
17
17
  "toToken"
18
18
  ];
19
+ const limitFormValueKeys = [
20
+ "toAmount",
21
+ "validUntil",
22
+ "partiallyFillable"
23
+ ];
19
24
  const URLSearchParamsBuilder = () => {
20
25
  const { pathname } = useLocation();
21
26
  const touchedFields = useTouchedFields();
22
- const values = useFieldValues(...formValueKeys);
27
+ const values = useFieldValues(...formValueKeys, ...limitFormValueKeys);
23
28
  const { setSelectedBookmark, addRecentWallet } = useBookmarkActions();
24
29
  const { validateAddress } = useAddressValidation();
25
- const { buildUrl } = useWidgetConfig();
30
+ const { buildUrl, mode } = useWidgetConfig();
26
31
  const { getFieldValues, isTouched, setUserAndDefaultValues } = useFieldActions();
27
32
  useEffect(() => {
28
33
  const { toAddress, ...initialFormValues } = getDefaultValuesFromQueryString({ buildUrl });
@@ -62,6 +67,11 @@ const URLSearchParamsBuilder = () => {
62
67
  if (isTouched(key) && value) url.searchParams.set(key, value.toString());
63
68
  else if (url.searchParams.has(key) && !value) url.searchParams.delete(key);
64
69
  });
70
+ limitFormValueKeys.forEach((key) => {
71
+ const value = getFieldValues(key)[0];
72
+ if (mode === "limit" && (typeof value === "boolean" ? true : Boolean(value))) url.searchParams.set(key, String(value));
73
+ else url.searchParams.delete(key);
74
+ });
65
75
  url.searchParams.sort();
66
76
  window.history.replaceState(window.history.state, "", url);
67
77
  }, [
@@ -69,7 +79,8 @@ const URLSearchParamsBuilder = () => {
69
79
  touchedFields,
70
80
  values,
71
81
  isTouched,
72
- getFieldValues
82
+ getFieldValues,
83
+ mode
73
84
  ]);
74
85
  return null;
75
86
  };
@@ -1 +1 @@
1
- {"version":3,"file":"URLSearchParamsBuilder.js","names":[],"sources":["../../../../src/stores/form/URLSearchParamsBuilder.tsx"],"sourcesContent":["import { useLocation } from '@tanstack/react-router'\nimport { useEffect } from 'react'\nimport { useAddressValidation } from '../../hooks/useAddressValidation.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useBookmarkActions } from '../bookmarks/useBookmarkActions.js'\nimport type { FormFieldNames } from '../form/types.js'\nimport { useFieldActions } from '../form/useFieldActions.js'\nimport { useFieldValues } from '../form/useFieldValues.js'\nimport { useTouchedFields } from '../form/useTouchedFields.js'\nimport { getDefaultValuesFromQueryString } from './getDefaultValuesFromQueryString.js'\n\nconst formValueKeys: FormFieldNames[] = [\n 'fromAmount',\n 'fromChain',\n 'fromToken',\n 'toAddress',\n 'toChain',\n 'toToken',\n]\n\nexport const URLSearchParamsBuilder = () => {\n const { pathname } = useLocation()\n const touchedFields = useTouchedFields()\n const values = useFieldValues(...formValueKeys)\n const { setSelectedBookmark, addRecentWallet } = useBookmarkActions()\n const { validateAddress } = useAddressValidation()\n const { buildUrl } = useWidgetConfig()\n // Using these methods as trying to use the touchedFields and values above\n // often has a lag that can effect the widgets initialisation sequence\n // and accidentally cause values to be wiped from the query string\n const { getFieldValues, isTouched, setUserAndDefaultValues } =\n useFieldActions()\n\n useEffect(() => {\n // get the initial values from the querystring\n const formValues = getDefaultValuesFromQueryString({ buildUrl })\n const { toAddress, ...initialFormValues } = formValues\n\n /**\n * When URL builder is enabled and user opens a page with toAddress parameter,\n * validate the address and set it up as a bookmark. This allows direct linking\n * to the widget with a pre-filled destination address that will be treated the\n * same way as a manually entered and validated address.\n */\n const initializeFromAddress = async () => {\n if (toAddress) {\n try {\n const validationResult = await validateAddress({\n value: toAddress,\n })\n if (validationResult.isValid && toAddress) {\n const bookmark = {\n address: validationResult.address,\n chainType: validationResult.chainType,\n }\n setUserAndDefaultValues({ toAddress })\n setSelectedBookmark(bookmark)\n addRecentWallet(bookmark)\n }\n } catch (_) {\n // Address validation failed\n }\n }\n }\n\n setUserAndDefaultValues(initialFormValues)\n initializeFromAddress()\n }, [\n setUserAndDefaultValues,\n validateAddress,\n setSelectedBookmark,\n addRecentWallet,\n buildUrl,\n ])\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: run only when pathname changes\n useEffect(() => {\n // set the values on the querysting\n const url = new URL(window.location as any)\n formValueKeys.forEach((key, _index) => {\n const value = getFieldValues(key)[0]\n if (isTouched(key) && value) {\n url.searchParams.set(key, value.toString())\n } else if (url.searchParams.has(key) && !value) {\n url.searchParams.delete(key)\n }\n })\n url.searchParams.sort()\n window.history.replaceState(window.history.state, '', url)\n }, [pathname, touchedFields, values, isTouched, getFieldValues])\n\n return null\n}\n"],"mappings":";;;;;;;;;;AAWA,MAAM,gBAAkC;CACtC;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,+BAA+B;CAC1C,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,gBAAgB,iBAAiB;CACvC,MAAM,SAAS,eAAe,GAAG,aAAa;CAC9C,MAAM,EAAE,qBAAqB,oBAAoB,mBAAmB;CACpE,MAAM,EAAE,oBAAoB,qBAAqB;CACjD,MAAM,EAAE,aAAa,gBAAgB;CAIrC,MAAM,EAAE,gBAAgB,WAAW,4BACjC,gBAAgB;CAElB,gBAAgB;EAGd,MAAM,EAAE,WAAW,GAAG,sBADH,gCAAgC,EAAE,SAAS,CACT;;;;;;;EAQrD,MAAM,wBAAwB,YAAY;GACxC,IAAI,WACF,IAAI;IACF,MAAM,mBAAmB,MAAM,gBAAgB,EAC7C,OAAO,UACT,CAAC;IACD,IAAI,iBAAiB,WAAW,WAAW;KACzC,MAAM,WAAW;MACf,SAAS,iBAAiB;MAC1B,WAAW,iBAAiB;KAC9B;KACA,wBAAwB,EAAE,UAAU,CAAC;KACrC,oBAAoB,QAAQ;KAC5B,gBAAgB,QAAQ;IAC1B;GACF,SAAS,GAAG,CAEZ;EAEJ;EAEA,wBAAwB,iBAAiB;EACzC,sBAAsB;CACxB,GAAG;EACD;EACA;EACA;EACA;EACA;CACF,CAAC;CAGD,gBAAgB;EAEd,MAAM,MAAM,IAAI,IAAI,OAAO,QAAe;EAC1C,cAAc,SAAS,KAAK,WAAW;GACrC,MAAM,QAAQ,eAAe,GAAG,EAAE;GAClC,IAAI,UAAU,GAAG,KAAK,OACpB,IAAI,aAAa,IAAI,KAAK,MAAM,SAAS,CAAC;QACrC,IAAI,IAAI,aAAa,IAAI,GAAG,KAAK,CAAC,OACvC,IAAI,aAAa,OAAO,GAAG;EAE/B,CAAC;EACD,IAAI,aAAa,KAAK;EACtB,OAAO,QAAQ,aAAa,OAAO,QAAQ,OAAO,IAAI,GAAG;CAC3D,GAAG;EAAC;EAAU;EAAe;EAAQ;EAAW;CAAc,CAAC;CAE/D,OAAO;AACT"}
1
+ {"version":3,"file":"URLSearchParamsBuilder.js","names":[],"sources":["../../../../src/stores/form/URLSearchParamsBuilder.tsx"],"sourcesContent":["import { useLocation } from '@tanstack/react-router'\nimport { useEffect } from 'react'\nimport { useAddressValidation } from '../../hooks/useAddressValidation.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useBookmarkActions } from '../bookmarks/useBookmarkActions.js'\nimport type { FormFieldNames } from '../form/types.js'\nimport { useFieldActions } from '../form/useFieldActions.js'\nimport { useFieldValues } from '../form/useFieldValues.js'\nimport { useTouchedFields } from '../form/useTouchedFields.js'\nimport { getDefaultValuesFromQueryString } from './getDefaultValuesFromQueryString.js'\n\nconst formValueKeys: FormFieldNames[] = [\n 'fromAmount',\n 'fromChain',\n 'fromToken',\n 'toAddress',\n 'toChain',\n 'toToken',\n]\n\n// Limit-order params are only mirrored to the URL while the limit tab is\n// active, and stripped when the user leaves it. Unlike the base keys these are\n// presence-gated (not touched-gated) so the URL fully reproduces the limit\n// order — including the boolean/number fields, which are never \"falsy-empty\".\nconst limitFormValueKeys: FormFieldNames[] = [\n 'toAmount',\n 'validUntil',\n 'partiallyFillable',\n]\n\nexport const URLSearchParamsBuilder = () => {\n const { pathname } = useLocation()\n const touchedFields = useTouchedFields()\n const values = useFieldValues(...formValueKeys, ...limitFormValueKeys)\n const { setSelectedBookmark, addRecentWallet } = useBookmarkActions()\n const { validateAddress } = useAddressValidation()\n const { buildUrl, mode } = useWidgetConfig()\n // Using these methods as trying to use the touchedFields and values above\n // often has a lag that can effect the widgets initialisation sequence\n // and accidentally cause values to be wiped from the query string\n const { getFieldValues, isTouched, setUserAndDefaultValues } =\n useFieldActions()\n\n useEffect(() => {\n // get the initial values from the querystring\n const formValues = getDefaultValuesFromQueryString({ buildUrl })\n const { toAddress, ...initialFormValues } = formValues\n\n /**\n * When URL builder is enabled and user opens a page with toAddress parameter,\n * validate the address and set it up as a bookmark. This allows direct linking\n * to the widget with a pre-filled destination address that will be treated the\n * same way as a manually entered and validated address.\n */\n const initializeFromAddress = async () => {\n if (toAddress) {\n try {\n const validationResult = await validateAddress({\n value: toAddress,\n })\n if (validationResult.isValid && toAddress) {\n const bookmark = {\n address: validationResult.address,\n chainType: validationResult.chainType,\n }\n setUserAndDefaultValues({ toAddress })\n setSelectedBookmark(bookmark)\n addRecentWallet(bookmark)\n }\n } catch (_) {\n // Address validation failed\n }\n }\n }\n\n setUserAndDefaultValues(initialFormValues)\n initializeFromAddress()\n }, [\n setUserAndDefaultValues,\n validateAddress,\n setSelectedBookmark,\n addRecentWallet,\n buildUrl,\n ])\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: run only when pathname changes\n useEffect(() => {\n // set the values on the querysting\n const url = new URL(window.location as any)\n formValueKeys.forEach((key, _index) => {\n const value = getFieldValues(key)[0]\n if (isTouched(key) && value) {\n url.searchParams.set(key, value.toString())\n } else if (url.searchParams.has(key) && !value) {\n url.searchParams.delete(key)\n }\n })\n // Limit params live in the URL only while the limit tab is active.\n limitFormValueKeys.forEach((key) => {\n const value = getFieldValues(key)[0]\n // Booleans are always \"set\" (false is meaningful); strings/numbers use\n // truthiness so an empty toAmount is treated as absent.\n const hasValue = typeof value === 'boolean' ? true : Boolean(value)\n if (mode === 'limit' && hasValue) {\n url.searchParams.set(key, String(value))\n } else {\n url.searchParams.delete(key)\n }\n })\n url.searchParams.sort()\n window.history.replaceState(window.history.state, '', url)\n }, [pathname, touchedFields, values, isTouched, getFieldValues, mode])\n\n return null\n}\n"],"mappings":";;;;;;;;;;AAWA,MAAM,gBAAkC;CACtC;CACA;CACA;CACA;CACA;CACA;AACF;AAMA,MAAM,qBAAuC;CAC3C;CACA;CACA;AACF;AAEA,MAAa,+BAA+B;CAC1C,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,gBAAgB,iBAAiB;CACvC,MAAM,SAAS,eAAe,GAAG,eAAe,GAAG,kBAAkB;CACrE,MAAM,EAAE,qBAAqB,oBAAoB,mBAAmB;CACpE,MAAM,EAAE,oBAAoB,qBAAqB;CACjD,MAAM,EAAE,UAAU,SAAS,gBAAgB;CAI3C,MAAM,EAAE,gBAAgB,WAAW,4BACjC,gBAAgB;CAElB,gBAAgB;EAGd,MAAM,EAAE,WAAW,GAAG,sBADH,gCAAgC,EAAE,SAAS,CACT;;;;;;;EAQrD,MAAM,wBAAwB,YAAY;GACxC,IAAI,WACF,IAAI;IACF,MAAM,mBAAmB,MAAM,gBAAgB,EAC7C,OAAO,UACT,CAAC;IACD,IAAI,iBAAiB,WAAW,WAAW;KACzC,MAAM,WAAW;MACf,SAAS,iBAAiB;MAC1B,WAAW,iBAAiB;KAC9B;KACA,wBAAwB,EAAE,UAAU,CAAC;KACrC,oBAAoB,QAAQ;KAC5B,gBAAgB,QAAQ;IAC1B;GACF,SAAS,GAAG,CAEZ;EAEJ;EAEA,wBAAwB,iBAAiB;EACzC,sBAAsB;CACxB,GAAG;EACD;EACA;EACA;EACA;EACA;CACF,CAAC;CAGD,gBAAgB;EAEd,MAAM,MAAM,IAAI,IAAI,OAAO,QAAe;EAC1C,cAAc,SAAS,KAAK,WAAW;GACrC,MAAM,QAAQ,eAAe,GAAG,CAAC,CAAC;GAClC,IAAI,UAAU,GAAG,KAAK,OACpB,IAAI,aAAa,IAAI,KAAK,MAAM,SAAS,CAAC;QACrC,IAAI,IAAI,aAAa,IAAI,GAAG,KAAK,CAAC,OACvC,IAAI,aAAa,OAAO,GAAG;EAE/B,CAAC;EAED,mBAAmB,SAAS,QAAQ;GAClC,MAAM,QAAQ,eAAe,GAAG,CAAC,CAAC;GAIlC,IAAI,SAAS,YADI,OAAO,UAAU,YAAY,OAAO,QAAQ,KAAK,IAEhE,IAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;QAEvC,IAAI,aAAa,OAAO,GAAG;EAE/B,CAAC;EACD,IAAI,aAAa,KAAK;EACtB,OAAO,QAAQ,aAAa,OAAO,QAAQ,OAAO,IAAI,GAAG;CAC3D,GAAG;EAAC;EAAU;EAAe;EAAQ;EAAW;EAAgB;CAAI,CAAC;CAErE,OAAO;AACT"}
@@ -1,9 +1,13 @@
1
+ import { DEFAULT_VALID_UNTIL_SECONDS } from "../../utils/limitOrder.js";
1
2
  import { create } from "zustand";
2
3
  //#region src/stores/form/createFormStore.ts
3
4
  const formDefaultValues = {
4
5
  fromAmount: "",
5
6
  toAmount: "",
6
- tokenSearchFilter: ""
7
+ tokenSearchFilter: "",
8
+ priceInverted: false,
9
+ validUntil: DEFAULT_VALID_UNTIL_SECONDS,
10
+ partiallyFillable: true
7
11
  };
8
12
  const defaultValueToFormValue = (value) => ({
9
13
  isTouched: false,
@@ -27,7 +31,7 @@ const mergeDefaultFormValues = (userValues, defaultValues) => Object.keys(defaul
27
31
  accum[key] = {
28
32
  isTouched: !!(userValues[key]?.isTouched || defaultValues[key]?.isTouched),
29
33
  isDirty: !!(userValues[key]?.isDirty || defaultValues[key]?.isTouched),
30
- value: userValues[key]?.value || Number.isFinite(userValues[key]?.value) ? userValues[key]?.value : defaultValues[key]?.value
34
+ value: userValues[key]?.value !== void 0 && userValues[key]?.value !== "" ? userValues[key]?.value : defaultValues[key]?.value
31
35
  };
32
36
  return accum;
33
37
  }, { ...valuesToFormValues(formDefaultValues) });
@@ -1 +1 @@
1
- {"version":3,"file":"createFormStore.js","names":[],"sources":["../../../../src/stores/form/createFormStore.ts"],"sourcesContent":["import type { StoreApi, UseBoundStore } from 'zustand'\nimport { create } from 'zustand'\n\nimport type {\n DefaultValues,\n FormFieldArray,\n FormFieldNames,\n FormValueControl,\n FormValues,\n FormValuesState,\n} from './types.js'\n\nexport const formDefaultValues: DefaultValues = {\n fromAmount: '',\n toAmount: '',\n tokenSearchFilter: '',\n}\n\nconst defaultValueToFormValue = <T>(value: T): FormValueControl<T> => ({\n isTouched: false,\n isDirty: false,\n value,\n})\n\nconst valuesToFormValues = (defaultValues: DefaultValues): FormValues => {\n return (Object.keys(defaultValues) as FormFieldNames[]).reduce(\n (accum, key) => {\n accum[key] = defaultValueToFormValue(defaultValues[key]) as never\n return accum\n },\n {} as FormValues\n )\n}\n\nconst isString = (str: any) => typeof str === 'string' || str instanceof String\n\nconst getUpdatedTouchedFields = (userValues: FormValues) => {\n return (Object.keys(userValues) as FormFieldNames[]).reduce(\n (accum, key) => {\n if (userValues[key]?.isTouched) {\n accum[key] = true\n }\n return accum\n },\n {} as Record<FormFieldNames, boolean>\n )\n}\n\nconst mergeDefaultFormValues = (\n userValues: FormValues,\n defaultValues: FormValues\n) =>\n (Object.keys(defaultValues) as FormFieldNames[]).reduce<FormValues>(\n (accum, key) => {\n const formValue = {\n isTouched: !!(\n userValues[key]?.isTouched || defaultValues[key]?.isTouched\n ),\n isDirty: !!(userValues[key]?.isDirty || defaultValues[key]?.isTouched),\n value:\n userValues[key]?.value || Number.isFinite(userValues[key]?.value)\n ? userValues[key]?.value\n : defaultValues[key]?.value,\n }\n accum[key] = formValue as never\n return accum\n },\n { ...valuesToFormValues(formDefaultValues) }\n )\n\nexport const createFormStore = (\n defaultValues?: DefaultValues\n): UseBoundStore<StoreApi<FormValuesState>> =>\n create<FormValuesState>((set, get) => {\n const _defaultValues = valuesToFormValues({\n ...formDefaultValues,\n ...defaultValues,\n })\n return {\n defaultValues: _defaultValues,\n userValues: _defaultValues,\n touchedFields: {},\n isValid: true,\n isValidating: false,\n errors: {},\n validation: {},\n setDefaultValues: (defaultValue) => {\n const defaultFormValues = valuesToFormValues(defaultValue)\n set((state) => ({\n defaultValues: defaultFormValues,\n userValues: mergeDefaultFormValues(\n state.userValues,\n defaultFormValues\n ),\n }))\n },\n setUserAndDefaultValues: (formValues) => {\n const currentUserValues = get().userValues\n ;(Object.keys(formValues) as FormFieldNames[]).forEach((key) => {\n if (formValues[key] !== currentUserValues[key]?.value) {\n get().resetField(key, { defaultValue: formValues[key] })\n get().setFieldValue(key, formValues[key], { isTouched: true })\n }\n })\n },\n isTouched: (fieldName: FormFieldNames) =>\n !!get().userValues[fieldName]?.isTouched,\n isDirty: (fieldName: FormFieldNames) =>\n !!get().userValues[fieldName]?.isDirty,\n setAsTouched: (fieldName: FormFieldNames) => {\n const userValues = {\n ...get().userValues,\n [fieldName]: {\n ...get().userValues[fieldName],\n isTouched: true,\n },\n }\n\n const touchedFields = getUpdatedTouchedFields(userValues)\n\n set(() => ({\n userValues,\n touchedFields,\n }))\n },\n resetField: (fieldName, { defaultValue } = {}) => {\n if (defaultValue) {\n const fieldValues = {\n ...get().defaultValues[fieldName],\n value: defaultValue,\n }\n const defaultValues = {\n ...get().defaultValues,\n [fieldName]: { ...fieldValues },\n }\n const userValues = {\n ...get().userValues,\n [fieldName]: { ...fieldValues },\n }\n const touchedFields = getUpdatedTouchedFields(userValues)\n\n set(() => {\n return {\n defaultValues,\n userValues,\n touchedFields,\n }\n })\n } else {\n const userValues = {\n ...get().userValues,\n [fieldName]: { ...get().defaultValues[fieldName] },\n }\n const touchedFields = getUpdatedTouchedFields(userValues)\n\n set(() => ({\n userValues,\n touchedFields,\n }))\n }\n },\n setFieldValue: (fieldName, value, { isDirty, isTouched } = {}) => {\n const userValues = {\n ...get().userValues,\n [fieldName]: {\n value,\n isDirty:\n isDirty === undefined\n ? get().userValues[fieldName]?.isDirty\n : isDirty,\n isTouched:\n isTouched === undefined\n ? get().userValues[fieldName]?.isTouched\n : isTouched,\n },\n }\n\n const touchedFields = getUpdatedTouchedFields(userValues)\n\n set(() => ({\n userValues,\n touchedFields,\n }))\n },\n getFieldValues: <T extends FormFieldNames[]>(...names: T) =>\n names.map((name) => get().userValues[name]?.value) as FormFieldArray<T>,\n addFieldValidation: (name, validationFn) => {\n set((state) => ({\n validation: {\n ...state.validation,\n [name]: validationFn,\n },\n }))\n },\n triggerFieldValidation: async (name) => {\n try {\n let valid = true\n set(() => ({ isValid: false, isValidating: true }))\n\n const validationFn = get().validation[name]\n\n if (validationFn) {\n const result = await validationFn(get().userValues?.[name]?.value)\n if (isString(result)) {\n valid = false\n set((state) => ({\n errors: {\n ...state.errors,\n [name]: result,\n },\n }))\n } else {\n valid = result as boolean\n if (valid) {\n get().clearErrors(name)\n }\n }\n }\n\n set(() => ({ isValid: valid, isValidating: false }))\n return valid\n } catch (err) {\n set(() => ({ isValidating: false }))\n throw err\n }\n },\n clearErrors: (name) => {\n const newErrors = { ...get().errors }\n\n delete newErrors[name]\n\n set(() => ({\n errors: newErrors,\n }))\n },\n }\n })\n"],"mappings":"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"}
1
+ {"version":3,"file":"createFormStore.js","names":[],"sources":["../../../../src/stores/form/createFormStore.ts"],"sourcesContent":["import type { StoreApi, UseBoundStore } from 'zustand'\nimport { create } from 'zustand'\nimport { DEFAULT_VALID_UNTIL_SECONDS } from '../../utils/limitOrder.js'\nimport type {\n DefaultValues,\n FormFieldArray,\n FormFieldNames,\n FormValueControl,\n FormValues,\n FormValuesState,\n} from './types.js'\n\nexport const formDefaultValues: DefaultValues = {\n fromAmount: '',\n toAmount: '',\n tokenSearchFilter: '',\n priceInverted: false,\n validUntil: DEFAULT_VALID_UNTIL_SECONDS,\n partiallyFillable: true,\n}\n\nconst defaultValueToFormValue = <T>(value: T): FormValueControl<T> => ({\n isTouched: false,\n isDirty: false,\n value,\n})\n\nconst valuesToFormValues = (defaultValues: DefaultValues): FormValues => {\n return (Object.keys(defaultValues) as FormFieldNames[]).reduce(\n (accum, key) => {\n accum[key] = defaultValueToFormValue(defaultValues[key]) as never\n return accum\n },\n {} as FormValues\n )\n}\n\nconst isString = (str: unknown): str is string =>\n typeof str === 'string' || str instanceof String\n\nconst getUpdatedTouchedFields = (userValues: FormValues) => {\n return (Object.keys(userValues) as FormFieldNames[]).reduce(\n (accum, key) => {\n if (userValues[key]?.isTouched) {\n accum[key] = true\n }\n return accum\n },\n {} as Record<FormFieldNames, boolean>\n )\n}\n\nconst mergeDefaultFormValues = (\n userValues: FormValues,\n defaultValues: FormValues\n) =>\n (Object.keys(defaultValues) as FormFieldNames[]).reduce<FormValues>(\n (accum, key) => {\n const formValue = {\n isTouched: !!(\n userValues[key]?.isTouched || defaultValues[key]?.isTouched\n ),\n isDirty: !!(userValues[key]?.isDirty || defaultValues[key]?.isTouched),\n value:\n userValues[key]?.value !== undefined && userValues[key]?.value !== ''\n ? userValues[key]?.value\n : defaultValues[key]?.value,\n }\n accum[key] = formValue as never\n return accum\n },\n { ...valuesToFormValues(formDefaultValues) }\n )\n\nexport const createFormStore = (\n defaultValues?: DefaultValues\n): UseBoundStore<StoreApi<FormValuesState>> =>\n create<FormValuesState>((set, get) => {\n const _defaultValues = valuesToFormValues({\n ...formDefaultValues,\n ...defaultValues,\n })\n return {\n defaultValues: _defaultValues,\n userValues: _defaultValues,\n touchedFields: {},\n isValid: true,\n isValidating: false,\n errors: {},\n validation: {},\n setDefaultValues: (defaultValue) => {\n const defaultFormValues = valuesToFormValues(defaultValue)\n set((state) => ({\n defaultValues: defaultFormValues,\n userValues: mergeDefaultFormValues(\n state.userValues,\n defaultFormValues\n ),\n }))\n },\n setUserAndDefaultValues: (formValues) => {\n const currentUserValues = get().userValues\n ;(Object.keys(formValues) as FormFieldNames[]).forEach((key) => {\n if (formValues[key] !== currentUserValues[key]?.value) {\n get().resetField(key, { defaultValue: formValues[key] })\n get().setFieldValue(key, formValues[key], { isTouched: true })\n }\n })\n },\n isTouched: (fieldName: FormFieldNames) =>\n !!get().userValues[fieldName]?.isTouched,\n isDirty: (fieldName: FormFieldNames) =>\n !!get().userValues[fieldName]?.isDirty,\n setAsTouched: (fieldName: FormFieldNames) => {\n const userValues = {\n ...get().userValues,\n [fieldName]: {\n ...get().userValues[fieldName],\n isTouched: true,\n },\n }\n\n const touchedFields = getUpdatedTouchedFields(userValues)\n\n set(() => ({\n userValues,\n touchedFields,\n }))\n },\n resetField: (fieldName, { defaultValue } = {}) => {\n if (defaultValue) {\n const fieldValues = {\n ...get().defaultValues[fieldName],\n value: defaultValue,\n }\n const defaultValues = {\n ...get().defaultValues,\n [fieldName]: { ...fieldValues },\n }\n const userValues = {\n ...get().userValues,\n [fieldName]: { ...fieldValues },\n }\n const touchedFields = getUpdatedTouchedFields(userValues)\n\n set(() => {\n return {\n defaultValues,\n userValues,\n touchedFields,\n }\n })\n } else {\n const userValues = {\n ...get().userValues,\n [fieldName]: { ...get().defaultValues[fieldName] },\n }\n const touchedFields = getUpdatedTouchedFields(userValues)\n\n set(() => ({\n userValues,\n touchedFields,\n }))\n }\n },\n setFieldValue: (fieldName, value, { isDirty, isTouched } = {}) => {\n const userValues = {\n ...get().userValues,\n [fieldName]: {\n value,\n isDirty:\n isDirty === undefined\n ? get().userValues[fieldName]?.isDirty\n : isDirty,\n isTouched:\n isTouched === undefined\n ? get().userValues[fieldName]?.isTouched\n : isTouched,\n },\n }\n\n const touchedFields = getUpdatedTouchedFields(userValues)\n\n set(() => ({\n userValues,\n touchedFields,\n }))\n },\n getFieldValues: <T extends FormFieldNames[]>(...names: T) =>\n names.map((name) => get().userValues[name]?.value) as FormFieldArray<T>,\n addFieldValidation: (name, validationFn) => {\n set((state) => ({\n validation: {\n ...state.validation,\n [name]: validationFn,\n },\n }))\n },\n triggerFieldValidation: async (name) => {\n try {\n let valid = true\n set(() => ({ isValid: false, isValidating: true }))\n\n const validationFn = get().validation[name]\n\n if (validationFn) {\n const result = await validationFn(get().userValues?.[name]?.value)\n if (isString(result)) {\n valid = false\n set((state) => ({\n errors: {\n ...state.errors,\n [name]: result,\n },\n }))\n } else {\n valid = result as boolean\n if (valid) {\n get().clearErrors(name)\n }\n }\n }\n\n set(() => ({ isValid: valid, isValidating: false }))\n return valid\n } catch (err) {\n set(() => ({ isValidating: false }))\n throw err\n }\n },\n clearErrors: (name) => {\n const newErrors = { ...get().errors }\n\n delete newErrors[name]\n\n set(() => ({\n errors: newErrors,\n }))\n },\n }\n })\n"],"mappings":"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"}
@@ -13,6 +13,9 @@ const getDefaultValuesFromQueryString = ({ buildUrl = false, includeToAddress =
13
13
  ...searchParams.fromToken ? { fromToken: searchParams.fromToken } : {},
14
14
  ...searchParams.toToken ? { toToken: searchParams.toToken } : {},
15
15
  ...Number.isFinite(Number.parseFloat(searchParams.fromAmount)) ? { fromAmount: formatInputAmount(searchParams.fromAmount) } : {},
16
+ ...Number.isFinite(Number.parseFloat(searchParams.toAmount)) ? { toAmount: formatInputAmount(searchParams.toAmount) } : {},
17
+ ...Number.isFinite(Number.parseInt(searchParams.validUntil, 10)) ? { validUntil: Number.parseInt(searchParams.validUntil, 10) } : {},
18
+ ...searchParams.partiallyFillable === "true" || searchParams.partiallyFillable === "false" ? { partiallyFillable: searchParams.partiallyFillable === "true" } : {},
16
19
  ...includeToAddress && searchParams.toAddress ? { toAddress: searchParams.toAddress } : {}
17
20
  };
18
21
  };
@@ -1 +1 @@
1
- {"version":3,"file":"getDefaultValuesFromQueryString.js","names":[],"sources":["../../../../src/stores/form/getDefaultValuesFromQueryString.ts"],"sourcesContent":["import { formatInputAmount } from '../../utils/format.js'\nimport type { DefaultValues } from './types.js'\n\ninterface GetDefaultValuesFromQueryStringOptions {\n includeToAddress?: boolean\n buildUrl?: boolean\n}\n\nexport const getDefaultValuesFromQueryString = ({\n buildUrl = false,\n includeToAddress = true,\n}: GetDefaultValuesFromQueryStringOptions): Partial<DefaultValues> => {\n if (typeof window === 'undefined') {\n return {}\n }\n\n if (!buildUrl) {\n return {}\n }\n\n const searchParams = Object.fromEntries(\n new URLSearchParams(window.location.search)\n )\n\n // Prevent using fromToken/toToken params if chain is not selected.\n ;(['from', 'to'] as const).forEach((key) => {\n if (searchParams[`${key}Token`] && !searchParams[`${key}Chain`]) {\n delete searchParams[`${key}Token`]\n }\n })\n\n return {\n ...(Number.isFinite(Number.parseInt(searchParams.fromChain, 10))\n ? { fromChain: Number.parseInt(searchParams.fromChain, 10) }\n : {}),\n ...(Number.isFinite(Number.parseInt(searchParams.toChain, 10))\n ? { toChain: Number.parseInt(searchParams.toChain, 10) }\n : {}),\n ...(searchParams.fromToken ? { fromToken: searchParams.fromToken } : {}),\n ...(searchParams.toToken ? { toToken: searchParams.toToken } : {}),\n ...(Number.isFinite(Number.parseFloat(searchParams.fromAmount))\n ? { fromAmount: formatInputAmount(searchParams.fromAmount) }\n : {}),\n ...(includeToAddress && searchParams.toAddress\n ? { toAddress: searchParams.toAddress }\n : {}),\n }\n}\n"],"mappings":";;AAQA,MAAa,mCAAmC,EAC9C,WAAW,OACX,mBAAmB,WACiD;CACpE,IAAI,OAAO,WAAW,aACpB,OAAO,CAAC;CAGV,IAAI,CAAC,UACH,OAAO,CAAC;CAGV,MAAM,eAAe,OAAO,YAC1B,IAAI,gBAAgB,OAAO,SAAS,MAAM,CAC5C;CAGC,CAAE,QAAQ,IAAI,EAAY,SAAS,QAAQ;EAC1C,IAAI,aAAa,GAAG,IAAI,WAAW,CAAC,aAAa,GAAG,IAAI,SACtD,OAAO,aAAa,GAAG,IAAI;CAE/B,CAAC;CAED,OAAO;EACL,GAAI,OAAO,SAAS,OAAO,SAAS,aAAa,WAAW,EAAE,CAAC,IAC3D,EAAE,WAAW,OAAO,SAAS,aAAa,WAAW,EAAE,EAAE,IACzD,CAAC;EACL,GAAI,OAAO,SAAS,OAAO,SAAS,aAAa,SAAS,EAAE,CAAC,IACzD,EAAE,SAAS,OAAO,SAAS,aAAa,SAAS,EAAE,EAAE,IACrD,CAAC;EACL,GAAI,aAAa,YAAY,EAAE,WAAW,aAAa,UAAU,IAAI,CAAC;EACtE,GAAI,aAAa,UAAU,EAAE,SAAS,aAAa,QAAQ,IAAI,CAAC;EAChE,GAAI,OAAO,SAAS,OAAO,WAAW,aAAa,UAAU,CAAC,IAC1D,EAAE,YAAY,kBAAkB,aAAa,UAAU,EAAE,IACzD,CAAC;EACL,GAAI,oBAAoB,aAAa,YACjC,EAAE,WAAW,aAAa,UAAU,IACpC,CAAC;CACP;AACF"}
1
+ {"version":3,"file":"getDefaultValuesFromQueryString.js","names":[],"sources":["../../../../src/stores/form/getDefaultValuesFromQueryString.ts"],"sourcesContent":["import { formatInputAmount } from '../../utils/format.js'\nimport type { DefaultValues } from './types.js'\n\ninterface GetDefaultValuesFromQueryStringOptions {\n includeToAddress?: boolean\n buildUrl?: boolean\n}\n\nexport const getDefaultValuesFromQueryString = ({\n buildUrl = false,\n includeToAddress = true,\n}: GetDefaultValuesFromQueryStringOptions): Partial<DefaultValues> => {\n if (typeof window === 'undefined') {\n return {}\n }\n\n if (!buildUrl) {\n return {}\n }\n\n const searchParams = Object.fromEntries(\n new URLSearchParams(window.location.search)\n )\n\n // Prevent using fromToken/toToken params if chain is not selected.\n ;(['from', 'to'] as const).forEach((key) => {\n if (searchParams[`${key}Token`] && !searchParams[`${key}Chain`]) {\n delete searchParams[`${key}Token`]\n }\n })\n\n return {\n ...(Number.isFinite(Number.parseInt(searchParams.fromChain, 10))\n ? { fromChain: Number.parseInt(searchParams.fromChain, 10) }\n : {}),\n ...(Number.isFinite(Number.parseInt(searchParams.toChain, 10))\n ? { toChain: Number.parseInt(searchParams.toChain, 10) }\n : {}),\n ...(searchParams.fromToken ? { fromToken: searchParams.fromToken } : {}),\n ...(searchParams.toToken ? { toToken: searchParams.toToken } : {}),\n ...(Number.isFinite(Number.parseFloat(searchParams.fromAmount))\n ? { fromAmount: formatInputAmount(searchParams.fromAmount) }\n : {}),\n ...(Number.isFinite(Number.parseFloat(searchParams.toAmount))\n ? { toAmount: formatInputAmount(searchParams.toAmount) }\n : {}),\n // Limit-order params (written only while on the limit tab).\n ...(Number.isFinite(Number.parseInt(searchParams.validUntil, 10))\n ? { validUntil: Number.parseInt(searchParams.validUntil, 10) }\n : {}),\n ...(searchParams.partiallyFillable === 'true' ||\n searchParams.partiallyFillable === 'false'\n ? { partiallyFillable: searchParams.partiallyFillable === 'true' }\n : {}),\n ...(includeToAddress && searchParams.toAddress\n ? { toAddress: searchParams.toAddress }\n : {}),\n }\n}\n"],"mappings":";;AAQA,MAAa,mCAAmC,EAC9C,WAAW,OACX,mBAAmB,WACiD;CACpE,IAAI,OAAO,WAAW,aACpB,OAAO,CAAC;CAGV,IAAI,CAAC,UACH,OAAO,CAAC;CAGV,MAAM,eAAe,OAAO,YAC1B,IAAI,gBAAgB,OAAO,SAAS,MAAM,CAC5C;CAGC,CAAE,QAAQ,IAAI,CAAC,CAAW,SAAS,QAAQ;EAC1C,IAAI,aAAa,GAAG,IAAI,WAAW,CAAC,aAAa,GAAG,IAAI,SACtD,OAAO,aAAa,GAAG,IAAI;CAE/B,CAAC;CAED,OAAO;EACL,GAAI,OAAO,SAAS,OAAO,SAAS,aAAa,WAAW,EAAE,CAAC,IAC3D,EAAE,WAAW,OAAO,SAAS,aAAa,WAAW,EAAE,EAAE,IACzD,CAAC;EACL,GAAI,OAAO,SAAS,OAAO,SAAS,aAAa,SAAS,EAAE,CAAC,IACzD,EAAE,SAAS,OAAO,SAAS,aAAa,SAAS,EAAE,EAAE,IACrD,CAAC;EACL,GAAI,aAAa,YAAY,EAAE,WAAW,aAAa,UAAU,IAAI,CAAC;EACtE,GAAI,aAAa,UAAU,EAAE,SAAS,aAAa,QAAQ,IAAI,CAAC;EAChE,GAAI,OAAO,SAAS,OAAO,WAAW,aAAa,UAAU,CAAC,IAC1D,EAAE,YAAY,kBAAkB,aAAa,UAAU,EAAE,IACzD,CAAC;EACL,GAAI,OAAO,SAAS,OAAO,WAAW,aAAa,QAAQ,CAAC,IACxD,EAAE,UAAU,kBAAkB,aAAa,QAAQ,EAAE,IACrD,CAAC;EAEL,GAAI,OAAO,SAAS,OAAO,SAAS,aAAa,YAAY,EAAE,CAAC,IAC5D,EAAE,YAAY,OAAO,SAAS,aAAa,YAAY,EAAE,EAAE,IAC3D,CAAC;EACL,GAAI,aAAa,sBAAsB,UACvC,aAAa,sBAAsB,UAC/B,EAAE,mBAAmB,aAAa,sBAAsB,OAAO,IAC/D,CAAC;EACL,GAAI,oBAAoB,aAAa,YACjC,EAAE,WAAW,aAAa,UAAU,IACpC,CAAC;CACP;AACF"}
@@ -14,8 +14,16 @@ interface DefaultFieldValues {
14
14
  interface DefaultValues extends DefaultFieldValues {
15
15
  contractCalls?: ContractCall[];
16
16
  tokenSearchFilter: string;
17
+ /** Limit-order: when true, the price is displayed/entered inverted. */
18
+ priceInverted: boolean;
19
+ /** Limit-order: order validity as a duration in seconds. */
20
+ validUntil: number;
21
+ /** Limit-order: whether the order may be partially filled. */
22
+ partiallyFillable: boolean;
23
+ /** Limit-order: id of the route the user picked. */
24
+ selectedRouteId?: string;
17
25
  }
18
- type GenericFormValue = string | number | ContractCall[] | undefined;
26
+ type GenericFormValue = string | number | boolean | ContractCall[] | undefined;
19
27
  interface FormValueControl<T> {
20
28
  isTouched: boolean;
21
29
  isDirty: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../src/stores/form/types.ts"],"mappings":";;;;UAGiB,kBAAA;EACf,SAAA;EACA,SAAA;EACA,OAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;AAAA;AAAA,UAGe,aAAA,SAAsB,kBAAA;EACrC,aAAA,GAAgB,YAAA;EAChB,iBAAA;AAAA;AAAA,KAGU,gBAAA,qBAAqC,YAAA;AAAA,UAChC,gBAAA;EACf,SAAA;EACA,OAAA;EACA,KAAA,EAAO,CAAA;AAAA;AAAA,KAGG,UAAA,wBACS,aAAA,GAAgB,gBAAA,CAAiB,aAAA,CAAc,QAAA;AAAA,KAGxD,cAAA,SAAuB,UAAA;AAAA,KACvB,gBAAA,MACV,CAAA,SAAU,gBAAA,YAA4B,CAAA;AAAA,KAC5B,cAAA,WAAyB,cAAA,oBACvB,CAAA,GAAI,gBAAA,CAAiB,UAAA,CAAW,CAAA,CAAE,CAAA;AAAA,KAGpC,aAAA,WAAwB,cAAA;AAAA,KAE/B,YAAA,IAAgB,KAAA,UAAe,OAAA;AAAA,UACnB,eAAA;EACf,OAAA;EACA,YAAA;EACA,MAAA,UACQ,cAAA;EAER,UAAA,UACQ,cAAA,IAAkB,YAAA;AAAA;AAAA,UAIX,iBAAA;EACf,kBAAA,GAAqB,IAAA,EAAM,cAAA,EAAgB,YAAA,EAAc,YAAA;EACzD,sBAAA,GAAyB,IAAA,EAAM,cAAA,KAAmB,OAAA;EAClD,WAAA,GAAc,IAAA,EAAM,cAAA;AAAA;AAAA,UAGL,SAAA;EACf,aAAA,EAAe,UAAA;EACf,UAAA,EAAY,UAAA;EACZ,aAAA,UAAuB,cAAA;AAAA;AAAA,UAGR,YAAA;EACf,YAAA,GAAe,gBAAA;AAAA;AAAA,UAGA,WAAA;EACf,gBAAA,GAAmB,UAAA,EAAY,aAAA;EAC/B,uBAAA,GAA0B,UAAA,EAAY,OAAA,CAAQ,aAAA;EAC9C,SAAA,GAAY,SAAA,EAAW,cAAA;EACvB,OAAA,GAAU,SAAA,EAAW,cAAA;EACrB,YAAA,GAAe,SAAA,EAAW,cAAA;EAC1B,UAAA,GAAa,SAAA,EAAW,cAAA,EAAgB,YAAA,GAAe,YAAA;EACvD,aAAA,GACE,SAAA,EAAW,cAAA,EACX,KAAA,EAAO,gBAAA,EACP,OAAA,GAAU,UAAA;EAEZ,cAAA,aAA2B,cAAA,OAAqB,KAAA,EAAO,CAAA,KAAM,cAAA,CAAe,CAAA;AAAA;AAAA,KAGlE,eAAA,GAAkB,SAAA,GAC5B,WAAA,GACA,eAAA,GACA,iBAAA;AAAA,KAEU,cAAA,GAAiB,aAAA,CAAc,QAAA,CAAS,eAAA;AAAA,UAEnC,UAAA;EACf,OAAA;EACA,SAAA;AAAA;AAAA,KAGU,QAAA;AAAA,UAEK,aAAA;EACf,QAAA,EAAU,QAAA;AAAA;AAAA,cAGC,aAAA;EACX,WAAA,GAAc,QAAA,EAAU,QAAA;EAExB,WAAA,GAAc,QAAA,EAAU,QAAA;EAExB,YAAA,GAAe,QAAA,EAAU,QAAA;AAAA"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../src/stores/form/types.ts"],"mappings":";;;;UAGiB,kBAAA;EACf,SAAA;EACA,SAAA;EACA,OAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;AAAA;AAAA,UAGe,aAAA,SAAsB,kBAAA;EACrC,aAAA,GAAgB,YAAA;EAChB,iBAAA;;EAEA,aAAA;EAPA;EASA,UAAA;EANe;EAQf,iBAAA;EARqC;EAUrC,eAAA;AAAA;AAAA,KAGU,gBAAA,+BAIR,YAAA;AAAA,UAEa,gBAAA;EACf,SAAA;EACA,OAAA;EACA,KAAA,EAAO,CAAA;AAAA;AAAA,KAGG,UAAA,wBACS,aAAA,GAAgB,gBAAA,CAAiB,aAAA,CAAc,QAAA;AAAA,KAGxD,cAAA,SAAuB,UAAA;AAAA,KACvB,gBAAA,MACV,CAAA,SAAU,gBAAA,YAA4B,CAAA;AAAA,KAC5B,cAAA,WAAyB,cAAA,oBACvB,CAAA,GAAI,gBAAA,CAAiB,UAAA,CAAW,CAAA,CAAE,CAAA;AAAA,KAGpC,aAAA,WAAwB,cAAA;AAAA,KAE/B,YAAA,IAAgB,KAAA,UAAe,OAAA;AAAA,UACnB,eAAA;EACf,OAAA;EACA,YAAA;EACA,MAAA,UACQ,cAAA;EAER,UAAA,UACQ,cAAA,IAAkB,YAAA;AAAA;AAAA,UAIX,iBAAA;EACf,kBAAA,GAAqB,IAAA,EAAM,cAAA,EAAgB,YAAA,EAAc,YAAA;EACzD,sBAAA,GAAyB,IAAA,EAAM,cAAA,KAAmB,OAAA;EAClD,WAAA,GAAc,IAAA,EAAM,cAAA;AAAA;AAAA,UAGL,SAAA;EACf,aAAA,EAAe,UAAA;EACf,UAAA,EAAY,UAAA;EACZ,aAAA,UAAuB,cAAA;AAAA;AAAA,UAGR,YAAA;EACf,YAAA,GAAe,gBAAA;AAAA;AAAA,UAGA,WAAA;EACf,gBAAA,GAAmB,UAAA,EAAY,aAAA;EAC/B,uBAAA,GAA0B,UAAA,EAAY,OAAA,CAAQ,aAAA;EAC9C,SAAA,GAAY,SAAA,EAAW,cAAA;EACvB,OAAA,GAAU,SAAA,EAAW,cAAA;EACrB,YAAA,GAAe,SAAA,EAAW,cAAA;EAC1B,UAAA,GAAa,SAAA,EAAW,cAAA,EAAgB,YAAA,GAAe,YAAA;EACvD,aAAA,GACE,SAAA,EAAW,cAAA,EACX,KAAA,EAAO,gBAAA,EACP,OAAA,GAAU,UAAA;EAEZ,cAAA,aAA2B,cAAA,OAAqB,KAAA,EAAO,CAAA,KAAM,cAAA,CAAe,CAAA;AAAA;AAAA,KAGlE,eAAA,GAAkB,SAAA,GAC5B,WAAA,GACA,eAAA,GACA,iBAAA;AAAA,KAEU,cAAA,GAAiB,aAAA,CAAc,QAAA,CAAS,eAAA;AAAA,UAEnC,UAAA;EACf,OAAA;EACA,SAAA;AAAA;AAAA,KAGU,QAAA;AAAA,UAEK,aAAA;EACf,QAAA,EAAU,QAAA;AAAA;AAAA,cAGC,aAAA;EACX,WAAA,GAAc,QAAA,EAAU,QAAA;EAExB,WAAA,GAAc,QAAA,EAAU,QAAA;EAExB,YAAA,GAAe,QAAA,EAAU,QAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../../src/stores/form/types.ts"],"sourcesContent":["import type { ContractCall } from '@lifi/sdk'\nimport type { StoreApi, UseBoundStore } from 'zustand'\n\nexport interface DefaultFieldValues {\n fromChain?: number\n fromToken?: string\n toChain?: number\n toToken?: string\n toAddress?: string\n fromAmount: string\n toAmount: string\n}\n\nexport interface DefaultValues extends DefaultFieldValues {\n contractCalls?: ContractCall[]\n tokenSearchFilter: string\n}\n\nexport type GenericFormValue = string | number | ContractCall[] | undefined\nexport interface FormValueControl<T> {\n isTouched: boolean\n isDirty: boolean\n value: T\n}\n\nexport type FormValues = {\n [Property in keyof DefaultValues]: FormValueControl<DefaultValues[Property]>\n}\n\nexport type FormFieldNames = keyof FormValues\nexport type ExtractValueType<T> =\n T extends FormValueControl<infer U> ? U : never\nexport type FormFieldArray<T extends FormFieldNames[]> = {\n [K in keyof T]: ExtractValueType<FormValues[T[K]]>\n}\n\nexport type TouchedFields = { [K in FormFieldNames]?: boolean }\n\ntype ValidationFn = (value: any) => Promise<boolean | string>\nexport interface ValidationProps {\n isValid: boolean\n isValidating: boolean\n errors: {\n [K in FormFieldNames]?: string\n }\n validation: {\n [K in FormFieldNames]?: ValidationFn\n }\n}\n\nexport interface ValidationActions {\n addFieldValidation: (name: FormFieldNames, validationFn: ValidationFn) => void\n triggerFieldValidation: (name: FormFieldNames) => Promise<boolean>\n clearErrors: (name: FormFieldNames) => void\n}\n\nexport interface FormProps {\n defaultValues: FormValues\n userValues: FormValues\n touchedFields: { [K in FormFieldNames]?: boolean }\n}\n\nexport interface ResetOptions {\n defaultValue?: GenericFormValue\n}\n\nexport interface FormActions {\n setDefaultValues: (formValues: DefaultValues) => void\n setUserAndDefaultValues: (formValues: Partial<DefaultValues>) => void\n isTouched: (fieldName: FormFieldNames) => boolean\n isDirty: (fieldName: FormFieldNames) => boolean\n setAsTouched: (fieldName: FormFieldNames) => void\n resetField: (fieldName: FormFieldNames, resetOptions?: ResetOptions) => void\n setFieldValue: (\n fieldName: FormFieldNames,\n value: GenericFormValue,\n options?: SetOptions\n ) => void\n getFieldValues: <T extends FormFieldNames[]>(...names: T) => FormFieldArray<T>\n}\n\nexport type FormValuesState = FormProps &\n FormActions &\n ValidationProps &\n ValidationActions\n\nexport type FormStoreStore = UseBoundStore<StoreApi<FormValuesState>>\n\nexport interface SetOptions {\n isDirty?: boolean\n isTouched?: boolean\n}\n\nexport type FormType = 'from' | 'to'\n\nexport interface FormTypeProps {\n formType: FormType\n}\n\nexport const FormKeyHelper = {\n getChainKey: (formType: FormType): 'fromChain' | 'toChain' =>\n `${formType}Chain`,\n getTokenKey: (formType: FormType): 'fromToken' | 'toToken' =>\n `${formType}Token`,\n getAmountKey: (formType: FormType): 'fromAmount' | 'toAmount' =>\n `${formType}Amount`,\n}\n"],"mappings":";AAmGA,MAAa,gBAAgB;CAC3B,cAAc,aACZ,GAAG,SAAS;CACd,cAAc,aACZ,GAAG,SAAS;CACd,eAAe,aACb,GAAG,SAAS;AAChB"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../../src/stores/form/types.ts"],"sourcesContent":["import type { ContractCall } from '@lifi/sdk'\nimport type { StoreApi, UseBoundStore } from 'zustand'\n\nexport interface DefaultFieldValues {\n fromChain?: number\n fromToken?: string\n toChain?: number\n toToken?: string\n toAddress?: string\n fromAmount: string\n toAmount: string\n}\n\nexport interface DefaultValues extends DefaultFieldValues {\n contractCalls?: ContractCall[]\n tokenSearchFilter: string\n /** Limit-order: when true, the price is displayed/entered inverted. */\n priceInverted: boolean\n /** Limit-order: order validity as a duration in seconds. */\n validUntil: number\n /** Limit-order: whether the order may be partially filled. */\n partiallyFillable: boolean\n /** Limit-order: id of the route the user picked. */\n selectedRouteId?: string\n}\n\nexport type GenericFormValue =\n | string\n | number\n | boolean\n | ContractCall[]\n | undefined\nexport interface FormValueControl<T> {\n isTouched: boolean\n isDirty: boolean\n value: T\n}\n\nexport type FormValues = {\n [Property in keyof DefaultValues]: FormValueControl<DefaultValues[Property]>\n}\n\nexport type FormFieldNames = keyof FormValues\nexport type ExtractValueType<T> =\n T extends FormValueControl<infer U> ? U : never\nexport type FormFieldArray<T extends FormFieldNames[]> = {\n [K in keyof T]: ExtractValueType<FormValues[T[K]]>\n}\n\nexport type TouchedFields = { [K in FormFieldNames]?: boolean }\n\ntype ValidationFn = (value: any) => Promise<boolean | string>\nexport interface ValidationProps {\n isValid: boolean\n isValidating: boolean\n errors: {\n [K in FormFieldNames]?: string\n }\n validation: {\n [K in FormFieldNames]?: ValidationFn\n }\n}\n\nexport interface ValidationActions {\n addFieldValidation: (name: FormFieldNames, validationFn: ValidationFn) => void\n triggerFieldValidation: (name: FormFieldNames) => Promise<boolean>\n clearErrors: (name: FormFieldNames) => void\n}\n\nexport interface FormProps {\n defaultValues: FormValues\n userValues: FormValues\n touchedFields: { [K in FormFieldNames]?: boolean }\n}\n\nexport interface ResetOptions {\n defaultValue?: GenericFormValue\n}\n\nexport interface FormActions {\n setDefaultValues: (formValues: DefaultValues) => void\n setUserAndDefaultValues: (formValues: Partial<DefaultValues>) => void\n isTouched: (fieldName: FormFieldNames) => boolean\n isDirty: (fieldName: FormFieldNames) => boolean\n setAsTouched: (fieldName: FormFieldNames) => void\n resetField: (fieldName: FormFieldNames, resetOptions?: ResetOptions) => void\n setFieldValue: (\n fieldName: FormFieldNames,\n value: GenericFormValue,\n options?: SetOptions\n ) => void\n getFieldValues: <T extends FormFieldNames[]>(...names: T) => FormFieldArray<T>\n}\n\nexport type FormValuesState = FormProps &\n FormActions &\n ValidationProps &\n ValidationActions\n\nexport type FormStoreStore = UseBoundStore<StoreApi<FormValuesState>>\n\nexport interface SetOptions {\n isDirty?: boolean\n isTouched?: boolean\n}\n\nexport type FormType = 'from' | 'to'\n\nexport interface FormTypeProps {\n formType: FormType\n}\n\nexport const FormKeyHelper = {\n getChainKey: (formType: FormType): 'fromChain' | 'toChain' =>\n `${formType}Chain`,\n getTokenKey: (formType: FormType): 'fromToken' | 'toToken' =>\n `${formType}Token`,\n getAmountKey: (formType: FormType): 'fromAmount' | 'toAmount' =>\n `${formType}Amount`,\n}\n"],"mappings":";AAgHA,MAAa,gBAAgB;CAC3B,cAAc,aACZ,GAAG,SAAS;CACd,cAAc,aACZ,GAAG,SAAS;CACd,eAAe,aACb,GAAG,SAAS;AAChB"}
@@ -6,6 +6,7 @@ const useClearAmountFields = () => {
6
6
  return useCallback(() => {
7
7
  setFieldValue("fromAmount", "");
8
8
  setFieldValue("toAmount", "");
9
+ setFieldValue("selectedRouteId", void 0);
9
10
  }, [setFieldValue]);
10
11
  };
11
12
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useClearAmountFields.js","names":[],"sources":["../../../../src/stores/form/useClearAmountFields.ts"],"sourcesContent":["import { useCallback } from 'react'\nimport { useFieldActions } from './useFieldActions.js'\n\nexport const useClearAmountFields = (): (() => void) => {\n const { setFieldValue } = useFieldActions()\n return useCallback(() => {\n setFieldValue('fromAmount', '')\n setFieldValue('toAmount', '')\n }, [setFieldValue])\n}\n"],"mappings":";;;AAGA,MAAa,6BAA2C;CACtD,MAAM,EAAE,kBAAkB,gBAAgB;CAC1C,OAAO,kBAAkB;EACvB,cAAc,cAAc,EAAE;EAC9B,cAAc,YAAY,EAAE;CAC9B,GAAG,CAAC,aAAa,CAAC;AACpB"}
1
+ {"version":3,"file":"useClearAmountFields.js","names":[],"sources":["../../../../src/stores/form/useClearAmountFields.ts"],"sourcesContent":["import { useCallback } from 'react'\nimport { useFieldActions } from './useFieldActions.js'\n\nexport const useClearAmountFields = (): (() => void) => {\n const { setFieldValue } = useFieldActions()\n return useCallback(() => {\n setFieldValue('fromAmount', '')\n setFieldValue('toAmount', '')\n setFieldValue('selectedRouteId', undefined)\n }, [setFieldValue])\n}\n"],"mappings":";;;AAGA,MAAa,6BAA2C;CACtD,MAAM,EAAE,kBAAkB,gBAAgB;CAC1C,OAAO,kBAAkB;EACvB,cAAc,cAAc,EAAE;EAC9B,cAAc,YAAY,EAAE;EAC5B,cAAc,mBAAmB,KAAA,CAAS;CAC5C,GAAG,CAAC,aAAa,CAAC;AACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFieldActions.js","names":[],"sources":["../../../../src/stores/form/useFieldActions.ts"],"sourcesContent":["import { useCallback } from 'react'\nimport { useWidgetEvents } from '../../hooks/useWidgetEvents.js'\nimport type { FormFieldChanged } from '../../types/events.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport type {\n DefaultValues,\n FormActions,\n FormFieldNames,\n GenericFormValue,\n SetOptions,\n} from './types.js'\nimport { useFormStore } from './useFormStore.js'\n\nexport const useFieldActions = (): FormActions => {\n const emitter = useWidgetEvents()\n const actions = useFormStore<FormActions>((store) => ({\n getFieldValues: store.getFieldValues,\n isTouched: store.isTouched,\n isDirty: store.isDirty,\n resetField: store.resetField,\n setAsTouched: store.setAsTouched,\n setDefaultValues: store.setDefaultValues,\n setFieldValue: store.setFieldValue,\n setUserAndDefaultValues: store.setUserAndDefaultValues,\n }))\n\n const setFieldValueWithEmittedEvents = useCallback(\n (\n fieldName: FormFieldNames,\n newValue: GenericFormValue,\n options?: SetOptions\n ) => {\n const oldValue = actions.getFieldValues(fieldName)[0]\n\n actions.setFieldValue(fieldName, newValue, options)\n\n if (newValue !== oldValue) {\n emitter.emit(WidgetEvent.FormFieldChanged, {\n fieldName,\n newValue,\n oldValue,\n } as FormFieldChanged)\n }\n },\n [actions, emitter]\n )\n\n const setUserAndDefaultValuesWithEmittedEvents = useCallback(\n (formValues: Partial<DefaultValues>) => {\n const formValuesKeys = Object.keys(formValues) as FormFieldNames[]\n\n const changedValues = formValuesKeys.reduce(\n (accum, fieldName) => {\n const oldValue = actions.getFieldValues(fieldName)[0]\n const newValue = formValues[fieldName]\n\n if (newValue !== oldValue) {\n accum.push({ fieldName, newValue, oldValue })\n }\n\n return accum\n },\n [] as {\n fieldName: FormFieldNames\n newValue: GenericFormValue\n oldValue: GenericFormValue\n }[]\n )\n\n actions.setUserAndDefaultValues(formValues)\n\n changedValues.forEach(({ fieldName, newValue, oldValue }) => {\n emitter.emit(WidgetEvent.FormFieldChanged, {\n fieldName,\n newValue,\n oldValue,\n } as FormFieldChanged)\n })\n },\n [actions, emitter]\n )\n\n return {\n getFieldValues: actions.getFieldValues,\n isTouched: actions.isTouched,\n isDirty: actions.isDirty,\n resetField: actions.resetField,\n setAsTouched: actions.setAsTouched,\n setDefaultValues: actions.setDefaultValues,\n setFieldValue: setFieldValueWithEmittedEvents,\n setUserAndDefaultValues: setUserAndDefaultValuesWithEmittedEvents,\n }\n}\n"],"mappings":";;;;;AAaA,MAAa,wBAAqC;CAChD,MAAM,UAAU,gBAAgB;CAChC,MAAM,UAAU,cAA2B,WAAW;EACpD,gBAAgB,MAAM;EACtB,WAAW,MAAM;EACjB,SAAS,MAAM;EACf,YAAY,MAAM;EAClB,cAAc,MAAM;EACpB,kBAAkB,MAAM;EACxB,eAAe,MAAM;EACrB,yBAAyB,MAAM;CACjC,EAAE;CAEF,MAAM,iCAAiC,aAEnC,WACA,UACA,YACG;EACH,MAAM,WAAW,QAAQ,eAAe,SAAS,EAAE;EAEnD,QAAQ,cAAc,WAAW,UAAU,OAAO;EAElD,IAAI,aAAa,UACf,QAAQ,KAAA,oBAAmC;GACzC;GACA;GACA;EACF,CAAqB;CAEzB,GACA,CAAC,SAAS,OAAO,CACnB;CAEA,MAAM,2CAA2C,aAC9C,eAAuC;EAGtC,MAAM,gBAFiB,OAAO,KAAK,UAEA,EAAE,QAClC,OAAO,cAAc;GACpB,MAAM,WAAW,QAAQ,eAAe,SAAS,EAAE;GACnD,MAAM,WAAW,WAAW;GAE5B,IAAI,aAAa,UACf,MAAM,KAAK;IAAE;IAAW;IAAU;GAAS,CAAC;GAG9C,OAAO;EACT,GACA,CAAC,CAKH;EAEA,QAAQ,wBAAwB,UAAU;EAE1C,cAAc,SAAS,EAAE,WAAW,UAAU,eAAe;GAC3D,QAAQ,KAAA,oBAAmC;IACzC;IACA;IACA;GACF,CAAqB;EACvB,CAAC;CACH,GACA,CAAC,SAAS,OAAO,CACnB;CAEA,OAAO;EACL,gBAAgB,QAAQ;EACxB,WAAW,QAAQ;EACnB,SAAS,QAAQ;EACjB,YAAY,QAAQ;EACpB,cAAc,QAAQ;EACtB,kBAAkB,QAAQ;EAC1B,eAAe;EACf,yBAAyB;CAC3B;AACF"}
1
+ {"version":3,"file":"useFieldActions.js","names":[],"sources":["../../../../src/stores/form/useFieldActions.ts"],"sourcesContent":["import { useCallback } from 'react'\nimport { useWidgetEvents } from '../../hooks/useWidgetEvents.js'\nimport type { FormFieldChanged } from '../../types/events.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport type {\n DefaultValues,\n FormActions,\n FormFieldNames,\n GenericFormValue,\n SetOptions,\n} from './types.js'\nimport { useFormStore } from './useFormStore.js'\n\nexport const useFieldActions = (): FormActions => {\n const emitter = useWidgetEvents()\n const actions = useFormStore<FormActions>((store) => ({\n getFieldValues: store.getFieldValues,\n isTouched: store.isTouched,\n isDirty: store.isDirty,\n resetField: store.resetField,\n setAsTouched: store.setAsTouched,\n setDefaultValues: store.setDefaultValues,\n setFieldValue: store.setFieldValue,\n setUserAndDefaultValues: store.setUserAndDefaultValues,\n }))\n\n const setFieldValueWithEmittedEvents = useCallback(\n (\n fieldName: FormFieldNames,\n newValue: GenericFormValue,\n options?: SetOptions\n ) => {\n const oldValue = actions.getFieldValues(fieldName)[0]\n\n actions.setFieldValue(fieldName, newValue, options)\n\n if (newValue !== oldValue) {\n emitter.emit(WidgetEvent.FormFieldChanged, {\n fieldName,\n newValue,\n oldValue,\n } as FormFieldChanged)\n }\n },\n [actions, emitter]\n )\n\n const setUserAndDefaultValuesWithEmittedEvents = useCallback(\n (formValues: Partial<DefaultValues>) => {\n const formValuesKeys = Object.keys(formValues) as FormFieldNames[]\n\n const changedValues = formValuesKeys.reduce(\n (accum, fieldName) => {\n const oldValue = actions.getFieldValues(fieldName)[0]\n const newValue = formValues[fieldName]\n\n if (newValue !== oldValue) {\n accum.push({ fieldName, newValue, oldValue })\n }\n\n return accum\n },\n [] as {\n fieldName: FormFieldNames\n newValue: GenericFormValue\n oldValue: GenericFormValue\n }[]\n )\n\n actions.setUserAndDefaultValues(formValues)\n\n changedValues.forEach(({ fieldName, newValue, oldValue }) => {\n emitter.emit(WidgetEvent.FormFieldChanged, {\n fieldName,\n newValue,\n oldValue,\n } as FormFieldChanged)\n })\n },\n [actions, emitter]\n )\n\n return {\n getFieldValues: actions.getFieldValues,\n isTouched: actions.isTouched,\n isDirty: actions.isDirty,\n resetField: actions.resetField,\n setAsTouched: actions.setAsTouched,\n setDefaultValues: actions.setDefaultValues,\n setFieldValue: setFieldValueWithEmittedEvents,\n setUserAndDefaultValues: setUserAndDefaultValuesWithEmittedEvents,\n }\n}\n"],"mappings":";;;;;AAaA,MAAa,wBAAqC;CAChD,MAAM,UAAU,gBAAgB;CAChC,MAAM,UAAU,cAA2B,WAAW;EACpD,gBAAgB,MAAM;EACtB,WAAW,MAAM;EACjB,SAAS,MAAM;EACf,YAAY,MAAM;EAClB,cAAc,MAAM;EACpB,kBAAkB,MAAM;EACxB,eAAe,MAAM;EACrB,yBAAyB,MAAM;CACjC,EAAE;CAEF,MAAM,iCAAiC,aAEnC,WACA,UACA,YACG;EACH,MAAM,WAAW,QAAQ,eAAe,SAAS,CAAC,CAAC;EAEnD,QAAQ,cAAc,WAAW,UAAU,OAAO;EAElD,IAAI,aAAa,UACf,QAAQ,KAAA,oBAAmC;GACzC;GACA;GACA;EACF,CAAqB;CAEzB,GACA,CAAC,SAAS,OAAO,CACnB;CAEA,MAAM,2CAA2C,aAC9C,eAAuC;EAGtC,MAAM,gBAFiB,OAAO,KAAK,UAEA,CAAC,CAAC,QAClC,OAAO,cAAc;GACpB,MAAM,WAAW,QAAQ,eAAe,SAAS,CAAC,CAAC;GACnD,MAAM,WAAW,WAAW;GAE5B,IAAI,aAAa,UACf,MAAM,KAAK;IAAE;IAAW;IAAU;GAAS,CAAC;GAG9C,OAAO;EACT,GACA,CAAC,CAKH;EAEA,QAAQ,wBAAwB,UAAU;EAE1C,cAAc,SAAS,EAAE,WAAW,UAAU,eAAe;GAC3D,QAAQ,KAAA,oBAAmC;IACzC;IACA;IACA;GACF,CAAqB;EACvB,CAAC;CACH,GACA,CAAC,SAAS,OAAO,CACnB;CAEA,OAAO;EACL,gBAAgB,QAAQ;EACxB,WAAW,QAAQ;EACnB,SAAS,QAAQ;EACjB,YAAY,QAAQ;EACpB,cAAc,QAAQ;EACtB,kBAAkB,QAAQ;EAC1B,eAAe;EACf,yBAAyB;CAC3B;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFieldValues.js","names":[],"sources":["../../../../src/stores/form/useFieldValues.ts"],"sourcesContent":["import type { FormFieldArray, FormFieldNames } from './types.js'\nimport { useFormStore } from './useFormStore.js'\n\n// We should return a strongly-typed array based on the specific field names we pass to the function.\nexport const useFieldValues = <T extends FormFieldNames[]>(\n ...names: T\n): FormFieldArray<T> => {\n const values = useFormStore(\n (store) =>\n names.map((name) => store.userValues[name]?.value) as FormFieldArray<T>\n )\n\n return values\n}\n"],"mappings":";;AAIA,MAAa,kBACX,GAAG,UACmB;CAMtB,OALe,cACZ,UACC,MAAM,KAAK,SAAS,MAAM,WAAW,OAAO,KAAK,CAGzC;AACd"}
1
+ {"version":3,"file":"useFieldValues.js","names":[],"sources":["../../../../src/stores/form/useFieldValues.ts"],"sourcesContent":["import type { FormFieldArray, FormFieldNames } from './types.js'\nimport { useFormStore } from './useFormStore.js'\n\n// We should return a strongly-typed array based on the specific field names we pass to the function.\nexport const useFieldValues = <T extends FormFieldNames[]>(\n ...names: T\n): FormFieldArray<T> => {\n const values = useFormStore(\n (store) =>\n names.map((name) => store.userValues[name]?.value) as FormFieldArray<T>\n )\n\n return values\n}\n"],"mappings":";;AAIA,MAAa,kBACX,GAAG,UACmB;CAMtB,OALe,cACZ,UACC,MAAM,KAAK,SAAS,MAAM,WAAW,KAAK,EAAE,KAAK,CAGzC;AACd"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFormRef.js","names":[],"sources":["../../../../src/stores/form/useFormRef.ts"],"sourcesContent":["import { useImperativeHandle } from 'react'\nimport { widgetEvents } from '../../hooks/useWidgetEvents.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport { formDefaultValues } from '../../stores/form/createFormStore.js'\nimport type { FormFieldChanged } from '../../types/events.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport type { FormRef } from '../../types/widget.js'\nimport type {\n FormFieldNames,\n FormStoreStore,\n GenericFormValue,\n} from './types.js'\n\nexport const useFormRef = (\n formStore: FormStoreStore,\n formRef?: FormRef\n): void => {\n const { setSelectedBookmark } = useBookmarkActions()\n\n useImperativeHandle(formRef, () => {\n const sanitizeValue: {\n [key: string]: (value: any) => GenericFormValue\n } = {\n fromAmount: (value) =>\n (typeof value === 'number' ? value?.toPrecision() : value) ||\n formDefaultValues.fromAmount,\n toAmount: (value) =>\n (typeof value === 'number' ? value?.toPrecision() : value) ||\n formDefaultValues.toAmount,\n toAddress: (value) => {\n const isToAddressObj = typeof value !== 'string'\n\n const address =\n (isToAddressObj ? value?.address : value) ||\n formDefaultValues.toAddress\n\n // we can assume that the toAddress has been passed as ToAddress object\n // and display it accordingly - this ensures that if a name is included\n // that it is displayed in the Send To Wallet form field correctly\n if (isToAddressObj) {\n setSelectedBookmark(value)\n }\n\n return address\n },\n }\n\n return {\n setFieldValue: (fieldName, value, options) => {\n const sanitizedValue = (\n sanitizeValue[fieldName] ? sanitizeValue[fieldName](value) : value\n ) as GenericFormValue\n\n const fieldValueOptions = options?.setUrlSearchParam\n ? { isTouched: options?.setUrlSearchParam }\n : undefined\n\n const oldValue = formStore\n .getState()\n .getFieldValues(fieldName as FormFieldNames)[0]\n\n formStore\n .getState()\n .setFieldValue(fieldName, sanitizedValue, fieldValueOptions)\n\n if (sanitizedValue !== oldValue) {\n widgetEvents.emit(WidgetEvent.FormFieldChanged, {\n fieldName,\n newValue: sanitizedValue,\n oldValue,\n } as FormFieldChanged)\n }\n },\n }\n }, [formStore, setSelectedBookmark])\n}\n"],"mappings":";;;;;;AAaA,MAAa,cACX,WACA,YACS;CACT,MAAM,EAAE,wBAAwB,mBAAmB;CAEnD,oBAAoB,eAAe;EACjC,MAAM,gBAEF;GACF,aAAa,WACV,OAAO,UAAU,WAAW,OAAO,YAAY,IAAI,UACpD,kBAAkB;GACpB,WAAW,WACR,OAAO,UAAU,WAAW,OAAO,YAAY,IAAI,UACpD,kBAAkB;GACpB,YAAY,UAAU;IACpB,MAAM,iBAAiB,OAAO,UAAU;IAExC,MAAM,WACH,iBAAiB,OAAO,UAAU,UACnC,kBAAkB;IAKpB,IAAI,gBACF,oBAAoB,KAAK;IAG3B,OAAO;GACT;EACF;EAEA,OAAO,EACL,gBAAgB,WAAW,OAAO,YAAY;GAC5C,MAAM,iBACJ,cAAc,aAAa,cAAc,WAAW,KAAK,IAAI;GAG/D,MAAM,oBAAoB,SAAS,oBAC/B,EAAE,WAAW,SAAS,kBAAkB,IACxC,KAAA;GAEJ,MAAM,WAAW,UACd,SAAS,EACT,eAAe,SAA2B,EAAE;GAE/C,UACG,SAAS,EACT,cAAc,WAAW,gBAAgB,iBAAiB;GAE7D,IAAI,mBAAmB,UACrB,aAAa,KAAA,oBAAmC;IAC9C;IACA,UAAU;IACV;GACF,CAAqB;EAEzB,EACF;CACF,GAAG,CAAC,WAAW,mBAAmB,CAAC;AACrC"}
1
+ {"version":3,"file":"useFormRef.js","names":[],"sources":["../../../../src/stores/form/useFormRef.ts"],"sourcesContent":["import { useImperativeHandle } from 'react'\nimport { widgetEvents } from '../../hooks/useWidgetEvents.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport { formDefaultValues } from '../../stores/form/createFormStore.js'\nimport type { FormFieldChanged } from '../../types/events.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport type { FormRef } from '../../types/widget.js'\nimport type {\n FormFieldNames,\n FormStoreStore,\n GenericFormValue,\n} from './types.js'\n\nexport const useFormRef = (\n formStore: FormStoreStore,\n formRef?: FormRef\n): void => {\n const { setSelectedBookmark } = useBookmarkActions()\n\n useImperativeHandle(formRef, () => {\n const sanitizeValue: {\n [key: string]: (value: any) => GenericFormValue\n } = {\n fromAmount: (value) =>\n (typeof value === 'number' ? value?.toPrecision() : value) ||\n formDefaultValues.fromAmount,\n toAmount: (value) =>\n (typeof value === 'number' ? value?.toPrecision() : value) ||\n formDefaultValues.toAmount,\n toAddress: (value) => {\n const isToAddressObj = typeof value !== 'string'\n\n const address =\n (isToAddressObj ? value?.address : value) ||\n formDefaultValues.toAddress\n\n // we can assume that the toAddress has been passed as ToAddress object\n // and display it accordingly - this ensures that if a name is included\n // that it is displayed in the Send To Wallet form field correctly\n if (isToAddressObj) {\n setSelectedBookmark(value)\n }\n\n return address\n },\n }\n\n return {\n setFieldValue: (fieldName, value, options) => {\n const sanitizedValue = (\n sanitizeValue[fieldName] ? sanitizeValue[fieldName](value) : value\n ) as GenericFormValue\n\n const fieldValueOptions = options?.setUrlSearchParam\n ? { isTouched: options?.setUrlSearchParam }\n : undefined\n\n const oldValue = formStore\n .getState()\n .getFieldValues(fieldName as FormFieldNames)[0]\n\n formStore\n .getState()\n .setFieldValue(fieldName, sanitizedValue, fieldValueOptions)\n\n if (sanitizedValue !== oldValue) {\n widgetEvents.emit(WidgetEvent.FormFieldChanged, {\n fieldName,\n newValue: sanitizedValue,\n oldValue,\n } as FormFieldChanged)\n }\n },\n }\n }, [formStore, setSelectedBookmark])\n}\n"],"mappings":";;;;;;AAaA,MAAa,cACX,WACA,YACS;CACT,MAAM,EAAE,wBAAwB,mBAAmB;CAEnD,oBAAoB,eAAe;EACjC,MAAM,gBAEF;GACF,aAAa,WACV,OAAO,UAAU,WAAW,OAAO,YAAY,IAAI,UACpD,kBAAkB;GACpB,WAAW,WACR,OAAO,UAAU,WAAW,OAAO,YAAY,IAAI,UACpD,kBAAkB;GACpB,YAAY,UAAU;IACpB,MAAM,iBAAiB,OAAO,UAAU;IAExC,MAAM,WACH,iBAAiB,OAAO,UAAU,UACnC,kBAAkB;IAKpB,IAAI,gBACF,oBAAoB,KAAK;IAG3B,OAAO;GACT;EACF;EAEA,OAAO,EACL,gBAAgB,WAAW,OAAO,YAAY;GAC5C,MAAM,iBACJ,cAAc,aAAa,cAAc,UAAU,CAAC,KAAK,IAAI;GAG/D,MAAM,oBAAoB,SAAS,oBAC/B,EAAE,WAAW,SAAS,kBAAkB,IACxC,KAAA;GAEJ,MAAM,WAAW,UACd,SAAS,CAAC,CACV,eAAe,SAA2B,CAAC,CAAC;GAE/C,UACG,SAAS,CAAC,CACV,cAAc,WAAW,gBAAgB,iBAAiB;GAE7D,IAAI,mBAAmB,UACrB,aAAa,KAAA,oBAAmC;IAC9C;IACA,UAAU;IACV;GACF,CAAqB;EAEzB,EACF;CACF,GAAG,CAAC,WAAW,mBAAmB,CAAC;AACrC"}
@@ -1,9 +1,9 @@
1
1
  import { FormStoreContext } from "./FormStoreContext.js";
2
- import { useContext } from "react";
2
+ import { use } from "react";
3
3
  import { useShallow } from "zustand/shallow";
4
4
  //#region src/stores/form/useFormStore.ts
5
5
  function useFormStore(selector) {
6
- const useStore = useContext(FormStoreContext);
6
+ const useStore = use(FormStoreContext);
7
7
  if (!useStore) throw new Error("You forgot to wrap your component in <FormStoreProvider>.");
8
8
  return useStore(useShallow(selector));
9
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useFormStore.js","names":[],"sources":["../../../../src/stores/form/useFormStore.ts"],"sourcesContent":["import { useContext } from 'react'\nimport { useShallow } from 'zustand/shallow'\nimport { FormStoreContext } from './FormStoreContext.js'\nimport type { FormValuesState } from './types.js'\n\nexport function useFormStore<T>(selector: (state: FormValuesState) => T): T {\n const useStore = useContext(FormStoreContext)\n\n if (!useStore) {\n throw new Error('You forgot to wrap your component in <FormStoreProvider>.')\n }\n\n return useStore(useShallow(selector))\n}\n"],"mappings":";;;;AAKA,SAAgB,aAAgB,UAA4C;CAC1E,MAAM,WAAW,WAAW,gBAAgB;CAE5C,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,2DAA2D;CAG7E,OAAO,SAAS,WAAW,QAAQ,CAAC;AACtC"}
1
+ {"version":3,"file":"useFormStore.js","names":[],"sources":["../../../../src/stores/form/useFormStore.ts"],"sourcesContent":["import { use } from 'react'\nimport { useShallow } from 'zustand/shallow'\nimport { FormStoreContext } from './FormStoreContext.js'\nimport type { FormValuesState } from './types.js'\n\nexport function useFormStore<T>(selector: (state: FormValuesState) => T): T {\n const useStore = use(FormStoreContext)\n\n if (!useStore) {\n throw new Error('You forgot to wrap your component in <FormStoreProvider>.')\n }\n\n return useStore(useShallow(selector))\n}\n"],"mappings":";;;;AAKA,SAAgB,aAAgB,UAA4C;CAC1E,MAAM,WAAW,IAAI,gBAAgB;CAErC,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,2DAA2D;CAG7E,OAAO,SAAS,WAAW,QAAQ,CAAC;AACtC"}
@@ -1,4 +1,4 @@
1
- import { createContext, useContext, useRef } from "react";
1
+ import { createContext, use, useRef } from "react";
2
2
  import { create } from "zustand";
3
3
  import { useShallow } from "zustand/shallow";
4
4
  import { jsx } from "react/jsx-runtime";
@@ -7,13 +7,13 @@ const HeaderStoreContext = createContext(null);
7
7
  function HeaderStoreProvider({ children }) {
8
8
  const storeRef = useRef(null);
9
9
  if (!storeRef.current) storeRef.current = createHeaderStore();
10
- return /* @__PURE__ */ jsx(HeaderStoreContext.Provider, {
10
+ return /* @__PURE__ */ jsx(HeaderStoreContext, {
11
11
  value: storeRef.current,
12
12
  children
13
13
  });
14
14
  }
15
15
  function useHeaderStoreContext() {
16
- const useStore = useContext(HeaderStoreContext);
16
+ const useStore = use(HeaderStoreContext);
17
17
  if (!useStore) throw new Error(`You forgot to wrap your component in <${HeaderStoreProvider.name}>.`);
18
18
  return useStore;
19
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useHeaderStore.js","names":[],"sources":["../../../../src/stores/header/useHeaderStore.tsx"],"sourcesContent":["import { createContext, useContext, useRef } from 'react'\nimport { create } from 'zustand'\nimport { useShallow } from 'zustand/shallow'\nimport type { PersistStoreProviderProps } from '../types.js'\nimport type { HeaderState, HeaderStore } from './types.js'\n\nconst HeaderStoreContext = createContext<HeaderStore | null>(null)\n\nexport function HeaderStoreProvider({\n children,\n}: PersistStoreProviderProps): any {\n const storeRef = useRef<HeaderStore>(null)\n if (!storeRef.current) {\n storeRef.current = createHeaderStore()\n }\n return (\n <HeaderStoreContext.Provider value={storeRef.current}>\n {children}\n </HeaderStoreContext.Provider>\n )\n}\n\nfunction useHeaderStoreContext() {\n const useStore = useContext(HeaderStoreContext)\n if (!useStore) {\n throw new Error(\n `You forgot to wrap your component in <${HeaderStoreProvider.name}>.`\n )\n }\n return useStore\n}\n\nexport function useHeaderStore<T>(selector: (state: HeaderState) => T): T {\n const useStore = useHeaderStoreContext()\n return useStore(useShallow(selector))\n}\n\n// We use fixed position on the header when Widget is in Full Height layout.\n// We do this to get it to work like the sticky header does in the other layout modes.\n// As the header is position fixed its not in the document flow anymore.\n// To prevent the remaining page content from appearing behind the header we need to\n// pass the headers height so that the position of the page content can be adjusted\nexport function useHeaderHeight(): any {\n const headerHeight = useHeaderStore((state) => state.headerHeight)\n\n return {\n headerHeight,\n }\n}\n\nexport function useSetHeaderHeight(): any {\n const setHeaderHeight = useHeaderStore((state) => state.setHeaderHeight)\n\n return {\n setHeaderHeight,\n }\n}\n\nconst createHeaderStore = () =>\n create<HeaderState>((set, get) => ({\n headerHeight: 108, // default header height\n setAction: (element) => {\n set(() => ({\n element,\n }))\n return get().removeAction\n },\n setTitle: (title) => {\n set(() => ({\n title,\n }))\n return get().removeTitle\n },\n removeAction: () => {\n set(() => ({\n element: null,\n }))\n },\n removeTitle: () => {\n set(() => ({\n title: undefined,\n }))\n },\n setHeaderHeight: (headerHeight) => {\n set(() => ({\n headerHeight,\n }))\n },\n setBackAction: (action) => {\n set(() => ({\n backAction: action,\n }))\n },\n executeBackAction: () => {\n const { backAction } = get()\n if (backAction) {\n backAction()\n set(() => ({\n backAction: undefined,\n }))\n }\n },\n }))\n"],"mappings":";;;;;AAMA,MAAM,qBAAqB,cAAkC,IAAI;AAEjE,SAAgB,oBAAoB,EAClC,YACiC;CACjC,MAAM,WAAW,OAAoB,IAAI;CACzC,IAAI,CAAC,SAAS,SACZ,SAAS,UAAU,kBAAkB;CAEvC,OACE,oBAAC,mBAAmB,UAApB;EAA6B,OAAO,SAAS;EAC1C;CAC0B,CAAA;AAEjC;AAEA,SAAS,wBAAwB;CAC/B,MAAM,WAAW,WAAW,kBAAkB;CAC9C,IAAI,CAAC,UACH,MAAM,IAAI,MACR,yCAAyC,oBAAoB,KAAK,GACpE;CAEF,OAAO;AACT;AAEA,SAAgB,eAAkB,UAAwC;CAExE,OADiB,sBACH,EAAE,WAAW,QAAQ,CAAC;AACtC;AAOA,SAAgB,kBAAuB;CAGrC,OAAO,EACL,cAHmB,gBAAgB,UAAU,MAAM,YAGxC,EACb;AACF;AAEA,SAAgB,qBAA0B;CAGxC,OAAO,EACL,iBAHsB,gBAAgB,UAAU,MAAM,eAGxC,EAChB;AACF;AAEA,MAAM,0BACJ,QAAqB,KAAK,SAAS;CACjC,cAAc;CACd,YAAY,YAAY;EACtB,WAAW,EACT,QACF,EAAE;EACF,OAAO,IAAI,EAAE;CACf;CACA,WAAW,UAAU;EACnB,WAAW,EACT,MACF,EAAE;EACF,OAAO,IAAI,EAAE;CACf;CACA,oBAAoB;EAClB,WAAW,EACT,SAAS,KACX,EAAE;CACJ;CACA,mBAAmB;EACjB,WAAW,EACT,OAAO,KAAA,EACT,EAAE;CACJ;CACA,kBAAkB,iBAAiB;EACjC,WAAW,EACT,aACF,EAAE;CACJ;CACA,gBAAgB,WAAW;EACzB,WAAW,EACT,YAAY,OACd,EAAE;CACJ;CACA,yBAAyB;EACvB,MAAM,EAAE,eAAe,IAAI;EAC3B,IAAI,YAAY;GACd,WAAW;GACX,WAAW,EACT,YAAY,KAAA,EACd,EAAE;EACJ;CACF;AACF,EAAE"}
1
+ {"version":3,"file":"useHeaderStore.js","names":[],"sources":["../../../../src/stores/header/useHeaderStore.tsx"],"sourcesContent":["import { createContext, use, useRef } from 'react'\nimport { create } from 'zustand'\nimport { useShallow } from 'zustand/shallow'\nimport type { PersistStoreProviderProps } from '../types.js'\nimport type { HeaderState, HeaderStore } from './types.js'\n\nconst HeaderStoreContext = createContext<HeaderStore | null>(null)\n\nexport function HeaderStoreProvider({\n children,\n}: PersistStoreProviderProps): any {\n const storeRef = useRef<HeaderStore>(null)\n if (!storeRef.current) {\n storeRef.current = createHeaderStore()\n }\n return (\n <HeaderStoreContext value={storeRef.current}>{children}</HeaderStoreContext>\n )\n}\n\nfunction useHeaderStoreContext() {\n const useStore = use(HeaderStoreContext)\n if (!useStore) {\n throw new Error(\n `You forgot to wrap your component in <${HeaderStoreProvider.name}>.`\n )\n }\n return useStore\n}\n\nexport function useHeaderStore<T>(selector: (state: HeaderState) => T): T {\n const useStore = useHeaderStoreContext()\n return useStore(useShallow(selector))\n}\n\n// We use fixed position on the header when Widget is in Full Height layout.\n// We do this to get it to work like the sticky header does in the other layout modes.\n// As the header is position fixed its not in the document flow anymore.\n// To prevent the remaining page content from appearing behind the header we need to\n// pass the headers height so that the position of the page content can be adjusted\nexport function useHeaderHeight(): any {\n const headerHeight = useHeaderStore((state) => state.headerHeight)\n\n return {\n headerHeight,\n }\n}\n\nexport function useSetHeaderHeight(): any {\n const setHeaderHeight = useHeaderStore((state) => state.setHeaderHeight)\n\n return {\n setHeaderHeight,\n }\n}\n\nconst createHeaderStore = () =>\n create<HeaderState>((set, get) => ({\n headerHeight: 108, // default header height\n setAction: (element) => {\n set(() => ({\n element,\n }))\n return get().removeAction\n },\n setTitle: (title) => {\n set(() => ({\n title,\n }))\n return get().removeTitle\n },\n removeAction: () => {\n set(() => ({\n element: null,\n }))\n },\n removeTitle: () => {\n set(() => ({\n title: undefined,\n }))\n },\n setHeaderHeight: (headerHeight) => {\n set(() => ({\n headerHeight,\n }))\n },\n setBackAction: (action) => {\n set(() => ({\n backAction: action,\n }))\n },\n executeBackAction: () => {\n const { backAction } = get()\n if (backAction) {\n backAction()\n set(() => ({\n backAction: undefined,\n }))\n }\n },\n }))\n"],"mappings":";;;;;AAMA,MAAM,qBAAqB,cAAkC,IAAI;AAEjE,SAAgB,oBAAoB,EAClC,YACiC;CACjC,MAAM,WAAW,OAAoB,IAAI;CACzC,IAAI,CAAC,SAAS,SACZ,SAAS,UAAU,kBAAkB;CAEvC,OACE,oBAAC,oBAAD;EAAoB,OAAO,SAAS;EAAU;CAA6B,CAAA;AAE/E;AAEA,SAAS,wBAAwB;CAC/B,MAAM,WAAW,IAAI,kBAAkB;CACvC,IAAI,CAAC,UACH,MAAM,IAAI,MACR,yCAAyC,oBAAoB,KAAK,GACpE;CAEF,OAAO;AACT;AAEA,SAAgB,eAAkB,UAAwC;CAExE,OADiB,sBACH,CAAC,CAAC,WAAW,QAAQ,CAAC;AACtC;AAOA,SAAgB,kBAAuB;CAGrC,OAAO,EACL,cAHmB,gBAAgB,UAAU,MAAM,YAGxC,EACb;AACF;AAEA,SAAgB,qBAA0B;CAGxC,OAAO,EACL,iBAHsB,gBAAgB,UAAU,MAAM,eAGxC,EAChB;AACF;AAEA,MAAM,0BACJ,QAAqB,KAAK,SAAS;CACjC,cAAc;CACd,YAAY,YAAY;EACtB,WAAW,EACT,QACF,EAAE;EACF,OAAO,IAAI,CAAC,CAAC;CACf;CACA,WAAW,UAAU;EACnB,WAAW,EACT,MACF,EAAE;EACF,OAAO,IAAI,CAAC,CAAC;CACf;CACA,oBAAoB;EAClB,WAAW,EACT,SAAS,KACX,EAAE;CACJ;CACA,mBAAmB;EACjB,WAAW,EACT,OAAO,KAAA,EACT,EAAE;CACJ;CACA,kBAAkB,iBAAiB;EACjC,WAAW,EACT,aACF,EAAE;CACJ;CACA,gBAAgB,WAAW;EACzB,WAAW,EACT,YAAY,OACd,EAAE;CACJ;CACA,yBAAyB;EACvB,MAAM,EAAE,eAAe,IAAI;EAC3B,IAAI,YAAY;GACd,WAAW;GACX,WAAW,EACT,YAAY,KAAA,EACd,EAAE;EACJ;CACF;AACF,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"useInputModeStore.js","names":[],"sources":["../../../../src/stores/inputMode/useInputModeStore.ts"],"sourcesContent":["import type { StoreApi, UseBoundStore } from 'zustand'\nimport { create } from 'zustand'\nimport type { FormTypeProps } from '../form/types.js'\n\ntype InputMode = 'amount' | 'price'\n\ninterface InputModeState {\n inputMode: Record<'from' | 'to', InputMode>\n setInputMode: (formType: FormTypeProps['formType'], mode: InputMode) => void\n toggleInputMode: (formType: FormTypeProps['formType']) => void\n}\n\nexport const useInputModeStore: UseBoundStore<StoreApi<InputModeState>> =\n create<InputModeState>((set, get) => ({\n inputMode: {\n from: 'amount',\n to: 'amount',\n },\n setInputMode: (formType, mode) =>\n set((state) => ({\n inputMode: {\n ...state.inputMode,\n [formType]: mode,\n },\n })),\n toggleInputMode: (formType) => {\n const currentMode = get().inputMode[formType]\n const newMode = currentMode === 'amount' ? 'price' : 'amount'\n get().setInputMode(formType, newMode)\n },\n }))\n"],"mappings":";;AAYA,MAAa,oBACX,QAAwB,KAAK,SAAS;CACpC,WAAW;EACT,MAAM;EACN,IAAI;CACN;CACA,eAAe,UAAU,SACvB,KAAK,WAAW,EACd,WAAW;EACT,GAAG,MAAM;GACR,WAAW;CACd,EACF,EAAE;CACJ,kBAAkB,aAAa;EAE7B,MAAM,UADc,IAAI,EAAE,UAAU,cACJ,WAAW,UAAU;EACrD,IAAI,EAAE,aAAa,UAAU,OAAO;CACtC;AACF,EAAE"}
1
+ {"version":3,"file":"useInputModeStore.js","names":[],"sources":["../../../../src/stores/inputMode/useInputModeStore.ts"],"sourcesContent":["import type { StoreApi, UseBoundStore } from 'zustand'\nimport { create } from 'zustand'\nimport type { FormTypeProps } from '../form/types.js'\n\ntype InputMode = 'amount' | 'price'\n\ninterface InputModeState {\n inputMode: Record<'from' | 'to', InputMode>\n setInputMode: (formType: FormTypeProps['formType'], mode: InputMode) => void\n toggleInputMode: (formType: FormTypeProps['formType']) => void\n}\n\nexport const useInputModeStore: UseBoundStore<StoreApi<InputModeState>> =\n create<InputModeState>((set, get) => ({\n inputMode: {\n from: 'amount',\n to: 'amount',\n },\n setInputMode: (formType, mode) =>\n set((state) => ({\n inputMode: {\n ...state.inputMode,\n [formType]: mode,\n },\n })),\n toggleInputMode: (formType) => {\n const currentMode = get().inputMode[formType]\n const newMode = currentMode === 'amount' ? 'price' : 'amount'\n get().setInputMode(formType, newMode)\n },\n }))\n"],"mappings":";;AAYA,MAAa,oBACX,QAAwB,KAAK,SAAS;CACpC,WAAW;EACT,MAAM;EACN,IAAI;CACN;CACA,eAAe,UAAU,SACvB,KAAK,WAAW,EACd,WAAW;EACT,GAAG,MAAM;GACR,WAAW;CACd,EACF,EAAE;CACJ,kBAAkB,aAAa;EAE7B,MAAM,UADc,IAAI,CAAC,CAAC,UAAU,cACJ,WAAW,UAAU;EACrD,IAAI,CAAC,CAAC,aAAa,UAAU,OAAO;CACtC;AACF,EAAE"}
@@ -0,0 +1,22 @@
1
+ import { useTranslation } from "react-i18next";
2
+ //#region src/stores/navigationTabs/useNavigationTabLabel.ts
3
+ const useNavigationTabLabel = () => {
4
+ const { t } = useTranslation();
5
+ return (key) => {
6
+ switch (key) {
7
+ case "default": return t("header.swapAndBridge");
8
+ case "private": return t("header.private");
9
+ case "refuel": return t("header.gas");
10
+ case "swap":
11
+ case "swap-advanced": return t("header.swap");
12
+ case "bridge":
13
+ case "bridge-advanced": return t("header.bridge");
14
+ case "limit": return t("header.limit");
15
+ default: return t("header.swapAndBridge");
16
+ }
17
+ };
18
+ };
19
+ //#endregion
20
+ export { useNavigationTabLabel };
21
+
22
+ //# sourceMappingURL=useNavigationTabLabel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNavigationTabLabel.js","names":[],"sources":["../../../../src/stores/navigationTabs/useNavigationTabLabel.ts"],"sourcesContent":["import { useTranslation } from 'react-i18next'\nimport type { NavigationTabKey } from '../../types/widget.js'\n\nexport const useNavigationTabLabel = (): ((\n key: NavigationTabKey\n) => string) => {\n const { t } = useTranslation()\n return (key: NavigationTabKey) => {\n switch (key) {\n case 'default':\n return t('header.swapAndBridge')\n case 'private':\n return t('header.private')\n case 'refuel':\n return t('header.gas')\n case 'swap':\n case 'swap-advanced':\n return t('header.swap')\n case 'bridge':\n case 'bridge-advanced':\n return t('header.bridge')\n case 'limit':\n return t('header.limit')\n default:\n return t('header.swapAndBridge')\n }\n }\n}\n"],"mappings":";;AAGA,MAAa,8BAEG;CACd,MAAM,EAAE,MAAM,eAAe;CAC7B,QAAQ,QAA0B;EAChC,QAAQ,KAAR;GACE,KAAK,WACH,OAAO,EAAE,sBAAsB;GACjC,KAAK,WACH,OAAO,EAAE,gBAAgB;GAC3B,KAAK,UACH,OAAO,EAAE,YAAY;GACvB,KAAK;GACL,KAAK,iBACH,OAAO,EAAE,aAAa;GACxB,KAAK;GACL,KAAK,mBACH,OAAO,EAAE,eAAe;GAC1B,KAAK,SACH,OAAO,EAAE,cAAc;GACzB,SACE,OAAO,EAAE,sBAAsB;EACnC;CACF;AACF"}
@@ -0,0 +1,64 @@
1
+ import { WidgetContext, useWidgetConfig } from "../../providers/WidgetProvider/WidgetProvider.js";
2
+ import { getInitialActiveTab, getNavigationTabKeys, getTabDefaultUI, getTabMode, getTabModeOptions, getTabRequiredUI, getTabSplitMode, getTabVariant } from "./utils.js";
3
+ import { createContext, use, useMemo, useRef } from "react";
4
+ import { create } from "zustand";
5
+ import { useShallow } from "zustand/shallow";
6
+ import { jsx } from "react/jsx-runtime";
7
+ //#region src/stores/navigationTabs/useNavigationTabsStore.tsx
8
+ const NavigationTabsStoreContext = createContext(null);
9
+ function NavigationTabsStoreProvider({ children, config }) {
10
+ const tabs = getNavigationTabKeys(config);
11
+ const initialActiveTab = getInitialActiveTab(config);
12
+ const signature = `${tabs.join(",")}|${initialActiveTab ?? ""}`;
13
+ const storeRef = useRef(null);
14
+ const signatureRef = useRef(signature);
15
+ let store = storeRef.current;
16
+ if (!store || signatureRef.current !== signature) {
17
+ store = createNavigationTabsStore(tabs, initialActiveTab);
18
+ storeRef.current = store;
19
+ signatureRef.current = signature;
20
+ }
21
+ const widgetConfig = useWidgetConfig();
22
+ const activeTab = store((state) => state.activeTab);
23
+ const tabConfig = useMemo(() => {
24
+ if (!activeTab) return widgetConfig;
25
+ return {
26
+ ...widgetConfig,
27
+ mode: getTabMode(widgetConfig, activeTab),
28
+ variant: getTabVariant(widgetConfig, activeTab),
29
+ modeOptions: getTabModeOptions(widgetConfig, activeTab),
30
+ defaultUI: getTabDefaultUI(widgetConfig, activeTab),
31
+ requiredUI: getTabRequiredUI(widgetConfig, activeTab)
32
+ };
33
+ }, [widgetConfig, activeTab]);
34
+ return /* @__PURE__ */ jsx(NavigationTabsStoreContext, {
35
+ value: store,
36
+ children: /* @__PURE__ */ jsx(WidgetContext, {
37
+ value: tabConfig,
38
+ children
39
+ })
40
+ });
41
+ }
42
+ function useNavigationTabsStoreContext() {
43
+ const useStore = use(NavigationTabsStoreContext);
44
+ if (!useStore) throw new Error(`You forgot to wrap your component in <${NavigationTabsStoreProvider.name}>.`);
45
+ return useStore;
46
+ }
47
+ function useNavigationTabsStore(selector) {
48
+ return useNavigationTabsStoreContext()(useShallow(selector));
49
+ }
50
+ /** Effective split mode derived from the active tab. */
51
+ function useSplitMode() {
52
+ return useNavigationTabsStore((state) => getTabSplitMode(state.activeTab));
53
+ }
54
+ const createNavigationTabsStore = (tabs, initialActiveTab) => create((set) => ({
55
+ tabs,
56
+ activeTab: initialActiveTab,
57
+ setActiveTab(activeTab) {
58
+ set({ activeTab });
59
+ }
60
+ }));
61
+ //#endregion
62
+ export { NavigationTabsStoreProvider, useNavigationTabsStore, useSplitMode };
63
+
64
+ //# sourceMappingURL=useNavigationTabsStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNavigationTabsStore.js","names":[],"sources":["../../../../src/stores/navigationTabs/useNavigationTabsStore.tsx"],"sourcesContent":["import {\n createContext,\n type JSX,\n type PropsWithChildren,\n use,\n useMemo,\n useRef,\n} from 'react'\nimport { create } from 'zustand'\nimport { useShallow } from 'zustand/shallow'\nimport {\n useWidgetConfig,\n WidgetContext,\n} from '../../providers/WidgetProvider/WidgetProvider.js'\nimport type {\n NavigationTabKey,\n SplitMode,\n WidgetConfig,\n} from '../../types/widget.js'\nimport type { NavigationTabsState, NavigationTabsStore } from './types.js'\nimport {\n getInitialActiveTab,\n getNavigationTabKeys,\n getTabDefaultUI,\n getTabMode,\n getTabModeOptions,\n getTabRequiredUI,\n getTabSplitMode,\n getTabVariant,\n} from './utils.js'\n\nconst NavigationTabsStoreContext = createContext<NavigationTabsStore | null>(\n null\n)\n\nexport function NavigationTabsStoreProvider({\n children,\n config,\n}: PropsWithChildren<{ config: WidgetConfig }>): JSX.Element {\n const tabs = getNavigationTabKeys(config)\n const initialActiveTab = getInitialActiveTab(config)\n // Recreate (re-seeding tabs + active tab) only when the config-driven inputs\n // change — not on runtime tab clicks, which must be preserved.\n const signature = `${tabs.join(',')}|${initialActiveTab ?? ''}`\n const storeRef = useRef<NavigationTabsStore>(null)\n const signatureRef = useRef(signature)\n let store = storeRef.current\n if (!store || signatureRef.current !== signature) {\n store = createNavigationTabsStore(tabs, initialActiveTab)\n storeRef.current = store\n signatureRef.current = signature\n }\n\n // Override the widget config with the active tab's mode, variant,\n // modeOptions, defaultUI and requiredUI (each falling back to the config), so\n // the rest of the widget reads tab-driven config transparently. No-op when\n // there is no active tab.\n const widgetConfig = useWidgetConfig()\n const activeTab = store((state) => state.activeTab)\n const tabConfig = useMemo(() => {\n if (!activeTab) {\n return widgetConfig\n }\n return {\n ...widgetConfig,\n mode: getTabMode(widgetConfig, activeTab),\n variant: getTabVariant(widgetConfig, activeTab),\n modeOptions: getTabModeOptions(widgetConfig, activeTab),\n defaultUI: getTabDefaultUI(widgetConfig, activeTab),\n requiredUI: getTabRequiredUI(widgetConfig, activeTab),\n }\n }, [widgetConfig, activeTab])\n\n return (\n <NavigationTabsStoreContext value={store}>\n <WidgetContext value={tabConfig}>{children}</WidgetContext>\n </NavigationTabsStoreContext>\n )\n}\n\nfunction useNavigationTabsStoreContext(): NavigationTabsStore {\n const useStore = use(NavigationTabsStoreContext)\n if (!useStore) {\n throw new Error(\n `You forgot to wrap your component in <${NavigationTabsStoreProvider.name}>.`\n )\n }\n return useStore\n}\n\nexport function useNavigationTabsStore<T>(\n selector: (state: NavigationTabsState) => T\n): T {\n const useStore = useNavigationTabsStoreContext()\n return useStore(useShallow(selector))\n}\n\n/** Effective split mode derived from the active tab. */\nexport function useSplitMode(): SplitMode | undefined {\n return useNavigationTabsStore((state) => getTabSplitMode(state.activeTab))\n}\n\nconst createNavigationTabsStore = (\n tabs: NavigationTabKey[],\n initialActiveTab?: NavigationTabKey\n): NavigationTabsStore =>\n create<NavigationTabsState>((set) => ({\n tabs,\n activeTab: initialActiveTab,\n setActiveTab(activeTab) {\n set({ activeTab })\n },\n }))\n"],"mappings":";;;;;;;AA+BA,MAAM,6BAA6B,cACjC,IACF;AAEA,SAAgB,4BAA4B,EAC1C,UACA,UAC2D;CAC3D,MAAM,OAAO,qBAAqB,MAAM;CACxC,MAAM,mBAAmB,oBAAoB,MAAM;CAGnD,MAAM,YAAY,GAAG,KAAK,KAAK,GAAG,EAAE,GAAG,oBAAoB;CAC3D,MAAM,WAAW,OAA4B,IAAI;CACjD,MAAM,eAAe,OAAO,SAAS;CACrC,IAAI,QAAQ,SAAS;CACrB,IAAI,CAAC,SAAS,aAAa,YAAY,WAAW;EAChD,QAAQ,0BAA0B,MAAM,gBAAgB;EACxD,SAAS,UAAU;EACnB,aAAa,UAAU;CACzB;CAMA,MAAM,eAAe,gBAAgB;CACrC,MAAM,YAAY,OAAO,UAAU,MAAM,SAAS;CAClD,MAAM,YAAY,cAAc;EAC9B,IAAI,CAAC,WACH,OAAO;EAET,OAAO;GACL,GAAG;GACH,MAAM,WAAW,cAAc,SAAS;GACxC,SAAS,cAAc,cAAc,SAAS;GAC9C,aAAa,kBAAkB,cAAc,SAAS;GACtD,WAAW,gBAAgB,cAAc,SAAS;GAClD,YAAY,iBAAiB,cAAc,SAAS;EACtD;CACF,GAAG,CAAC,cAAc,SAAS,CAAC;CAE5B,OACE,oBAAC,4BAAD;EAA4B,OAAO;YACjC,oBAAC,eAAD;GAAe,OAAO;GAAY;EAAwB,CAAA;CAChC,CAAA;AAEhC;AAEA,SAAS,gCAAqD;CAC5D,MAAM,WAAW,IAAI,0BAA0B;CAC/C,IAAI,CAAC,UACH,MAAM,IAAI,MACR,yCAAyC,4BAA4B,KAAK,GAC5E;CAEF,OAAO;AACT;AAEA,SAAgB,uBACd,UACG;CAEH,OADiB,8BACH,CAAC,CAAC,WAAW,QAAQ,CAAC;AACtC;;AAGA,SAAgB,eAAsC;CACpD,OAAO,wBAAwB,UAAU,gBAAgB,MAAM,SAAS,CAAC;AAC3E;AAEA,MAAM,6BACJ,MACA,qBAEA,QAA6B,SAAS;CACpC;CACA,WAAW;CACX,aAAa,WAAW;EACtB,IAAI,EAAE,UAAU,CAAC;CACnB;AACF,EAAE"}