@lifi/widget 4.0.0 → 4.1.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 (324) 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/AppDrawer.d.ts +1 -1
  6. package/dist/esm/AppDrawer.d.ts.map +1 -1
  7. package/dist/esm/AppDrawer.js +5 -6
  8. package/dist/esm/AppDrawer.js.map +1 -1
  9. package/dist/esm/AppDrawerContext.js +2 -2
  10. package/dist/esm/AppDrawerContext.js.map +1 -1
  11. package/dist/esm/components/ActionRow/ActionRow.style.js.map +1 -1
  12. package/dist/esm/components/AmountInput/AmountInput.js.map +1 -1
  13. package/dist/esm/components/AmountInput/AmountInput.style.js.map +1 -1
  14. package/dist/esm/components/AmountInput/AmountInputEndAdornment.style.js.map +1 -1
  15. package/dist/esm/components/AmountInput/PriceFormHelperText.style.js.map +1 -1
  16. package/dist/esm/components/AppContainer.js.map +1 -1
  17. package/dist/esm/components/Avatar/AccountAvatar.js.map +1 -1
  18. package/dist/esm/components/Avatar/Avatar.style.js.map +1 -1
  19. package/dist/esm/components/Avatar/SmallAvatar.js.map +1 -1
  20. package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.js +1 -0
  21. package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.js.map +1 -1
  22. package/dist/esm/components/BottomSheet/BottomSheet.js +3 -3
  23. package/dist/esm/components/BottomSheet/BottomSheet.js.map +1 -1
  24. package/dist/esm/components/ButtonTertiary.js.map +1 -1
  25. package/dist/esm/components/Card/Card.js.map +1 -1
  26. package/dist/esm/components/Card/CardButton.style.js.map +1 -1
  27. package/dist/esm/components/Card/CardHeader.js.map +1 -1
  28. package/dist/esm/components/Card/CardIconButton.js.map +1 -1
  29. package/dist/esm/components/Card/CardLabel.js.map +1 -1
  30. package/dist/esm/components/Card/CardTitle.js.map +1 -1
  31. package/dist/esm/components/Card/InputCard.js.map +1 -1
  32. package/dist/esm/components/ChainSelect/ChainSelect.js.map +1 -1
  33. package/dist/esm/components/ChainSelect/ChainSelect.style.js.map +1 -1
  34. package/dist/esm/components/ChainSelect/useChainSelect.js.map +1 -1
  35. package/dist/esm/components/Chains/AllChainsAvatar.js.map +1 -1
  36. package/dist/esm/components/Chains/ChainList.js.map +1 -1
  37. package/dist/esm/components/Chains/ChainList.style.js.map +1 -1
  38. package/dist/esm/components/Chains/ChainsExpanded.style.js.map +1 -1
  39. package/dist/esm/components/Chains/VirtualizedChainList.js.map +1 -1
  40. package/dist/esm/components/ContextMenu.style.js.map +1 -1
  41. package/dist/esm/components/ContractComponent/NFT/NFT.style.js.map +1 -1
  42. package/dist/esm/components/Dialog/Dialog.style.js.map +1 -1
  43. package/dist/esm/components/EmptyListIndicator/EmptyListIndicator.style.js.map +1 -1
  44. package/dist/esm/components/ExecutionStatusCard/StatusIcon.js.map +1 -1
  45. package/dist/esm/components/ExecutionStatusCard/StatusIcon.style.js.map +1 -1
  46. package/dist/esm/components/ExecutionStatusCard/iconKey.js.map +1 -1
  47. package/dist/esm/components/Expansion/Expansion.style.js.map +1 -1
  48. package/dist/esm/components/Header/ActivitiesButton.style.js.map +1 -1
  49. package/dist/esm/components/Header/CloseDrawerButton.js +1 -0
  50. package/dist/esm/components/Header/CloseDrawerButton.js.map +1 -1
  51. package/dist/esm/components/Header/Header.js +7 -10
  52. package/dist/esm/components/Header/Header.js.map +1 -1
  53. package/dist/esm/components/Header/Header.style.js.map +1 -1
  54. package/dist/esm/components/Header/HeaderNavigationTabs.js +26 -0
  55. package/dist/esm/components/Header/HeaderNavigationTabs.js.map +1 -0
  56. package/dist/esm/components/Header/HeaderTabs.js +33 -0
  57. package/dist/esm/components/Header/HeaderTabs.js.map +1 -0
  58. package/dist/esm/components/Header/NavigationHeader.js +7 -5
  59. package/dist/esm/components/Header/NavigationHeader.js.map +1 -1
  60. package/dist/esm/components/Header/SettingsButton.style.js.map +1 -1
  61. package/dist/esm/components/Header/WalletMenu.style.js.map +1 -1
  62. package/dist/esm/components/IconCircle/IconCircle.style.js.map +1 -1
  63. package/dist/esm/components/IconTypography.js.map +1 -1
  64. package/dist/esm/components/Input.js.map +1 -1
  65. package/dist/esm/components/ListItem/ListItem.js.map +1 -1
  66. package/dist/esm/components/ListItem/ListItemButton.js.map +1 -1
  67. package/dist/esm/components/ListItemButton.js.map +1 -1
  68. package/dist/esm/components/ListItemText.js.map +1 -1
  69. package/dist/esm/components/Menu.js.map +1 -1
  70. package/dist/esm/components/Messages/AlertMessage.style.js.map +1 -1
  71. package/dist/esm/components/Messages/GasRefuelMessage.style.js.map +1 -1
  72. package/dist/esm/components/Messages/WarningMessages.js.map +1 -1
  73. package/dist/esm/components/PageContainer.js.map +1 -1
  74. package/dist/esm/components/PoweredBy/PoweredBy.js.map +1 -1
  75. package/dist/esm/components/PoweredBy/PoweredBy.style.js.map +1 -1
  76. package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js +1 -0
  77. package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.js.map +1 -1
  78. package/dist/esm/components/ReverseTokensButton/ReverseTokensButton.style.js.map +1 -1
  79. package/dist/esm/components/RouteCard/RouteDetails.js.map +1 -1
  80. package/dist/esm/components/RouteCard/RouteDetails.style.js +2 -2
  81. package/dist/esm/components/RouteCard/RouteDetails.style.js.map +1 -1
  82. package/dist/esm/components/RouteCard/RouteToken.style.js.map +1 -1
  83. package/dist/esm/components/RouteCard/RouteTokens.js.map +1 -1
  84. package/dist/esm/components/RouteCard/getMatchingLabels.js.map +1 -1
  85. package/dist/esm/components/Routes/RoutesContent.js.map +1 -1
  86. package/dist/esm/components/Routes/RoutesExpanded.style.js.map +1 -1
  87. package/dist/esm/components/Search/SearchInput.style.js.map +1 -1
  88. package/dist/esm/components/Search/SearchNotFound.style.js.map +1 -1
  89. package/dist/esm/components/SelectTokenButton/SelectTokenButton.style.js.map +1 -1
  90. package/dist/esm/components/SendToWallet/SendToWalletButton.style.js.map +1 -1
  91. package/dist/esm/components/SettingsListItemButton.js.map +1 -1
  92. package/dist/esm/components/Skeleton/WidgetSkeleton.js +50 -47
  93. package/dist/esm/components/Skeleton/WidgetSkeleton.js.map +1 -1
  94. package/dist/esm/components/Skeleton/WidgetSkeleton.style.js.map +1 -1
  95. package/dist/esm/components/Step/StepActions.js.map +1 -1
  96. package/dist/esm/components/Step/StepActions.style.js.map +1 -1
  97. package/dist/esm/components/StepActions/SentToWalletRow.style.js.map +1 -1
  98. package/dist/esm/components/StepActions/StepActionRow.style.js.map +1 -1
  99. package/dist/esm/components/Switch.js.map +1 -1
  100. package/dist/esm/components/Tabs/NavigationTabs.js +3 -0
  101. package/dist/esm/components/Tabs/NavigationTabs.js.map +1 -1
  102. package/dist/esm/components/Tabs/Tabs.style.js.map +1 -1
  103. package/dist/esm/components/Timer/StepStatusTimer.style.js.map +1 -1
  104. package/dist/esm/components/Token/Token.style.js.map +1 -1
  105. package/dist/esm/components/TokenList/PinTokenButton.js.map +1 -1
  106. package/dist/esm/components/TokenList/TokenDetailsSheet.js +4 -4
  107. package/dist/esm/components/TokenList/TokenDetailsSheet.js.map +1 -1
  108. package/dist/esm/components/TokenList/TokenDetailsSheetContent.js +4 -4
  109. package/dist/esm/components/TokenList/TokenDetailsSheetContent.js.map +1 -1
  110. package/dist/esm/components/TokenList/TokenDetailsSheetContent.style.js.map +1 -1
  111. package/dist/esm/components/TokenList/TokenList.style.js.map +1 -1
  112. package/dist/esm/components/TokenList/TokenListItem.js +2 -2
  113. package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
  114. package/dist/esm/components/TokenList/VirtualizedTokenList.js.map +1 -1
  115. package/dist/esm/components/TokenList/useTokenSelect.js +3 -3
  116. package/dist/esm/components/TokenList/useTokenSelect.js.map +1 -1
  117. package/dist/esm/components/TokenRate/TokenRate.style.js.map +1 -1
  118. package/dist/esm/components/TransactionCard/ActiveTransactionCard.js.map +1 -1
  119. package/dist/esm/components/TransactionCard/ActiveTransactionCard.style.js.map +1 -1
  120. package/dist/esm/components/TransactionCard/TransactionCard.style.js.map +1 -1
  121. package/dist/esm/config/version.d.ts +1 -1
  122. package/dist/esm/config/version.js +1 -1
  123. package/dist/esm/config/version.js.map +1 -1
  124. package/dist/esm/hooks/timer/validate.js.map +1 -1
  125. package/dist/esm/hooks/useAccountsBalancesData.js.map +1 -1
  126. package/dist/esm/hooks/useAvailableChains.js +1 -1
  127. package/dist/esm/hooks/useChainSearch.js.map +1 -1
  128. package/dist/esm/hooks/useChains.js +1 -1
  129. package/dist/esm/hooks/useExplorer.js.map +1 -1
  130. package/dist/esm/hooks/useFilteredByTokenBalances.js +1 -1
  131. package/dist/esm/hooks/useFilteredByTokenBalances.js.map +1 -1
  132. package/dist/esm/hooks/useFromTokenSufficiency.js.map +1 -1
  133. package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
  134. package/dist/esm/hooks/useLanguages.js +2 -2
  135. package/dist/esm/hooks/useLanguages.js.map +1 -1
  136. package/dist/esm/hooks/useRouteExecution.js.map +1 -1
  137. package/dist/esm/hooks/useRouteExecutionMessage.js.map +1 -1
  138. package/dist/esm/hooks/useRouteRequiredAccountConnection.js.map +1 -1
  139. package/dist/esm/hooks/useRoutes.js.map +1 -1
  140. package/dist/esm/hooks/useSwapOnly.js +2 -4
  141. package/dist/esm/hooks/useSwapOnly.js.map +1 -1
  142. package/dist/esm/hooks/useToAddressRequirements.js +2 -2
  143. package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
  144. package/dist/esm/hooks/useToken.js.map +1 -1
  145. package/dist/esm/hooks/useTokenBalance.js.map +1 -1
  146. package/dist/esm/hooks/useTokenBalances.js.map +1 -1
  147. package/dist/esm/hooks/useTokenBalancesQueries.js.map +1 -1
  148. package/dist/esm/hooks/useTokenSearch.js +1 -1
  149. package/dist/esm/hooks/useTokenSearch.js.map +1 -1
  150. package/dist/esm/hooks/useTokens.js +1 -1
  151. package/dist/esm/hooks/useTokens.js.map +1 -1
  152. package/dist/esm/hooks/useTools.js +1 -1
  153. package/dist/esm/hooks/useTransactionDetails.js.map +1 -1
  154. package/dist/esm/hooks/useTransactionHistory.js.map +1 -1
  155. package/dist/esm/hooks/useTransactionList.js.map +1 -1
  156. package/dist/esm/i18n/en.json +3 -0
  157. package/dist/esm/index.d.ts +2 -2
  158. package/dist/esm/pages/ActivitiesPage/ActivitiesPage.js.map +1 -1
  159. package/dist/esm/pages/MainPage/ReviewButton.js +2 -2
  160. package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
  161. package/dist/esm/pages/RoutesPage/RoutesPage.js.map +1 -1
  162. package/dist/esm/pages/RoutesPage/RoutesPage.style.js.map +1 -1
  163. package/dist/esm/pages/SelectEnabledToolsPage.js.map +1 -1
  164. package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js +3 -3
  165. package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js.map +1 -1
  166. package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js +3 -3
  167. package/dist/esm/pages/SendToWallet/ConfirmAddressSheet.js.map +1 -1
  168. package/dist/esm/pages/SendToWallet/SendToWalletPage.js.map +1 -1
  169. package/dist/esm/pages/SendToWallet/SendToWalletPage.style.js.map +1 -1
  170. package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js.map +1 -1
  171. package/dist/esm/pages/SettingsPage/GasPriceSettings.js +1 -1
  172. package/dist/esm/pages/SettingsPage/ResetSettingsButton.style.js.map +1 -1
  173. package/dist/esm/pages/SettingsPage/RoutePrioritySettings.js +1 -1
  174. package/dist/esm/pages/SettingsPage/SettingsCard/SettingCard.style.js.map +1 -1
  175. package/dist/esm/pages/SettingsPage/SettingsCard/SettingCardExpandable.js +3 -3
  176. package/dist/esm/pages/SettingsPage/SettingsCard/SettingCardExpandable.js.map +1 -1
  177. package/dist/esm/pages/SettingsPage/SettingsCard/SettingsAccordian.js +3 -3
  178. package/dist/esm/pages/SettingsPage/SettingsCard/SettingsAccordian.js.map +1 -1
  179. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js.map +1 -1
  180. package/dist/esm/pages/SettingsPage/ThemeSettings.js.map +1 -1
  181. package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.style.js.map +1 -1
  182. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js.map +1 -1
  183. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsSkeleton.js.map +1 -1
  184. package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js +3 -3
  185. package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js.map +1 -1
  186. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js +16 -15
  187. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js.map +1 -1
  188. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.style.js.map +1 -1
  189. package/dist/esm/pages/TransactionPage/RouteTracker.js.map +1 -1
  190. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js +3 -3
  191. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
  192. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.style.js.map +1 -1
  193. package/dist/esm/pages/TransactionPage/TransactionExecutionContent.js +27 -31
  194. package/dist/esm/pages/TransactionPage/TransactionExecutionContent.js.map +1 -1
  195. package/dist/esm/pages/TransactionPage/utils.js.map +1 -1
  196. package/dist/esm/providers/I18nProvider/I18nProvider.js.map +1 -1
  197. package/dist/esm/providers/I18nProvider/i18n.js.map +1 -1
  198. package/dist/esm/providers/QueryClientProvider.js +2 -2
  199. package/dist/esm/providers/QueryClientProvider.js.map +1 -1
  200. package/dist/esm/providers/SDKClientProvider.js +26 -27
  201. package/dist/esm/providers/SDKClientProvider.js.map +1 -1
  202. package/dist/esm/providers/WidgetProvider/WidgetProvider.js +25 -27
  203. package/dist/esm/providers/WidgetProvider/WidgetProvider.js.map +1 -1
  204. package/dist/esm/stores/StoreProvider.js +3 -4
  205. package/dist/esm/stores/StoreProvider.js.map +1 -1
  206. package/dist/esm/stores/bookmarks/BookmarkStore.js +3 -3
  207. package/dist/esm/stores/bookmarks/BookmarkStore.js.map +1 -1
  208. package/dist/esm/stores/bookmarks/createBookmarkStore.js.map +1 -1
  209. package/dist/esm/stores/chains/ChainOrderStore.js +4 -4
  210. package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
  211. package/dist/esm/stores/chains/createChainOrderStore.js.map +1 -1
  212. package/dist/esm/stores/form/FormStore.js +1 -1
  213. package/dist/esm/stores/form/FormStore.js.map +1 -1
  214. package/dist/esm/stores/form/URLSearchParamsBuilder.js.map +1 -1
  215. package/dist/esm/stores/form/createFormStore.js.map +1 -1
  216. package/dist/esm/stores/form/getDefaultValuesFromQueryString.js.map +1 -1
  217. package/dist/esm/stores/form/useFieldActions.js.map +1 -1
  218. package/dist/esm/stores/form/useFieldValues.js.map +1 -1
  219. package/dist/esm/stores/form/useFormRef.js.map +1 -1
  220. package/dist/esm/stores/form/useFormStore.js +2 -2
  221. package/dist/esm/stores/form/useFormStore.js.map +1 -1
  222. package/dist/esm/stores/header/useHeaderStore.js +3 -3
  223. package/dist/esm/stores/header/useHeaderStore.js.map +1 -1
  224. package/dist/esm/stores/inputMode/useInputModeStore.js.map +1 -1
  225. package/dist/esm/stores/navigationTabs/useNavigationTabLabel.js +22 -0
  226. package/dist/esm/stores/navigationTabs/useNavigationTabLabel.js.map +1 -0
  227. package/dist/esm/stores/navigationTabs/useNavigationTabsStore.js +62 -0
  228. package/dist/esm/stores/navigationTabs/useNavigationTabsStore.js.map +1 -0
  229. package/dist/esm/stores/navigationTabs/utils.js +92 -0
  230. package/dist/esm/stores/navigationTabs/utils.js.map +1 -0
  231. package/dist/esm/stores/pinnedTokens/PinnedTokensStore.js +3 -3
  232. package/dist/esm/stores/pinnedTokens/PinnedTokensStore.js.map +1 -1
  233. package/dist/esm/stores/pinnedTokens/createPinnedTokensStore.js.map +1 -1
  234. package/dist/esm/stores/routes/RouteExecutionStore.js +3 -3
  235. package/dist/esm/stores/routes/RouteExecutionStore.js.map +1 -1
  236. package/dist/esm/stores/routes/createRouteExecutionStore.js.map +1 -1
  237. package/dist/esm/stores/routes/useIntermediateRoutesStore.js.map +1 -1
  238. package/dist/esm/stores/routes/useRouteExecutionIndicator.js.map +1 -1
  239. package/dist/esm/stores/routes/utils.js.map +1 -1
  240. package/dist/esm/stores/settings/SettingsStore.js +3 -3
  241. package/dist/esm/stores/settings/SettingsStore.js.map +1 -1
  242. package/dist/esm/stores/settings/createSettingsStore.js +122 -96
  243. package/dist/esm/stores/settings/createSettingsStore.js.map +1 -1
  244. package/dist/esm/stores/settings/types.d.ts +0 -2
  245. package/dist/esm/stores/settings/types.d.ts.map +1 -1
  246. package/dist/esm/stores/settings/types.js.map +1 -1
  247. package/dist/esm/stores/settings/useSettingsActions.js.map +1 -1
  248. package/dist/esm/themes/createTheme.js.map +1 -1
  249. package/dist/esm/themes/utils.js.map +1 -1
  250. package/dist/esm/types/widget.d.ts +19 -2
  251. package/dist/esm/types/widget.d.ts.map +1 -1
  252. package/dist/esm/types/widget.js.map +1 -1
  253. package/dist/esm/utils/compactNumberFormatter.js.map +1 -1
  254. package/dist/esm/utils/converters.js.map +1 -1
  255. package/dist/esm/utils/deepEqual.js.map +1 -1
  256. package/dist/esm/utils/fees.js.map +1 -1
  257. package/dist/esm/utils/format.js.map +1 -1
  258. package/dist/esm/utils/getActionMessage.js.map +1 -1
  259. package/dist/esm/utils/getErrorMessage.js.map +1 -1
  260. package/dist/esm/utils/item.js.map +1 -1
  261. package/dist/esm/utils/{variant.js → mode.js} +2 -2
  262. package/dist/esm/utils/mode.js.map +1 -0
  263. package/dist/esm/utils/prepareActions.js +1 -1
  264. package/dist/esm/utils/prepareActions.js.map +1 -1
  265. package/dist/esm/utils/timer.js.map +1 -1
  266. package/dist/esm/utils/token.js +1 -1
  267. package/dist/esm/utils/token.js.map +1 -1
  268. package/dist/esm/utils/tokenList.js.map +1 -1
  269. package/package.json +11 -11
  270. package/src/App.tsx +7 -7
  271. package/src/AppDrawer.tsx +77 -78
  272. package/src/AppDrawerContext.ts +2 -2
  273. package/src/components/BaseTransactionButton/BaseTransactionButton.tsx +1 -0
  274. package/src/components/BottomSheet/BottomSheet.tsx +56 -52
  275. package/src/components/Header/CloseDrawerButton.tsx +5 -1
  276. package/src/components/Header/Header.tsx +20 -18
  277. package/src/components/Header/HeaderNavigationTabs.tsx +25 -0
  278. package/src/components/Header/HeaderTabs.tsx +48 -0
  279. package/src/components/Header/NavigationHeader.tsx +11 -8
  280. package/src/components/ReverseTokensButton/ReverseTokensButton.tsx +4 -1
  281. package/src/components/Skeleton/WidgetSkeleton.tsx +1 -1
  282. package/src/components/Tabs/NavigationTabs.tsx +3 -0
  283. package/src/components/TokenList/TokenDetailsSheet.tsx +9 -7
  284. package/src/components/TokenList/TokenDetailsSheetContent.tsx +176 -177
  285. package/src/components/TokenList/useTokenSelect.ts +2 -2
  286. package/src/config/version.ts +1 -1
  287. package/src/hooks/useSwapOnly.ts +2 -5
  288. package/src/hooks/useToAddressRequirements.ts +2 -2
  289. package/src/pages/MainPage/ReviewButton.tsx +2 -2
  290. package/src/pages/SendToWallet/BookmarkAddressSheet.tsx +176 -185
  291. package/src/pages/SendToWallet/ConfirmAddressSheet.tsx +9 -6
  292. package/src/pages/SettingsPage/SettingsCard/SettingCardExpandable.tsx +58 -65
  293. package/src/pages/SettingsPage/SettingsCard/SettingsAccordian.tsx +4 -4
  294. package/src/pages/TransactionPage/ConfirmToAddressSheet.tsx +9 -6
  295. package/src/pages/TransactionPage/ExchangeRateBottomSheet.tsx +53 -58
  296. package/src/pages/TransactionPage/TokenValueBottomSheet.tsx +24 -21
  297. package/src/pages/TransactionPage/TransactionExecutionContent.tsx +8 -6
  298. package/src/providers/QueryClientProvider.tsx +2 -2
  299. package/src/providers/SDKClientProvider.tsx +3 -7
  300. package/src/providers/WidgetProvider/WidgetProvider.tsx +6 -7
  301. package/src/stores/StoreProvider.tsx +3 -10
  302. package/src/stores/bookmarks/BookmarkStore.tsx +4 -4
  303. package/src/stores/chains/ChainOrderStore.tsx +4 -4
  304. package/src/stores/form/FormStore.tsx +2 -2
  305. package/src/stores/form/useFormStore.ts +2 -2
  306. package/src/stores/header/useHeaderStore.tsx +3 -5
  307. package/src/stores/navigationTabs/types.ts +27 -0
  308. package/src/stores/navigationTabs/useNavigationTabLabel.ts +28 -0
  309. package/src/stores/navigationTabs/useNavigationTabsStore.tsx +108 -0
  310. package/src/stores/navigationTabs/utils.ts +134 -0
  311. package/src/stores/pinnedTokens/PinnedTokensStore.tsx +4 -4
  312. package/src/stores/routes/RouteExecutionStore.tsx +4 -4
  313. package/src/stores/settings/SettingsStore.tsx +4 -4
  314. package/src/stores/settings/createSettingsStore.ts +48 -12
  315. package/src/stores/settings/types.ts +1 -16
  316. package/src/types/widget.ts +31 -1
  317. package/dist/esm/components/Header/SplitNavigationTabs.js +0 -33
  318. package/dist/esm/components/Header/SplitNavigationTabs.js.map +0 -1
  319. package/dist/esm/stores/settings/useSplitModeStore.js +0 -36
  320. package/dist/esm/stores/settings/useSplitModeStore.js.map +0 -1
  321. package/dist/esm/utils/variant.js.map +0 -1
  322. package/src/components/Header/SplitNavigationTabs.tsx +0 -32
  323. package/src/stores/settings/useSplitModeStore.tsx +0 -58
  324. /package/src/utils/{variant.ts → mode.ts} +0 -0
