@lifi/widget 1.16.1 → 1.17.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 (119) hide show
  1. package/AppProvider.js +1 -1
  2. package/README.md +1 -1
  3. package/cjs/AppProvider.js +1 -1
  4. package/cjs/components/ChainSelect/ChainSelect.style.js +4 -4
  5. package/cjs/components/ChainSelect/useChainSelect.d.ts +2 -2
  6. package/cjs/components/GasSufficiencyMessage/GasSufficiencyMessage.js +3 -3
  7. package/cjs/components/Header/useHeaderActionStore.d.ts +0 -2
  8. package/cjs/components/Header/useHeaderActionStore.js +1 -5
  9. package/cjs/components/SwapButton/SwapButton.js +3 -23
  10. package/cjs/components/TokenList/TokenList.js +1 -1
  11. package/cjs/components/TokenList/TokenList.style.js +4 -3
  12. package/cjs/components/TokenList/TokenListItem.js +1 -1
  13. package/cjs/components/TokenList/TokenNotFound.d.ts +2 -1
  14. package/cjs/components/TokenList/TokenNotFound.js +12 -2
  15. package/cjs/components/TokenList/types.d.ts +2 -2
  16. package/cjs/config/version.d.ts +1 -1
  17. package/cjs/config/version.js +1 -1
  18. package/cjs/hooks/useChains.js +21 -8
  19. package/cjs/hooks/useFeaturedTokens.d.ts +1 -1
  20. package/cjs/hooks/useFeaturedTokens.js +5 -2
  21. package/cjs/hooks/useGasSufficiency.d.ts +1 -1
  22. package/cjs/hooks/useGasSufficiency.js +30 -21
  23. package/cjs/hooks/useToken.d.ts +0 -1
  24. package/cjs/hooks/useToken.js +1 -2
  25. package/cjs/hooks/useTokenBalances.d.ts +1 -2
  26. package/cjs/hooks/useTokenBalances.js +1 -2
  27. package/cjs/hooks/useTokens.d.ts +1 -2
  28. package/cjs/hooks/useTokens.js +30 -8
  29. package/cjs/hooks/useTools.js +8 -3
  30. package/cjs/i18n/en/translation.json +2 -3
  31. package/cjs/i18n/index.d.ts +1 -2
  32. package/cjs/pages/MainPage/MainSwapButton.js +1 -1
  33. package/cjs/pages/SettingsPage/AdvancedPreferences.js +1 -1
  34. package/cjs/pages/SettingsPage/GasPriceSelect.js +1 -1
  35. package/cjs/pages/SettingsPage/RoutePrioritySelect.js +1 -1
  36. package/cjs/pages/SettingsPage/ShowDestinationWallet.js +1 -1
  37. package/cjs/pages/SettingsPage/SlippageInput.js +1 -1
  38. package/cjs/pages/SwapDetailsPage/SwapDetailsPage.js +2 -3
  39. package/cjs/pages/SwapHistoryPage/SwapHistoryPage.js +2 -3
  40. package/cjs/pages/SwapPage/SwapPage.js +11 -2
  41. package/cjs/pages/SwapRoutesPage/SwapRoutesPage.js +4 -3
  42. package/cjs/providers/SwapFormProvider/SwapFormProvider.js +4 -58
  43. package/cjs/providers/SwapFormProvider/types.d.ts +5 -5
  44. package/cjs/providers/WalletProvider/WalletProvider.js +57 -1
  45. package/cjs/providers/WidgetProvider/index.d.ts +1 -0
  46. package/cjs/providers/WidgetProvider/index.js +1 -0
  47. package/cjs/providers/WidgetProvider/utils.d.ts +4 -0
  48. package/cjs/providers/WidgetProvider/utils.js +13 -0
  49. package/cjs/stores/chains/index.d.ts +0 -1
  50. package/cjs/stores/chains/index.js +0 -1
  51. package/cjs/stores/chains/types.d.ts +1 -1
  52. package/cjs/stores/chains/useChainOrderStore.js +17 -14
  53. package/cjs/stores/settings/index.d.ts +0 -1
  54. package/cjs/stores/settings/index.js +0 -1
  55. package/cjs/stores/settings/useAppearance.js +3 -1
  56. package/cjs/types/widget.d.ts +29 -22
  57. package/components/ChainSelect/ChainSelect.style.js +4 -4
  58. package/components/ChainSelect/useChainSelect.d.ts +2 -2
  59. package/components/GasSufficiencyMessage/GasSufficiencyMessage.js +3 -3
  60. package/components/Header/useHeaderActionStore.d.ts +0 -2
  61. package/components/Header/useHeaderActionStore.js +0 -3
  62. package/components/SwapButton/SwapButton.js +5 -25
  63. package/components/TokenList/TokenList.js +1 -1
  64. package/components/TokenList/TokenList.style.js +4 -3
  65. package/components/TokenList/TokenListItem.js +1 -1
  66. package/components/TokenList/TokenNotFound.d.ts +2 -1
  67. package/components/TokenList/TokenNotFound.js +12 -2
  68. package/components/TokenList/types.d.ts +2 -2
  69. package/config/version.d.ts +1 -1
  70. package/config/version.js +1 -1
  71. package/hooks/useChains.js +23 -10
  72. package/hooks/useFeaturedTokens.d.ts +1 -1
  73. package/hooks/useFeaturedTokens.js +5 -2
  74. package/hooks/useGasSufficiency.d.ts +1 -1
  75. package/hooks/useGasSufficiency.js +32 -23
  76. package/hooks/useToken.d.ts +0 -1
  77. package/hooks/useToken.js +1 -2
  78. package/hooks/useTokenBalances.d.ts +1 -2
  79. package/hooks/useTokenBalances.js +1 -2
  80. package/hooks/useTokens.d.ts +1 -2
  81. package/hooks/useTokens.js +31 -9
  82. package/hooks/useTools.js +9 -4
  83. package/i18n/en/translation.json +2 -3
  84. package/i18n/index.d.ts +1 -2
  85. package/package.json +4 -4
  86. package/pages/MainPage/MainSwapButton.js +1 -1
  87. package/pages/SettingsPage/AdvancedPreferences.js +2 -2
  88. package/pages/SettingsPage/GasPriceSelect.js +2 -2
  89. package/pages/SettingsPage/RoutePrioritySelect.js +2 -2
  90. package/pages/SettingsPage/ShowDestinationWallet.js +2 -2
  91. package/pages/SettingsPage/SlippageInput.js +2 -2
  92. package/pages/SwapDetailsPage/SwapDetailsPage.js +3 -4
  93. package/pages/SwapHistoryPage/SwapHistoryPage.js +3 -4
  94. package/pages/SwapPage/SwapPage.js +11 -2
  95. package/pages/SwapRoutesPage/SwapRoutesPage.js +5 -4
  96. package/providers/SwapFormProvider/SwapFormProvider.js +4 -58
  97. package/providers/SwapFormProvider/types.d.ts +5 -5
  98. package/providers/WalletProvider/WalletProvider.js +58 -2
  99. package/providers/WidgetProvider/index.d.ts +1 -0
  100. package/providers/WidgetProvider/index.js +1 -0
  101. package/providers/WidgetProvider/utils.d.ts +4 -0
  102. package/providers/WidgetProvider/utils.js +9 -0
  103. package/stores/chains/index.d.ts +0 -1
  104. package/stores/chains/index.js +0 -1
  105. package/stores/chains/types.d.ts +1 -1
  106. package/stores/chains/useChainOrderStore.js +17 -14
  107. package/stores/settings/index.d.ts +0 -1
  108. package/stores/settings/index.js +0 -1
  109. package/stores/settings/useAppearance.js +3 -1
  110. package/tsconfig.cjs.tsbuildinfo +1 -1
  111. package/types/widget.d.ts +29 -22
  112. package/cjs/stores/chains/useInitializeChainOrder.d.ts +0 -1
  113. package/cjs/stores/chains/useInitializeChainOrder.js +0 -12
  114. package/cjs/stores/settings/useSetSettings.d.ts +0 -5
  115. package/cjs/stores/settings/useSetSettings.js +0 -12
  116. package/stores/chains/useInitializeChainOrder.d.ts +0 -1
  117. package/stores/chains/useInitializeChainOrder.js +0 -5
  118. package/stores/settings/useSetSettings.d.ts +0 -5
  119. package/stores/settings/useSetSettings.js +0 -5
