@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.
- package/AppProvider.js +1 -1
- package/README.md +1 -1
- package/cjs/AppProvider.js +1 -1
- package/cjs/components/ChainSelect/ChainSelect.style.js +4 -4
- package/cjs/components/ChainSelect/useChainSelect.d.ts +2 -2
- package/cjs/components/GasSufficiencyMessage/GasSufficiencyMessage.js +3 -3
- package/cjs/components/Header/useHeaderActionStore.d.ts +0 -2
- package/cjs/components/Header/useHeaderActionStore.js +1 -5
- package/cjs/components/SwapButton/SwapButton.js +3 -23
- package/cjs/components/TokenList/TokenList.js +1 -1
- package/cjs/components/TokenList/TokenList.style.js +4 -3
- package/cjs/components/TokenList/TokenListItem.js +1 -1
- package/cjs/components/TokenList/TokenNotFound.d.ts +2 -1
- package/cjs/components/TokenList/TokenNotFound.js +12 -2
- package/cjs/components/TokenList/types.d.ts +2 -2
- package/cjs/config/version.d.ts +1 -1
- package/cjs/config/version.js +1 -1
- package/cjs/hooks/useChains.js +21 -8
- package/cjs/hooks/useFeaturedTokens.d.ts +1 -1
- package/cjs/hooks/useFeaturedTokens.js +5 -2
- package/cjs/hooks/useGasSufficiency.d.ts +1 -1
- package/cjs/hooks/useGasSufficiency.js +30 -21
- package/cjs/hooks/useToken.d.ts +0 -1
- package/cjs/hooks/useToken.js +1 -2
- package/cjs/hooks/useTokenBalances.d.ts +1 -2
- package/cjs/hooks/useTokenBalances.js +1 -2
- package/cjs/hooks/useTokens.d.ts +1 -2
- package/cjs/hooks/useTokens.js +30 -8
- package/cjs/hooks/useTools.js +8 -3
- package/cjs/i18n/en/translation.json +2 -3
- package/cjs/i18n/index.d.ts +1 -2
- package/cjs/pages/MainPage/MainSwapButton.js +1 -1
- package/cjs/pages/SettingsPage/AdvancedPreferences.js +1 -1
- package/cjs/pages/SettingsPage/GasPriceSelect.js +1 -1
- package/cjs/pages/SettingsPage/RoutePrioritySelect.js +1 -1
- package/cjs/pages/SettingsPage/ShowDestinationWallet.js +1 -1
- package/cjs/pages/SettingsPage/SlippageInput.js +1 -1
- package/cjs/pages/SwapDetailsPage/SwapDetailsPage.js +2 -3
- package/cjs/pages/SwapHistoryPage/SwapHistoryPage.js +2 -3
- package/cjs/pages/SwapPage/SwapPage.js +11 -2
- package/cjs/pages/SwapRoutesPage/SwapRoutesPage.js +4 -3
- package/cjs/providers/SwapFormProvider/SwapFormProvider.js +4 -58
- package/cjs/providers/SwapFormProvider/types.d.ts +5 -5
- package/cjs/providers/WalletProvider/WalletProvider.js +57 -1
- package/cjs/providers/WidgetProvider/index.d.ts +1 -0
- package/cjs/providers/WidgetProvider/index.js +1 -0
- package/cjs/providers/WidgetProvider/utils.d.ts +4 -0
- package/cjs/providers/WidgetProvider/utils.js +13 -0
- package/cjs/stores/chains/index.d.ts +0 -1
- package/cjs/stores/chains/index.js +0 -1
- package/cjs/stores/chains/types.d.ts +1 -1
- package/cjs/stores/chains/useChainOrderStore.js +17 -14
- package/cjs/stores/settings/index.d.ts +0 -1
- package/cjs/stores/settings/index.js +0 -1
- package/cjs/stores/settings/useAppearance.js +3 -1
- package/cjs/types/widget.d.ts +29 -22
- package/components/ChainSelect/ChainSelect.style.js +4 -4
- package/components/ChainSelect/useChainSelect.d.ts +2 -2
- package/components/GasSufficiencyMessage/GasSufficiencyMessage.js +3 -3
- package/components/Header/useHeaderActionStore.d.ts +0 -2
- package/components/Header/useHeaderActionStore.js +0 -3
- package/components/SwapButton/SwapButton.js +5 -25
- package/components/TokenList/TokenList.js +1 -1
- package/components/TokenList/TokenList.style.js +4 -3
- package/components/TokenList/TokenListItem.js +1 -1
- package/components/TokenList/TokenNotFound.d.ts +2 -1
- package/components/TokenList/TokenNotFound.js +12 -2
- package/components/TokenList/types.d.ts +2 -2
- package/config/version.d.ts +1 -1
- package/config/version.js +1 -1
- package/hooks/useChains.js +23 -10
- package/hooks/useFeaturedTokens.d.ts +1 -1
- package/hooks/useFeaturedTokens.js +5 -2
- package/hooks/useGasSufficiency.d.ts +1 -1
- package/hooks/useGasSufficiency.js +32 -23
- package/hooks/useToken.d.ts +0 -1
- package/hooks/useToken.js +1 -2
- package/hooks/useTokenBalances.d.ts +1 -2
- package/hooks/useTokenBalances.js +1 -2
- package/hooks/useTokens.d.ts +1 -2
- package/hooks/useTokens.js +31 -9
- package/hooks/useTools.js +9 -4
- package/i18n/en/translation.json +2 -3
- package/i18n/index.d.ts +1 -2
- package/package.json +4 -4
- package/pages/MainPage/MainSwapButton.js +1 -1
- package/pages/SettingsPage/AdvancedPreferences.js +2 -2
- package/pages/SettingsPage/GasPriceSelect.js +2 -2
- package/pages/SettingsPage/RoutePrioritySelect.js +2 -2
- package/pages/SettingsPage/ShowDestinationWallet.js +2 -2
- package/pages/SettingsPage/SlippageInput.js +2 -2
- package/pages/SwapDetailsPage/SwapDetailsPage.js +3 -4
- package/pages/SwapHistoryPage/SwapHistoryPage.js +3 -4
- package/pages/SwapPage/SwapPage.js +11 -2
- package/pages/SwapRoutesPage/SwapRoutesPage.js +5 -4
- package/providers/SwapFormProvider/SwapFormProvider.js +4 -58
- package/providers/SwapFormProvider/types.d.ts +5 -5
- package/providers/WalletProvider/WalletProvider.js +58 -2
- package/providers/WidgetProvider/index.d.ts +1 -0
- package/providers/WidgetProvider/index.js +1 -0
- package/providers/WidgetProvider/utils.d.ts +4 -0
- package/providers/WidgetProvider/utils.js +9 -0
- package/stores/chains/index.d.ts +0 -1
- package/stores/chains/index.js +0 -1
- package/stores/chains/types.d.ts +1 -1
- package/stores/chains/useChainOrderStore.js +17 -14
- package/stores/settings/index.d.ts +0 -1
- package/stores/settings/index.js +0 -1
- package/stores/settings/useAppearance.js +3 -1
- package/tsconfig.cjs.tsbuildinfo +1 -1
- package/types/widget.d.ts +29 -22
- package/cjs/stores/chains/useInitializeChainOrder.d.ts +0 -1
- package/cjs/stores/chains/useInitializeChainOrder.js +0 -12
- package/cjs/stores/settings/useSetSettings.d.ts +0 -5
- package/cjs/stores/settings/useSetSettings.js +0 -12
- package/stores/chains/useInitializeChainOrder.d.ts +0 -1
- package/stores/chains/useInitializeChainOrder.js +0 -5
- package/stores/settings/useSetSettings.d.ts +0 -5
- 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 {
|
|
8
|
+
import { useSettings, useSettingsStore } from '../../stores';
|
|
9
9
|
export const RoutePrioritySelect = () => {
|
|
10
10
|
const { t } = useTranslation();
|
|
11
|
-
const
|
|
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 {
|
|
5
|
+
import { useSettings, useSettingsStore } from '../../stores';
|
|
6
6
|
export const ShowDestinationWallet = () => {
|
|
7
7
|
const { t } = useTranslation();
|
|
8
|
-
const
|
|
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 {
|
|
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 {
|
|
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
|
|
48
|
-
}, [
|
|
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 {
|
|
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
|
|
25
|
-
}, [
|
|
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 {
|
|
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
|
|
32
|
-
|
|
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
|
|
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
|
|
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
|
|
19
|
+
export declare type SwapFormType = 'from' | 'to';
|
|
20
20
|
export declare const SwapFormKeyHelper: {
|
|
21
|
-
getChainKey: (formType:
|
|
22
|
-
getTokenKey: (formType:
|
|
23
|
-
getAmountKey: (formType:
|
|
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:
|
|
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 {
|
|
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* () {
|
|
@@ -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
|
+
};
|
package/stores/chains/index.d.ts
CHANGED
package/stores/chains/index.js
CHANGED
package/stores/chains/types.d.ts
CHANGED
|
@@ -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) =>
|
|
10
|
-
state
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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)) {
|
package/stores/settings/index.js
CHANGED
|
@@ -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) =>
|
|
5
|
+
const setAppearance = (appearance) => {
|
|
6
|
+
setValue('appearance', appearance);
|
|
7
|
+
};
|
|
6
8
|
return [appearance, setAppearance];
|
|
7
9
|
};
|