@@ -1,13 +1,7 @@
1
1
  import type { ExchangeRateUpdateParams } from '@lifi/sdk'
2
2
  import { Box, Button, Typography } from '@mui/material'
3
- import type { ForwardRefExoticComponent, RefAttributes, RefObject } from 'react'
4
- import {
5
- forwardRef,
6
- useCallback,
7
- useImperativeHandle,
8
- useRef,
9
- useState,
10
- } from 'react'
3
+ import type { JSX, Ref } from 'react'
4
+ import { useCallback, useImperativeHandle, useRef, useState } from 'react'
11
5
  import { useTranslation } from 'react-i18next'
12
6
  import { BottomSheet } from '../../components/BottomSheet/BottomSheet.js'
13
7
  import type { BottomSheetBase } from '../../components/BottomSheet/types.js'
@@ -28,62 +22,63 @@ interface ExchangeRateBottomSheetProps {
28
22
  onCancel?(): void
29
23
  }
30
24
 
31
- export const ExchangeRateBottomSheet: ForwardRefExoticComponent<
32
- ExchangeRateBottomSheetProps & RefAttributes<ExchangeRateBottomSheetBase>
33
- > = forwardRef<ExchangeRateBottomSheetBase, ExchangeRateBottomSheetProps>(
34
- ({ onContinue, onCancel }, ref) => {
35
- const [data, setData] = useState<ExchangeRateUpdateParams>()
36
- const bottomSheetRef = useRef<BottomSheetBase>(null)
37
- const resolverRef = useRef<(value: boolean) => void>(null)
25
+ export const ExchangeRateBottomSheet = ({
26
+ onContinue,
27
+ onCancel,
28
+ ref,
29
+ }: ExchangeRateBottomSheetProps & {
30
+ ref?: Ref<ExchangeRateBottomSheetBase>
31
+ }): JSX.Element => {
32
+ const [data, setData] = useState<ExchangeRateUpdateParams>()
33
+ const bottomSheetRef = useRef<BottomSheetBase>(null)
34
+ const resolverRef = useRef<(value: boolean) => void>(null)
38
35
 
39
- const handleContinue = () => {
40
- ;(ref as RefObject<ExchangeRateBottomSheetBase>).current?.close(true)
41
- onContinue?.()
36
+ const close = useCallback((value = false, bottomSheetClose = true) => {
37
+ resolverRef.current?.(value)
38
+ if (bottomSheetClose) {
39
+ bottomSheetRef.current?.close()
42
40
  }
41
+ }, [])
43
42
 
44
- const handleCancel = useCallback(() => {
45
- ;(ref as RefObject<ExchangeRateBottomSheetBase>).current?.close(false)
46
- onCancel?.()
47
- }, [onCancel, ref])
43
+ const handleContinue = useCallback(() => {
44
+ close(true)
45
+ onContinue?.()
46
+ }, [close, onContinue])
48
47
 
49
- const handleClose = useCallback(() => {
50
- ;(ref as RefObject<ExchangeRateBottomSheetBase>).current?.close(
51
- false,
52
- false
53
- )
54
- onCancel?.()
55
- }, [onCancel, ref])
48
+ const handleCancel = useCallback(() => {
49
+ close(false)
50
+ onCancel?.()
51
+ }, [close, onCancel])
56
52
 
57
- useImperativeHandle(
58
- ref,
59
- () => ({
60
- isOpen: () => bottomSheetRef.current?.isOpen(),
61
- open: (resolver, data) => {
62
- setData(data)
63
- resolverRef.current = resolver
64
- bottomSheetRef.current?.open()
65
- },
66
- close: (value = false, bottomSheetClose = true) => {
67
- resolverRef.current?.(value)
68
- if (bottomSheetClose) {
69
- bottomSheetRef.current?.close()
70
- }
71
- },
72
- }),
73
- []
74
- )
53
+ const handleClose = useCallback(() => {
54
+ close(false, false)
55
+ onCancel?.()
56
+ }, [close, onCancel])
75
57
 
76
- return (
77
- <BottomSheet ref={bottomSheetRef} onClose={handleClose}>
78
- <ExchangeRateBottomSheetContent
79
- data={data}
80
- onContinue={handleContinue}
81
- onCancel={handleCancel}
82
- />
83
- </BottomSheet>
84
- )
85
- }
86
- )
58
+ useImperativeHandle(
59
+ ref,
60
+ () => ({
61
+ isOpen: () => bottomSheetRef.current?.isOpen(),
62
+ open: (resolver, data) => {
63
+ setData(data)
64
+ resolverRef.current = resolver
65
+ bottomSheetRef.current?.open()
66
+ },
67
+ close,
68
+ }),
69
+ [close]
70
+ )
71
+
72
+ return (
73
+ <BottomSheet ref={bottomSheetRef} onClose={handleClose}>
74
+ <ExchangeRateBottomSheetContent
75
+ data={data}
76
+ onContinue={handleContinue}
77
+ onCancel={handleCancel}
78
+ />
79
+ </BottomSheet>
80
+ )
81
+ }
87
82
 
88
83
  const ExchangeRateBottomSheetContent: React.FC<
89
84
  ExchangeRateBottomSheetProps
@@ -1,7 +1,7 @@
1
1
  import type { Route } from '@lifi/sdk'
2
2
  import { Button, Checkbox, FormControlLabel } from '@mui/material'
3
- import type { ForwardRefExoticComponent, RefAttributes, RefObject } from 'react'
4
- import { forwardRef, useRef, useState } from 'react'
3
+ import type { JSX, Ref, RefObject } from 'react'
4
+ import { useRef, useState } from 'react'
5
5
  import { useTranslation } from 'react-i18next'
6
6
  import { BottomSheet } from '../../components/BottomSheet/BottomSheet.js'
7
7
  import type { BottomSheetBase } from '../../components/BottomSheet/types.js'
@@ -27,26 +27,29 @@ interface TokenValueBottomSheetProps {
27
27
  onCancel?(): void
28
28
  }
29
29
 
30
- export const TokenValueBottomSheet: ForwardRefExoticComponent<
31
- TokenValueBottomSheetProps & RefAttributes<BottomSheetBase>
32
- > = forwardRef<BottomSheetBase, TokenValueBottomSheetProps>(
33
- ({ route, onContinue, onCancel }, ref) => {
34
- const handleCancel = () => {
35
- ;(ref as RefObject<BottomSheetBase>).current?.close()
36
- onCancel?.()
37
- }
38
-
39
- return (
40
- <BottomSheet ref={ref} onClose={onCancel}>
41
- <TokenValueBottomSheetContent
42
- route={route}
43
- onContinue={onContinue}
44
- onCancel={handleCancel}
45
- />
46
- </BottomSheet>
47
- )
30
+ export const TokenValueBottomSheet = ({
31
+ route,
32
+ onContinue,
33
+ onCancel,
34
+ ref,
35
+ }: TokenValueBottomSheetProps & {
36
+ ref?: Ref<BottomSheetBase>
37
+ }): JSX.Element => {
38
+ const handleCancel = () => {
39
+ ;(ref as RefObject<BottomSheetBase>).current?.close()
40
+ onCancel?.()
48
41
  }
49
- )
42
+
43
+ return (
44
+ <BottomSheet ref={ref} onClose={onCancel}>
45
+ <TokenValueBottomSheetContent
46
+ route={route}
47
+ onContinue={onContinue}
48
+ onCancel={handleCancel}
49
+ />
50
+ </BottomSheet>
51
+ )
52
+ }
50
53
 
51
54
  const TokenValueBottomSheetContent: React.FC<TokenValueBottomSheetProps> = ({
52
55
  route,
@@ -76,13 +76,15 @@ export const TransactionExecutionContent: React.FC<
76
76
  iconSlot={iconSlot}
77
77
  footerSlot={footerSlot}
78
78
  />
79
- <WarningMessages route={route} allowInteraction />
80
79
  {status === RouteExecutionStatus.Failed ? (
81
- <TransactionFailedButtons
82
- route={route}
83
- restartRoute={restartRoute}
84
- deleteRoute={deleteRoute}
85
- />
80
+ <>
81
+ <WarningMessages route={route} allowInteraction />
82
+ <TransactionFailedButtons
83
+ route={route}
84
+ restartRoute={restartRoute}
85
+ deleteRoute={deleteRoute}
86
+ />
87
+ </>
86
88
  ) : isDone ? (
87
89
  <TransactionDoneButtons route={route} status={status} />
88
90
  ) : null}
@@ -3,13 +3,13 @@ import {
3
3
  QueryClientProvider as TanstackQueryClientProvider,
4
4
  } from '@tanstack/react-query'
5
5
  import type { PropsWithChildren } from 'react'
6
- import { useContext } from 'react'
6
+ import { use } from 'react'
7
7
  import { queryClient } from '../config/queryClient.js'
8
8
 
9
9
  export const QueryClientProvider: React.FC<PropsWithChildren> = ({
10
10
  children,
11
11
  }) => {
12
- const existingQueryClient = useContext(TanstackQueryClientContext)
12
+ const existingQueryClient = use(TanstackQueryClientContext)
13
13
  return existingQueryClient ? (
14
14
  children
15
15
  ) : (
@@ -3,7 +3,7 @@ import {
3
3
  createContext,
4
4
  type JSX,
5
5
  type PropsWithChildren,
6
- useContext,
6
+ use,
7
7
  useMemo,
8
8
  } from 'react'
9
9
  import { version } from '../config/version.js'
@@ -11,7 +11,7 @@ import { useWidgetConfig } from './WidgetProvider/WidgetProvider.js'
11
11
 
12
12
  const SDKClientContext = createContext<SDKClient>({} as SDKClient)
13
13
 
14
- export const useSDKClient = (): SDKClient => useContext(SDKClientContext)
14
+ export const useSDKClient = (): SDKClient => use(SDKClientContext)
15
15
 
16
16
  export const SDKClientProvider = ({
17
17
  children,
@@ -51,9 +51,5 @@ export const SDKClientProvider = ({
51
51
  slippage,
52
52
  ])
53
53
 
54
- return (
55
- <SDKClientContext.Provider value={client}>
56
- {children}
57
- </SDKClientContext.Provider>
58
- )
54
+ return <SDKClientContext value={client}>{children}</SDKClientContext>
59
55
  }
@@ -1,4 +1,5 @@
1
- import { createContext, useContext, useId, useMemo } from 'react'
1
+ import type { Context } from 'react'
2
+ import { createContext, use, useId, useMemo } from 'react'
2
3
  import { useSettingsActions } from '../../stores/settings/useSettingsActions.js'
3
4
  import type { WidgetContextProps, WidgetProviderProps } from './types.js'
4
5
 
@@ -7,10 +8,10 @@ const initialContext: WidgetContextProps = {
7
8
  integrator: '',
8
9
  }
9
10
 
10
- const WidgetContext = createContext<WidgetContextProps>(initialContext)
11
+ export const WidgetContext: Context<WidgetContextProps> =
12
+ createContext<WidgetContextProps>(initialContext)
11
13
 
12
- export const useWidgetConfig = (): WidgetContextProps =>
13
- useContext(WidgetContext)
14
+ export const useWidgetConfig = (): WidgetContextProps => use(WidgetContext)
14
15
 
15
16
  export const WidgetProvider: React.FC<
16
17
  React.PropsWithChildren<WidgetProviderProps>
@@ -43,7 +44,5 @@ export const WidgetProvider: React.FC<
43
44
  }
44
45
  }
45
46
  }, [elementId, widgetConfig, setDefaultSettings])
46
- return (
47
- <WidgetContext.Provider value={value}>{children}</WidgetContext.Provider>
48
- )
47
+ return <WidgetContext value={value}>{children}</WidgetContext>
49
48
  }
@@ -1,13 +1,12 @@
1
1
  import type { PropsWithChildren } from 'react'
2
2
  import type { WidgetConfigProps } from '../types/widget.js'
3
- import { getSplitMode } from '../utils/variant.js'
4
3
  import { BookmarkStoreProvider } from './bookmarks/BookmarkStore.js'
5
4
  import { ChainOrderStoreProvider } from './chains/ChainOrderStore.js'
6
5
  import { FormStoreProvider } from './form/FormStore.js'
7
6
  import { HeaderStoreProvider } from './header/useHeaderStore.js'
7
+ import { NavigationTabsStoreProvider } from './navigationTabs/useNavigationTabsStore.js'
8
8
  import { PinnedTokensStoreProvider } from './pinnedTokens/PinnedTokensStore.js'
9
9
  import { RouteExecutionStoreProvider } from './routes/RouteExecutionStore.js'
10
- import { SplitModeStoreProvider } from './settings/useSplitModeStore.js'
11
10
 
12
11
  export const StoreProvider: React.FC<PropsWithChildren<WidgetConfigProps>> = ({
13
12
  children,
@@ -15,13 +14,7 @@ export const StoreProvider: React.FC<PropsWithChildren<WidgetConfigProps>> = ({
15
14
  formRef,
16
15
  }) => {
17
16
  return (
18
- <SplitModeStoreProvider
19
- state={
20
- config.mode === 'split'
21
- ? getSplitMode(config.modeOptions?.split)
22
- : undefined
23
- }
24
- >
17
+ <NavigationTabsStoreProvider config={config}>
25
18
  <HeaderStoreProvider namePrefix={config?.keyPrefix}>
26
19
  <BookmarkStoreProvider namePrefix={config?.keyPrefix}>
27
20
  <PinnedTokensStoreProvider namePrefix={config?.keyPrefix}>
@@ -35,6 +28,6 @@ export const StoreProvider: React.FC<PropsWithChildren<WidgetConfigProps>> = ({
35
28
  </PinnedTokensStoreProvider>
36
29
  </BookmarkStoreProvider>
37
30
  </HeaderStoreProvider>
38
- </SplitModeStoreProvider>
31
+ </NavigationTabsStoreProvider>
39
32
  )
40
33
  }
@@ -1,4 +1,4 @@
1
- import { createContext, useContext, useRef } from 'react'
1
+ import { createContext, use, useRef } from 'react'
2
2
  import { useShallow } from 'zustand/shallow'
3
3
  import { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'
4
4
  import type { PersistStoreProviderProps } from '../types.js'
@@ -19,14 +19,14 @@ export const BookmarkStoreProvider: React.FC<PersistStoreProviderProps> = ({
19
19
  }
20
20
 
21
21
  return (
22
- <BookmarkStoreContext.Provider value={storeRef.current}>
22
+ <BookmarkStoreContext value={storeRef.current}>
23
23
  {children}
24
- </BookmarkStoreContext.Provider>
24
+ </BookmarkStoreContext>
25
25
  )
26
26
  }
27
27
 
28
28
  export function useBookmarkStore<T>(selector: (store: BookmarkState) => T): T {
29
- const useStore = useContext(BookmarkStoreContext)
29
+ const useStore = use(BookmarkStoreContext)
30
30
 
31
31
  if (!useStore) {
32
32
  throw new Error(
@@ -1,4 +1,4 @@
1
- import { createContext, type JSX, useContext, useEffect, useRef } from 'react'
1
+ import { createContext, type JSX, use, useEffect, useRef } from 'react'
2
2
  import type { StoreApi, UseBoundStore } from 'zustand'
3
3
  import { useShallow } from 'zustand/shallow'
4
4
  import { useChains } from '../../hooks/useChains.js'
@@ -141,14 +141,14 @@ export function ChainOrderStoreProvider({
141
141
  ])
142
142
 
143
143
  return (
144
- <ChainOrderStoreContext.Provider value={storeRef.current}>
144
+ <ChainOrderStoreContext value={storeRef.current}>
145
145
  {children}
146
- </ChainOrderStoreContext.Provider>
146
+ </ChainOrderStoreContext>
147
147
  )
148
148
  }
149
149
 
150
150
  function useChainOrderStoreContext() {
151
- const useStore = useContext(ChainOrderStoreContext)
151
+ const useStore = use(ChainOrderStoreContext)
152
152
  if (!useStore) {
153
153
  throw new Error(
154
154
  `You forgot to wrap your component in <${ChainOrderStoreProvider.name}>.`
@@ -125,9 +125,9 @@ export const FormStoreProvider: React.FC<FormStoreProviderProps> = ({
125
125
  useFormRef(storeRef.current, formRef)
126
126
 
127
127
  return (
128
- <FormStoreContext.Provider value={storeRef.current}>
128
+ <FormStoreContext value={storeRef.current}>
129
129
  {children}
130
130
  <FormUpdater reactiveFormValues={reactiveFormValues} />
131
- </FormStoreContext.Provider>
131
+ </FormStoreContext>
132
132
  )
133
133
  }
@@ -1,10 +1,10 @@
1
- import { useContext } from 'react'
1
+ import { use } from 'react'
2
2
  import { useShallow } from 'zustand/shallow'
3
3
  import { FormStoreContext } from './FormStoreContext.js'
4
4
  import type { FormValuesState } from './types.js'
5
5
 
6
6
  export function useFormStore<T>(selector: (state: FormValuesState) => T): T {
7
- const useStore = useContext(FormStoreContext)
7
+ const useStore = use(FormStoreContext)
8
8
 
9
9
  if (!useStore) {
10
10
  throw new Error('You forgot to wrap your component in <FormStoreProvider>.')
@@ -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 type { PersistStoreProviderProps } from '../types.js'
@@ -14,14 +14,12 @@ export function HeaderStoreProvider({
14
14
  storeRef.current = createHeaderStore()
15
15
  }
16
16
  return (
17
- <HeaderStoreContext.Provider value={storeRef.current}>
18
- {children}
19
- </HeaderStoreContext.Provider>
17
+ <HeaderStoreContext value={storeRef.current}>{children}</HeaderStoreContext>
20
18
  )
21
19
  }
22
20
 
23
21
  function useHeaderStoreContext() {
24
- const useStore = useContext(HeaderStoreContext)
22
+ const useStore = use(HeaderStoreContext)
25
23
  if (!useStore) {
26
24
  throw new Error(
27
25
  `You forgot to wrap your component in <${HeaderStoreProvider.name}>.`
@@ -0,0 +1,27 @@
1
+ import type { StoreApi, UseBoundStore } from 'zustand'
2
+ import type {
3
+ ModeOptions,
4
+ NavigationTabKey,
5
+ WidgetMode,
6
+ WidgetVariant,
7
+ } from '../../types/widget.js'
8
+
9
+ export interface NavigationTab {
10
+ /** Stable, language-independent identity; resolved to a label via a hook. */
11
+ key: NavigationTabKey
12
+ /** When omitted, the tab inherits `config.variant`. */
13
+ variant?: WidgetVariant
14
+ /** When omitted, the tab inherits `config.mode`. */
15
+ mode?: WidgetMode
16
+ modeOptions?: ModeOptions
17
+ }
18
+
19
+ export interface NavigationTabsState {
20
+ /** Tabs to render in the header, resolved from config (empty when none). */
21
+ tabs: NavigationTabKey[]
22
+ /** Key of the active tab, or `undefined` when there are no tabs. */
23
+ activeTab?: NavigationTabKey
24
+ setActiveTab(activeTab: NavigationTabKey): void
25
+ }
26
+
27
+ export type NavigationTabsStore = UseBoundStore<StoreApi<NavigationTabsState>>
@@ -0,0 +1,28 @@
1
+ import { useTranslation } from 'react-i18next'
2
+ import type { NavigationTabKey } from '../../types/widget.js'
3
+
4
+ export const useNavigationTabLabel = (): ((
5
+ key: NavigationTabKey
6
+ ) => string) => {
7
+ const { t } = useTranslation()
8
+ return (key: NavigationTabKey) => {
9
+ switch (key) {
10
+ case 'default':
11
+ return t('header.swapAndBridge')
12
+ case 'private':
13
+ return t('header.private')
14
+ case 'refuel':
15
+ return t('header.gas')
16
+ case 'swap':
17
+ case 'swap-advanced':
18
+ return t('header.swap')
19
+ case 'bridge':
20
+ case 'bridge-advanced':
21
+ return t('header.bridge')
22
+ case 'limit':
23
+ return t('header.limit')
24
+ default:
25
+ return t('header.swapAndBridge')
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,108 @@
1
+ import {
2
+ createContext,
3
+ type JSX,
4
+ type PropsWithChildren,
5
+ use,
6
+ useMemo,
7
+ useRef,
8
+ } from 'react'
9
+ import { create } from 'zustand'
10
+ import { useShallow } from 'zustand/shallow'
11
+ import {
12
+ useWidgetConfig,
13
+ WidgetContext,
14
+ } from '../../providers/WidgetProvider/WidgetProvider.js'
15
+ import type {
16
+ NavigationTabKey,
17
+ SplitMode,
18
+ WidgetConfig,
19
+ } from '../../types/widget.js'
20
+ import type { NavigationTabsState, NavigationTabsStore } from './types.js'
21
+ import {
22
+ getInitialActiveTab,
23
+ getNavigationTabKeys,
24
+ getTabMode,
25
+ getTabModeOptions,
26
+ getTabSplitMode,
27
+ getTabVariant,
28
+ } from './utils.js'
29
+
30
+ const NavigationTabsStoreContext = createContext<NavigationTabsStore | null>(
31
+ null
32
+ )
33
+
34
+ export function NavigationTabsStoreProvider({
35
+ children,
36
+ config,
37
+ }: PropsWithChildren<{ config: WidgetConfig }>): JSX.Element {
38
+ const tabs = getNavigationTabKeys(config)
39
+ const initialActiveTab = getInitialActiveTab(config)
40
+ // Recreate (re-seeding tabs + active tab) only when the config-driven inputs
41
+ // change — not on runtime tab clicks, which must be preserved.
42
+ const signature = `${tabs.join(',')}|${initialActiveTab ?? ''}`
43
+ const storeRef = useRef<NavigationTabsStore>(null)
44
+ const signatureRef = useRef(signature)
45
+ let store = storeRef.current
46
+ if (!store || signatureRef.current !== signature) {
47
+ store = createNavigationTabsStore(tabs, initialActiveTab)
48
+ storeRef.current = store
49
+ signatureRef.current = signature
50
+ }
51
+
52
+ // Override the widget config with the active tab's mode, variant and
53
+ // modeOptions (each falling back to the config), so the rest of the widget
54
+ // reads tab-driven config transparently. No-op when there is no active tab.
55
+ const widgetConfig = useWidgetConfig()
56
+ const activeTab = store((state) => state.activeTab)
57
+ const tabConfig = useMemo(() => {
58
+ if (!activeTab) {
59
+ return widgetConfig
60
+ }
61
+ return {
62
+ ...widgetConfig,
63
+ mode: getTabMode(widgetConfig, activeTab),
64
+ variant: getTabVariant(widgetConfig, activeTab),
65
+ modeOptions: getTabModeOptions(widgetConfig, activeTab),
66
+ }
67
+ }, [widgetConfig, activeTab])
68
+
69
+ return (
70
+ <NavigationTabsStoreContext value={store}>
71
+ <WidgetContext value={tabConfig}>{children}</WidgetContext>
72
+ </NavigationTabsStoreContext>
73
+ )
74
+ }
75
+
76
+ function useNavigationTabsStoreContext(): NavigationTabsStore {
77
+ const useStore = use(NavigationTabsStoreContext)
78
+ if (!useStore) {
79
+ throw new Error(
80
+ `You forgot to wrap your component in <${NavigationTabsStoreProvider.name}>.`
81
+ )
82
+ }
83
+ return useStore
84
+ }
85
+
86
+ export function useNavigationTabsStore<T>(
87
+ selector: (state: NavigationTabsState) => T
88
+ ): T {
89
+ const useStore = useNavigationTabsStoreContext()
90
+ return useStore(useShallow(selector))
91
+ }
92
+
93
+ /** Effective split mode derived from the active tab. */
94
+ export function useSplitMode(): SplitMode | undefined {
95
+ return useNavigationTabsStore((state) => getTabSplitMode(state.activeTab))
96
+ }
97
+
98
+ const createNavigationTabsStore = (
99
+ tabs: NavigationTabKey[],
100
+ initialActiveTab?: NavigationTabKey
101
+ ): NavigationTabsStore =>
102
+ create<NavigationTabsState>((set) => ({
103
+ tabs,
104
+ activeTab: initialActiveTab,
105
+ setActiveTab(activeTab) {
106
+ set({ activeTab })
107
+ },
108
+ }))