@@ -5,10 +5,10 @@ import { FormControl, MenuItem } from '@mui/material';
5
5
  import { useTranslation } from 'react-i18next';
6
6
  import { Card, CardTitle } from '../../components/Card';
7
7
  import { Select } from '../../components/Select';
8
- import { useSetSettings, useSettings } from '../../stores';
8
+ import { useSettings, useSettingsStore } from '../../stores';
9
9
  export const RoutePrioritySelect = () => {
10
10
  const { t } = useTranslation();
11
- const [setValue] = useSetSettings();
11
+ const setValue = useSettingsStore((state) => state.setValue);
12
12
  const { routePriority } = useSettings(['routePriority']);
13
13
  return (_jsxs(Card, { children: [_jsx(CardTitle, { children: t(`settings.routePriority`) }), _jsx(FormControl, Object.assign({ fullWidth: true }, { children: _jsx(Select, Object.assign({ MenuProps: { elevation: 2 }, value: routePriority, onChange: (event) => setValue('routePriority', event.target.value), IconComponent: KeyboardArrowDownIcon, dense: true }, { children: Orders.map((order) => {
14
14
  const tag = t(`swap.tags.${order.toUpperCase()}`);
@@ -2,10 +2,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Box, Typography } from '@mui/material';
3
3
  import { useTranslation } from 'react-i18next';
4
4
  import { Switch } from '../../components/Switch';
5
- import { useSetSettings, useSettings } from '../../stores';
5
+ import { useSettings, useSettingsStore } from '../../stores';
6
6
  export const ShowDestinationWallet = () => {
7
7
  const { t } = useTranslation();
8
- const [setValue] = useSetSettings();
8
+ const setValue = useSettingsStore((state) => state.setValue);
9
9
  const { showDestinationWallet } = useSettings(['showDestinationWallet']);
10
10
  const onChange = (_, checked) => {
11
11
  setValue('showDestinationWallet', checked);
@@ -4,12 +4,12 @@ import { useRef } from 'react';
4
4
  import { useTranslation } from 'react-i18next';
5
5
  import { Card, CardTitle } from '../../components/Card';
6
6
  import { Input } from '../../components/Input';
7
- import { useSetSettings, useSettings } from '../../stores';
7
+ import { useSettings, useSettingsStore } from '../../stores';
8
8
  import { formatSlippage } from '../../utils';
9
9
  export const SlippageInput = () => {
10
10
  const { t } = useTranslation();
11
- const [setValue] = useSetSettings();
12
11
  const { slippage } = useSettings(['slippage']);
12
+ const setValue = useSettingsStore((state) => state.setValue);
13
13
  const defaultValue = useRef(slippage);
14
14
  const handleChange = (event) => {
15
15
  const { value } = event.target;
@@ -16,7 +16,7 @@ import { useLocation } from 'react-router-dom';
16
16
  import shallow from 'zustand/shallow';
17
17
  import { Card, CardTitle } from '../../components/Card';
18
18
  import { Dialog } from '../../components/Dialog';
19
- import { useSetHeaderAction } from '../../components/Header';
19
+ import { useHeaderActionStore } from '../../components/Header';
20
20
  import { Step } from '../../components/Step';
21
21
  import { StepDivider } from '../../components/StepDivider';
22
22
  import { useNavigateBack } from '../../hooks';
@@ -26,7 +26,6 @@ export const SwapDetailsPage = () => {
26
26
  var _a, _b;
27
27
  const { t } = useTranslation();
28
28
  const { navigateBack } = useNavigateBack();
29
- const setHeaderAction = useSetHeaderAction();
30
29
  const { state } = useLocation();
31
30
  const [routeExecution, deleteRoute] = useRouteStore((store) => [store.routes[state === null || state === void 0 ? void 0 : state.routeId], store.deleteRoute], shallow);
32
31
  const [open, setOpen] = useState(false);
@@ -44,8 +43,8 @@ export const SwapDetailsPage = () => {
44
43
  yield navigator.clipboard.writeText((_c = routeExecution === null || routeExecution === void 0 ? void 0 : routeExecution.route.id) !== null && _c !== void 0 ? _c : '');
45
44
  });
46
45
  useEffect(() => {
47
- return setHeaderAction(_jsx(IconButton, Object.assign({ size: "medium", "aria-label": "settings", edge: "end", onClick: toggleDialog }, { children: _jsx(DeleteIcon, {}) })));
48
- }, [setHeaderAction, toggleDialog]);
46
+ return useHeaderActionStore.getState().setAction(_jsx(IconButton, Object.assign({ size: "medium", "aria-label": "settings", edge: "end", onClick: toggleDialog }, { children: _jsx(DeleteIcon, {}) })));
47
+ }, [toggleDialog]);
49
48
  const startedAt = new Date((_b = (_a = routeExecution === null || routeExecution === void 0 ? void 0 : routeExecution.route.steps[0].execution) === null || _a === void 0 ? void 0 : _a.process[0].startedAt) !== null && _b !== void 0 ? _b : 0);
50
49
  return (_jsxs(Container, { children: [_jsxs(Box, Object.assign({ sx: {
51
50
  display: 'flex',
@@ -4,7 +4,7 @@ import { Button, Container, DialogActions, DialogContent, DialogContentText, Dia
4
4
  import { useCallback, useEffect, useState } from 'react';
5
5
  import { useTranslation } from 'react-i18next';
6
6
  import { Dialog } from '../../components/Dialog';
7
- import { useSetHeaderAction } from '../../components/Header';
7
+ import { useHeaderActionStore } from '../../components/Header';
8
8
  import { useWallet } from '../../providers';
9
9
  import { useRouteStore } from '../../stores';
10
10
  import { useSwapHistory } from '../../stores/route';
@@ -15,14 +15,13 @@ export const SwapHistoryPage = () => {
15
15
  const { account } = useWallet();
16
16
  const swaps = useSwapHistory(account.address);
17
17
  const deleteRoutes = useRouteStore((store) => store.deleteRoutes);
18
- const setHeaderAction = useSetHeaderAction();
19
18
  const [open, setOpen] = useState(false);
20
19
  const toggleDialog = useCallback(() => {
21
20
  setOpen((open) => !open);
22
21
  }, []);
23
22
  useEffect(() => {
24
- return setHeaderAction(_jsx(IconButton, Object.assign({ size: "medium", "aria-label": "settings", edge: "end", onClick: toggleDialog }, { children: _jsx(DeleteIcon, {}) })));
25
- }, [setHeaderAction, toggleDialog]);
23
+ return useHeaderActionStore.getState().setAction(_jsx(IconButton, Object.assign({ size: "medium", "aria-label": "settings", edge: "end", onClick: toggleDialog }, { children: _jsx(DeleteIcon, {}) })));
24
+ }, [toggleDialog]);
26
25
  if (!swaps.length) {
27
26
  return _jsx(SwapHistoryEmpty, {});
28
27
  }
@@ -1,3 +1,12 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
1
10
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
11
  import { Box, Button } from '@mui/material';
3
12
  import { Fragment } from 'react';
@@ -22,7 +31,7 @@ export const SwapPage = () => {
22
31
  navigateBack();
23
32
  deleteRoute();
24
33
  };
25
- const handleSwapClick = () => {
34
+ const handleSwapClick = () => __awaiter(void 0, void 0, void 0, function* () {
26
35
  if (status === 'idle') {
27
36
  executeRoute();
28
37
  setValue(SwapFormKey.FromAmount, '');
@@ -30,7 +39,7 @@ export const SwapPage = () => {
30
39
  if (status === 'error') {
31
40
  restartRoute();
32
41
  }
33
- };
42
+ });
34
43
  // eslint-disable-next-line consistent-return
35
44
  const getSwapButtonText = () => {
36
45
  if (status === 'idle') {
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useEffect } from 'react';
3
3
  import { useLocation, useNavigate } from 'react-router-dom';
4
- import { useSetHeaderAction } from '../../components/Header';
4
+ import { useHeaderActionStore } from '../../components/Header';
5
5
  import { ProgressToNextUpdate } from '../../components/ProgressToNextUpdate';
6
6
  import { SwapRouteCard, SwapRouteCardSkeleton, SwapRouteNotFoundCard, } from '../../components/SwapRouteCard';
7
7
  import { useSwapRoutes } from '../../hooks';
@@ -11,7 +11,6 @@ import { Stack } from './SwapRoutesPage.style';
11
11
  export const SwapRoutesPage = () => {
12
12
  const navigate = useNavigate();
13
13
  const { pathname } = useLocation();
14
- const setHeaderAction = useSetHeaderAction();
15
14
  const { routes: swapRoutes, isLoading, isFetching, dataUpdatedAt, refetchTime, refetch, } = useSwapRoutes();
16
15
  const setExecutableRoute = useSetExecutableRoute();
17
16
  const handleRouteClick = (route) => {
@@ -28,8 +27,10 @@ export const SwapRoutesPage = () => {
28
27
  // eslint-disable-next-line react-hooks/exhaustive-deps
29
28
  }, []);
30
29
  useEffect(() => {
31
- return setHeaderAction(_jsx(ProgressToNextUpdate, { updatedAt: dataUpdatedAt || new Date().getTime(), timeToUpdate: refetchTime, isLoading: isFetching, onClick: () => refetch(), sx: { marginRight: -1 }, size: "medium", edge: "end" }));
32
- }, [dataUpdatedAt, isFetching, refetch, refetchTime, setHeaderAction]);
30
+ return useHeaderActionStore
31
+ .getState()
32
+ .setAction(_jsx(ProgressToNextUpdate, { updatedAt: dataUpdatedAt || new Date().getTime(), timeToUpdate: refetchTime, isLoading: isFetching, onClick: () => refetch(), sx: { marginRight: -1 }, size: "medium", edge: "end" }));
33
+ }, [dataUpdatedAt, isFetching, refetch, refetchTime]);
33
34
  const routeNotFound = !(swapRoutes === null || swapRoutes === void 0 ? void 0 : swapRoutes.length) && !isLoading && !isFetching;
34
35
  return (_jsx(Stack, Object.assign({ direction: "column", spacing: 2, flex: 1 }, { children: routeNotFound ? (_jsx(SwapRouteNotFoundCard, {})) : isLoading || isFetching ? (Array.from({ length: 3 }).map((_, index) => (_jsx(SwapRouteCardSkeleton, {}, index)))) : (swapRoutes === null || swapRoutes === void 0 ? void 0 : swapRoutes.map((route) => (_jsx(SwapRouteCard, { route: route, onClick: () => handleRouteClick(route) }, route.id)))) })));
35
36
  };
@@ -1,9 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { ChainId } from '@lifi/sdk';
3
- import { useEffect } from 'react';
4
2
  import { FormProvider, useForm } from 'react-hook-form';
5
- import { useChainOrderStore, useSetChainOrder } from '../../stores/chains';
6
- import { useWallet } from '../WalletProvider';
7
3
  import { useWidgetConfig } from '../WidgetProvider';
8
4
  import { SwapFormKey } from './types';
9
5
  export const formDefaultValues = {
@@ -12,64 +8,14 @@ export const formDefaultValues = {
12
8
  [SwapFormKey.TokenSearchFilter]: '',
13
9
  };
14
10
  export const SwapFormProvider = ({ children, }) => {
15
- const [setChain] = useSetChainOrder();
16
- const { account } = useWallet();
17
11
  const { fromChain, fromToken, fromAmount, toChain, toToken, toAddress } = useWidgetConfig();
18
12
  const methods = useForm({
19
- defaultValues: Object.assign(Object.assign({}, formDefaultValues), { fromChain: fromChain !== null && fromChain !== void 0 ? fromChain : ChainId.ETH, fromToken, fromAmount: (typeof fromAmount === 'number'
13
+ defaultValues: Object.assign(Object.assign({}, formDefaultValues), { fromChain,
14
+ fromToken, fromAmount: (typeof fromAmount === 'number'
20
15
  ? fromAmount === null || fromAmount === void 0 ? void 0 : fromAmount.toPrecision()
21
- : fromAmount) || formDefaultValues.fromAmount, toChain: toChain !== null && toChain !== void 0 ? toChain : ChainId.ETH, toToken,
16
+ : fromAmount) || formDefaultValues.fromAmount, toChain,
17
+ toToken,
22
18
  toAddress }),
23
19
  });
24
- // Set wallet chain as default if no chains are provided by config and if they were not changed during widget usage
25
- useEffect(() => {
26
- if (!account.isActive || !account.chainId) {
27
- return;
28
- }
29
- const [fromChainValue, toChainValue] = methods.getValues([
30
- SwapFormKey.FromChain,
31
- SwapFormKey.ToChain,
32
- ]);
33
- const { isDirty: isFromChainDirty } = methods.getFieldState(SwapFormKey.FromChain, methods.formState);
34
- const { isDirty: isToChainDirty } = methods.getFieldState(SwapFormKey.ToChain, methods.formState);
35
- const { isDirty: isFromTokenDirty } = methods.getFieldState(SwapFormKey.FromToken, methods.formState);
36
- const { isDirty: isToTokenDirty } = methods.getFieldState(SwapFormKey.ToToken, methods.formState);
37
- // Users can switch chains in the wallet.
38
- // If we don't have a chain in the ordered chain list we should add it.
39
- setChain(account.chainId);
40
- // If we ran out of slots for the ordered chain list and the current chain isn't there
41
- // we should make a recently switched chain as current.
42
- const { chainOrder } = useChainOrderStore.getState();
43
- const hasFromChainInOrderedList = chainOrder.includes(fromChainValue);
44
- const hasToChainInOrderedList = chainOrder.includes(toChainValue);
45
- if ((!fromChain && !isFromChainDirty && !isFromTokenDirty) ||
46
- !hasFromChainInOrderedList) {
47
- methods.setValue(SwapFormKey.FromChain, account.chainId, {
48
- shouldDirty: false,
49
- });
50
- methods.setValue(SwapFormKey.FromToken, '', {
51
- shouldDirty: false,
52
- });
53
- methods.setValue(SwapFormKey.FromAmount, '', {
54
- shouldDirty: false,
55
- });
56
- }
57
- if ((!toChain && !isToChainDirty && !isToTokenDirty) ||
58
- !hasToChainInOrderedList) {
59
- methods.setValue(SwapFormKey.ToChain, account.chainId, {
60
- shouldDirty: false,
61
- });
62
- methods.setValue(SwapFormKey.ToToken, '', {
63
- shouldDirty: false,
64
- });
65
- }
66
- }, [
67
- account.chainId,
68
- account.isActive,
69
- fromChain,
70
- methods,
71
- setChain,
72
- toChain,
73
- ]);
74
20
  return _jsx(FormProvider, Object.assign({}, methods, { children: children }));
75
21
  };
@@ -16,12 +16,12 @@ export declare type SwapFormValues = {
16
16
  [SwapFormKey.ToToken]: string;
17
17
  [SwapFormKey.ToAddress]: string;
18
18
  };
19
- export declare type SwapFormDirection = 'from' | 'to';
19
+ export declare type SwapFormType = 'from' | 'to';
20
20
  export declare const SwapFormKeyHelper: {
21
- getChainKey: (formType: SwapFormDirection) => 'fromChain' | 'toChain';
22
- getTokenKey: (formType: SwapFormDirection) => 'fromToken' | 'toToken';
23
- getAmountKey: (formType: SwapFormDirection) => 'fromAmount' | 'toAmount';
21
+ getChainKey: (formType: SwapFormType) => 'fromChain' | 'toChain';
22
+ getTokenKey: (formType: SwapFormType) => 'fromToken' | 'toToken';
23
+ getAmountKey: (formType: SwapFormType) => 'fromAmount' | 'toAmount';
24
24
  };
25
25
  export interface SwapFormTypeProps {
26
- formType: SwapFormDirection;
26
+ formType: SwapFormType;
27
27
  }
@@ -10,7 +10,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  import { jsx as _jsx } from "react/jsx-runtime";
11
11
  import { addChain as walletAddChain, switchChain as walletSwitchChain, switchChainAndAddToken, useLiFiWalletManagement, } from '@lifi/wallet-management';
12
12
  import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from 'react';
13
- import { useWidgetConfig } from '../WidgetProvider';
13
+ import { useFormContext } from 'react-hook-form';
14
+ import { useChainOrderStore } from '../../stores/chains';
15
+ import { SwapFormKey } from '../SwapFormProvider';
16
+ import { isItemAllowed, useWidgetConfig } from '../WidgetProvider';
14
17
  const stub = () => {
15
18
  throw new Error('You forgot to wrap your component in <WalletProvider>.');
16
19
  };
@@ -25,7 +28,8 @@ const initialContext = {
25
28
  const WalletContext = createContext(initialContext);
26
29
  export const useWallet = () => useContext(WalletContext);
27
30
  export const WalletProvider = ({ children }) => {
28
- const { walletManagement } = useWidgetConfig();
31
+ const { walletManagement, fromChain, toChain, chains, disabledChains } = useWidgetConfig();
32
+ const methods = useFormContext();
29
33
  const { connect: walletManagementConnect, disconnect: walletManagementDisconnect, signer, provider, } = useLiFiWalletManagement();
30
34
  const [account, setAccount] = useState({});
31
35
  const connect = useCallback((wallet) => __awaiter(void 0, void 0, void 0, function* () {
@@ -90,6 +94,58 @@ export const WalletProvider = ({ children }) => {
90
94
  account,
91
95
  provider,
92
96
  }), [account, addChain, addToken, connect, disconnect, provider, switchChain]);
97
+ // Set wallet chain as default if no chains are provided by config and if they were not changed during widget usage
98
+ useEffect(() => {
99
+ const chainAllowed = account.chainId && isItemAllowed(account.chainId, chains, disabledChains);
100
+ if (!account.isActive || !account.chainId || !chainAllowed) {
101
+ return;
102
+ }
103
+ const [fromChainValue, toChainValue] = methods.getValues([
104
+ SwapFormKey.FromChain,
105
+ SwapFormKey.ToChain,
106
+ ]);
107
+ const { isDirty: isFromChainDirty } = methods.getFieldState(SwapFormKey.FromChain, methods.formState);
108
+ const { isDirty: isToChainDirty } = methods.getFieldState(SwapFormKey.ToChain, methods.formState);
109
+ const { isDirty: isFromTokenDirty } = methods.getFieldState(SwapFormKey.FromToken, methods.formState);
110
+ const { isDirty: isToTokenDirty } = methods.getFieldState(SwapFormKey.ToToken, methods.formState);
111
+ const { chainOrder, setChain } = useChainOrderStore.getState();
112
+ // Users can switch chains in the wallet.
113
+ // If we don't have a chain in the ordered chain list we should add it.
114
+ setChain(account.chainId);
115
+ // If we ran out of slots for the ordered chain list and the current chain isn't there
116
+ // we should make a recently switched chain as current.
117
+ const hasFromChainInOrderedList = chainOrder.includes(fromChainValue);
118
+ const hasToChainInOrderedList = chainOrder.includes(toChainValue);
119
+ if ((!fromChain && !isFromChainDirty && !isFromTokenDirty) ||
120
+ !hasFromChainInOrderedList) {
121
+ methods.setValue(SwapFormKey.FromChain, account.chainId, {
122
+ shouldDirty: false,
123
+ });
124
+ methods.setValue(SwapFormKey.FromToken, '', {
125
+ shouldDirty: false,
126
+ });
127
+ methods.setValue(SwapFormKey.FromAmount, '', {
128
+ shouldDirty: false,
129
+ });
130
+ }
131
+ if ((!toChain && !isToChainDirty && !isToTokenDirty) ||
132
+ !hasToChainInOrderedList) {
133
+ methods.setValue(SwapFormKey.ToChain, account.chainId, {
134
+ shouldDirty: false,
135
+ });
136
+ methods.setValue(SwapFormKey.ToToken, '', {
137
+ shouldDirty: false,
138
+ });
139
+ }
140
+ }, [
141
+ account.chainId,
142
+ account.isActive,
143
+ chains,
144
+ disabledChains,
145
+ fromChain,
146
+ methods,
147
+ toChain,
148
+ ]);
93
149
  return (_jsx(WalletContext.Provider, Object.assign({ value: value }, { children: children })));
94
150
  };
95
151
  export const extractAccountFromSigner = (signer) => __awaiter(void 0, void 0, void 0, function* () {
@@ -1,2 +1,3 @@
1
1
  export * from './types';
2
+ export * from './utils';
2
3
  export * from './WidgetProvider';
@@ -1,2 +1,3 @@
1
1
  export * from './types';
2
+ export * from './utils';
2
3
  export * from './WidgetProvider';
@@ -0,0 +1,4 @@
1
+ export declare const isItemAllowed: <T>(chainId: T, chains?: {
2
+ allow?: T[] | undefined;
3
+ deny?: T[] | undefined;
4
+ } | undefined, disabledChains?: T[] | undefined) => boolean;
@@ -0,0 +1,9 @@
1
+ export const isItemAllowed = (chainId, chains,
2
+ /** @deprecated Remove in the next major release */
3
+ disabledChains) => {
4
+ var _a, _b;
5
+ if ((_a = chains === null || chains === void 0 ? void 0 : chains.allow) === null || _a === void 0 ? void 0 : _a.length) {
6
+ return chains.allow.includes(chainId);
7
+ }
8
+ return !((disabledChains === null || disabledChains === void 0 ? void 0 : disabledChains.includes(chainId)) || ((_b = chains === null || chains === void 0 ? void 0 : chains.deny) === null || _b === void 0 ? void 0 : _b.includes(chainId)));
9
+ };
@@ -1,4 +1,3 @@
1
1
  export * from './types';
2
2
  export * from './useChainOrder';
3
3
  export * from './useChainOrderStore';
4
- export * from './useInitializeChainOrder';
@@ -1,4 +1,3 @@
1
1
  export * from './types';
2
2
  export * from './useChainOrder';
3
3
  export * from './useChainOrderStore';
4
- export * from './useInitializeChainOrder';
@@ -3,6 +3,6 @@ export interface ChainOrderState {
3
3
  availableChains: number[];
4
4
  }
5
5
  export interface ChainOrderStore extends ChainOrderState {
6
- initializeChains(chainIds: number[]): void;
6
+ initializeChains(chainIds: number[]): number[];
7
7
  setChain(chainId: number): void;
8
8
  }
@@ -3,22 +3,25 @@ import create from 'zustand';
3
3
  import { persist } from 'zustand/middleware';
4
4
  import { immer } from 'zustand/middleware/immer';
5
5
  export const maxChainToOrder = 9;
6
- export const useChainOrderStore = create()(persist(immer((set) => ({
6
+ export const useChainOrderStore = create()(persist(immer((set, get) => ({
7
7
  chainOrder: [],
8
8
  availableChains: [],
9
- initializeChains: (chainIds) => set((state) => {
10
- state.availableChains = chainIds;
11
- state.chainOrder = state.chainOrder.filter((chainId) => chainIds.includes(chainId));
12
- const chainsToAdd = chainIds.filter((chainId) => !state.chainOrder.includes(chainId));
13
- if (state.chainOrder.length === maxChainToOrder ||
14
- !chainsToAdd.length) {
15
- return;
16
- }
17
- const chainsToAddLength = maxChainToOrder - state.chainOrder.length;
18
- for (let index = 0; index < chainsToAddLength; index++) {
19
- state.chainOrder.push(chainsToAdd[index]);
20
- }
21
- }),
9
+ initializeChains: (chainIds) => {
10
+ set((state) => {
11
+ state.availableChains = chainIds;
12
+ state.chainOrder = state.chainOrder.filter((chainId) => chainIds.includes(chainId));
13
+ const chainsToAdd = chainIds.filter((chainId) => !state.chainOrder.includes(chainId));
14
+ if (state.chainOrder.length === maxChainToOrder ||
15
+ !chainsToAdd.length) {
16
+ return;
17
+ }
18
+ const chainsToAddLength = maxChainToOrder - state.chainOrder.length;
19
+ for (let index = 0; index < chainsToAddLength; index++) {
20
+ state.chainOrder.push(chainsToAdd[index]);
21
+ }
22
+ });
23
+ return get().chainOrder;
24
+ },
22
25
  setChain: (chainId) => set((state) => {
23
26
  if (state.chainOrder.includes(chainId) ||
24
27
  !state.availableChains.includes(chainId)) {
@@ -1,5 +1,4 @@
1
1
  export * from './types';
2
2
  export * from './useAppearance';
3
- export * from './useSetSettings';
4
3
  export * from './useSettings';
5
4
  export * from './useSettingsStore';
@@ -1,5 +1,4 @@
1
1
  export * from './types';
2
2
  export * from './useAppearance';
3
- export * from './useSetSettings';
4
3
  export * from './useSettings';
5
4
  export * from './useSettingsStore';
@@ -2,6 +2,8 @@ import shallow from 'zustand/shallow';
2
2
  import { useSettingsStore } from './useSettingsStore';
3
3
  export const useAppearance = () => {
4
4
  const [appearance, setValue] = useSettingsStore((state) => [state.appearance, state.setValue], shallow);
5
- const setAppearance = (appearance) => setValue('appearance', appearance);
5
+ const setAppearance = (appearance) => {
6
+ setValue('appearance', appearance);
7
+ };
6
8
  return [appearance, setAppearance];
7
9
  };