@lifi/widget 2.0.0-beta.5 → 2.0.0-beta.7
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/App.d.ts +3 -2
- package/AppDrawer.js +2 -1
- package/AppProvider.js +1 -1
- package/cjs/App.d.ts +3 -2
- package/cjs/AppDrawer.js +2 -1
- package/cjs/AppProvider.js +1 -1
- package/cjs/components/ChainSelect/useChainSelect.js +6 -0
- package/cjs/components/Header/Header.js +2 -2
- package/cjs/components/Header/Header.style.js +3 -0
- package/cjs/components/Header/NavigationHeader.js +7 -4
- package/cjs/components/Header/NavigationTabs.d.ts +1 -0
- package/cjs/components/Header/NavigationTabs.js +26 -0
- package/cjs/components/Header/NavigationTabs.style.d.ts +101 -0
- package/cjs/components/Header/NavigationTabs.style.js +61 -0
- package/cjs/components/Header/WalletHeader.d.ts +1 -0
- package/cjs/components/Header/WalletHeader.js +15 -8
- package/cjs/components/Header/useHeaderActionStore.js +0 -1
- package/cjs/components/SelectTokenButton/SelectTokenButton.js +5 -2
- package/cjs/config/version.d.ts +1 -1
- package/cjs/config/version.js +1 -1
- package/cjs/hooks/index.d.ts +2 -1
- package/cjs/hooks/index.js +2 -1
- package/cjs/hooks/useContentHeight.js +3 -5
- package/cjs/hooks/useInitializer.js +0 -1
- package/cjs/hooks/useSwapOnly.d.ts +1 -0
- package/cjs/hooks/useSwapOnly.js +9 -0
- package/cjs/hooks/useSwapRoutes.js +3 -1
- package/cjs/i18n/en.json +2 -2
- package/cjs/i18n/pt.json +19 -4
- package/cjs/i18n/uk.json +20 -5
- package/cjs/index.d.ts +1 -1
- package/cjs/pages/SelectTokenPage/SelectTokenPage.js +3 -1
- package/cjs/providers/SwapFormProvider/FormUpdater.js +3 -0
- package/cjs/stores/StoreProvider.d.ts +2 -2
- package/cjs/stores/StoreProvider.js +3 -2
- package/cjs/stores/routes/RouteExecutionStore.js +0 -1
- package/cjs/stores/settings/index.d.ts +1 -0
- package/cjs/stores/settings/index.js +1 -0
- package/cjs/stores/settings/types.d.ts +11 -0
- package/cjs/stores/settings/useSplitSubvariantStore.d.ts +7 -0
- package/cjs/stores/settings/useSplitSubvariantStore.js +44 -0
- package/cjs/types/widget.d.ts +5 -1
- package/cjs/types/widget.js +3 -3
- package/components/ChainSelect/useChainSelect.js +7 -1
- package/components/Header/Header.js +3 -3
- package/components/Header/Header.style.js +3 -0
- package/components/Header/NavigationHeader.js +7 -4
- package/components/Header/NavigationTabs.d.ts +1 -0
- package/components/Header/NavigationTabs.js +22 -0
- package/components/Header/NavigationTabs.style.d.ts +101 -0
- package/components/Header/NavigationTabs.style.js +58 -0
- package/components/Header/WalletHeader.d.ts +1 -0
- package/components/Header/WalletHeader.js +12 -6
- package/components/Header/useHeaderActionStore.js +0 -1
- package/components/SelectTokenButton/SelectTokenButton.js +6 -3
- package/config/version.d.ts +1 -1
- package/config/version.js +1 -1
- package/hooks/index.d.ts +2 -1
- package/hooks/index.js +2 -1
- package/hooks/useContentHeight.js +4 -6
- package/hooks/useInitializer.js +0 -1
- package/hooks/useSwapOnly.d.ts +1 -0
- package/hooks/useSwapOnly.js +5 -0
- package/hooks/useSwapRoutes.js +3 -1
- package/i18n/en.json +2 -2
- package/i18n/pt.json +19 -4
- package/i18n/uk.json +20 -5
- package/index.d.ts +1 -1
- package/package.json +6 -6
- package/pages/SelectTokenPage/SelectTokenPage.js +4 -2
- package/providers/SwapFormProvider/FormUpdater.js +3 -0
- package/stores/StoreProvider.d.ts +2 -2
- package/stores/StoreProvider.js +3 -2
- package/stores/routes/RouteExecutionStore.js +0 -1
- package/stores/settings/index.d.ts +1 -0
- package/stores/settings/index.js +1 -0
- package/stores/settings/types.d.ts +11 -0
- package/stores/settings/useSplitSubvariantStore.d.ts +7 -0
- package/stores/settings/useSplitSubvariantStore.js +37 -0
- package/tsconfig.cjs.tsbuildinfo +1 -1
- package/types/widget.d.ts +5 -1
- package/types/widget.js +3 -3
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export declare const NavbarTabs: import("@emotion/styled").StyledComponent<{
|
|
3
|
+
action?: import("react").Ref<import("@mui/material").TabsActions> | undefined;
|
|
4
|
+
allowScrollButtonsMobile?: boolean | undefined;
|
|
5
|
+
'aria-label'?: string | undefined;
|
|
6
|
+
'aria-labelledby'?: string | undefined;
|
|
7
|
+
centered?: boolean | undefined;
|
|
8
|
+
children?: import("react").ReactNode;
|
|
9
|
+
classes?: Partial<import("@mui/material").TabsClasses> | undefined;
|
|
10
|
+
slots?: {
|
|
11
|
+
StartScrollButtonIcon?: import("react").ElementType<any> | undefined;
|
|
12
|
+
EndScrollButtonIcon?: import("react").ElementType<any> | undefined;
|
|
13
|
+
} | undefined;
|
|
14
|
+
slotProps?: {
|
|
15
|
+
startScrollButtonIcon?: import("@mui/base").SlotComponentProps<import("@mui/material/OverridableComponent").OverridableComponent<import("@mui/material").SvgIconTypeMap<{}, "svg">> & {
|
|
16
|
+
muiName: string;
|
|
17
|
+
}, import("@mui/material").TabsStartScrollButtonIconSlotPropsOverrides, import("@mui/material").TabsOwnerState> | undefined;
|
|
18
|
+
endScrollButtonIcon?: import("@mui/base").SlotComponentProps<import("@mui/material/OverridableComponent").OverridableComponent<import("@mui/material").SvgIconTypeMap<{}, "svg">> & {
|
|
19
|
+
muiName: string;
|
|
20
|
+
}, import("@mui/material").TabsEndScrollButtonIconSlotPropsOverrides, import("@mui/material").TabsOwnerState> | undefined;
|
|
21
|
+
} | undefined;
|
|
22
|
+
indicatorColor?: import("@mui/types").OverridableStringUnion<"primary" | "secondary", import("@mui/material").TabsPropsIndicatorColorOverrides> | undefined;
|
|
23
|
+
onChange?: ((event: import("react").SyntheticEvent<Element, Event>, value: any) => void) | undefined;
|
|
24
|
+
orientation?: "horizontal" | "vertical" | undefined;
|
|
25
|
+
ScrollButtonComponent?: import("react").ElementType<any> | undefined;
|
|
26
|
+
scrollButtons?: boolean | "auto" | undefined;
|
|
27
|
+
selectionFollowsFocus?: boolean | undefined;
|
|
28
|
+
TabIndicatorProps?: (import("react").HTMLAttributes<HTMLDivElement> & {
|
|
29
|
+
sx?: import("@mui/material").SxProps<import("@mui/material").Theme> | undefined;
|
|
30
|
+
}) | undefined;
|
|
31
|
+
TabScrollButtonProps?: Partial<import("@mui/material").TabScrollButtonProps> | undefined;
|
|
32
|
+
textColor?: "inherit" | "primary" | "secondary" | undefined;
|
|
33
|
+
value?: any;
|
|
34
|
+
variant?: "fullWidth" | "standard" | "scrollable" | undefined;
|
|
35
|
+
visibleScrollbar?: boolean | undefined;
|
|
36
|
+
sx?: import("@mui/material").SxProps<import("@mui/material").Theme> | undefined;
|
|
37
|
+
} & import("@mui/material/OverridableComponent").CommonProps & Omit<{
|
|
38
|
+
action?: import("react").Ref<import("@mui/material").ButtonBaseActions> | undefined;
|
|
39
|
+
centerRipple?: boolean | undefined;
|
|
40
|
+
children?: import("react").ReactNode;
|
|
41
|
+
classes?: Partial<import("@mui/material").ButtonBaseClasses> | undefined;
|
|
42
|
+
disabled?: boolean | undefined;
|
|
43
|
+
disableRipple?: boolean | undefined;
|
|
44
|
+
disableTouchRipple?: boolean | undefined;
|
|
45
|
+
focusRipple?: boolean | undefined;
|
|
46
|
+
focusVisibleClassName?: string | undefined;
|
|
47
|
+
LinkComponent?: import("react").ElementType<any> | undefined;
|
|
48
|
+
onFocusVisible?: import("react").FocusEventHandler<any> | undefined;
|
|
49
|
+
sx?: import("@mui/material").SxProps<import("@mui/material").Theme> | undefined;
|
|
50
|
+
tabIndex?: number | undefined;
|
|
51
|
+
TouchRippleProps?: Partial<import("@mui/material/ButtonBase/TouchRipple").TouchRippleProps> | undefined;
|
|
52
|
+
touchRippleRef?: import("react").Ref<import("@mui/material/ButtonBase/TouchRipple").TouchRippleActions> | undefined;
|
|
53
|
+
} & Omit<{
|
|
54
|
+
action?: import("react").Ref<import("@mui/material").ButtonBaseActions> | undefined;
|
|
55
|
+
centerRipple?: boolean | undefined;
|
|
56
|
+
children?: import("react").ReactNode;
|
|
57
|
+
classes?: Partial<import("@mui/material").ButtonBaseClasses> | undefined;
|
|
58
|
+
disabled?: boolean | undefined;
|
|
59
|
+
disableRipple?: boolean | undefined;
|
|
60
|
+
disableTouchRipple?: boolean | undefined;
|
|
61
|
+
focusRipple?: boolean | undefined;
|
|
62
|
+
focusVisibleClassName?: string | undefined;
|
|
63
|
+
LinkComponent?: import("react").ElementType<any> | undefined;
|
|
64
|
+
onFocusVisible?: import("react").FocusEventHandler<any> | undefined;
|
|
65
|
+
sx?: import("@mui/material").SxProps<import("@mui/material").Theme> | undefined;
|
|
66
|
+
tabIndex?: number | undefined;
|
|
67
|
+
TouchRippleProps?: Partial<import("@mui/material/ButtonBase/TouchRipple").TouchRippleProps> | undefined;
|
|
68
|
+
touchRippleRef?: import("react").Ref<import("@mui/material/ButtonBase/TouchRipple").TouchRippleActions> | undefined;
|
|
69
|
+
}, "classes"> & import("@mui/material/OverridableComponent").CommonProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
|
|
70
|
+
ref?: ((instance: HTMLButtonElement | null) => void) | import("react").RefObject<HTMLButtonElement> | null | undefined;
|
|
71
|
+
}, keyof import("@mui/material/OverridableComponent").CommonProps | "tabIndex" | "children" | "action" | "centerRipple" | "disabled" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "onFocusVisible" | "sx" | "TouchRippleProps" | "touchRippleRef">, keyof import("@mui/material/OverridableComponent").CommonProps | "children" | "aria-label" | "aria-labelledby" | "onChange" | "action" | "sx" | "variant" | "value" | "slotProps" | "slots" | "orientation" | "allowScrollButtonsMobile" | "centered" | "indicatorColor" | "ScrollButtonComponent" | "scrollButtons" | "selectionFollowsFocus" | "TabIndicatorProps" | "TabScrollButtonProps" | "textColor" | "visibleScrollbar"> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
|
|
72
|
+
export declare const NavbarTab: import("@emotion/styled").StyledComponent<{
|
|
73
|
+
children?: null | undefined;
|
|
74
|
+
classes?: Partial<import("@mui/material").TabClasses> | undefined;
|
|
75
|
+
disabled?: boolean | undefined;
|
|
76
|
+
disableFocusRipple?: boolean | undefined;
|
|
77
|
+
icon?: string | import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>> | undefined;
|
|
78
|
+
iconPosition?: "bottom" | "top" | "end" | "start" | undefined;
|
|
79
|
+
label?: import("react").ReactNode;
|
|
80
|
+
sx?: import("@mui/material").SxProps<import("@mui/material").Theme> | undefined;
|
|
81
|
+
value?: any;
|
|
82
|
+
wrapped?: boolean | undefined;
|
|
83
|
+
} & Omit<{
|
|
84
|
+
action?: import("react").Ref<import("@mui/material").ButtonBaseActions> | undefined;
|
|
85
|
+
centerRipple?: boolean | undefined;
|
|
86
|
+
children?: import("react").ReactNode;
|
|
87
|
+
classes?: Partial<import("@mui/material").ButtonBaseClasses> | undefined;
|
|
88
|
+
disabled?: boolean | undefined;
|
|
89
|
+
disableRipple?: boolean | undefined;
|
|
90
|
+
disableTouchRipple?: boolean | undefined;
|
|
91
|
+
focusRipple?: boolean | undefined;
|
|
92
|
+
focusVisibleClassName?: string | undefined;
|
|
93
|
+
LinkComponent?: import("react").ElementType<any> | undefined;
|
|
94
|
+
onFocusVisible?: import("react").FocusEventHandler<any> | undefined;
|
|
95
|
+
sx?: import("@mui/material").SxProps<import("@mui/material").Theme> | undefined;
|
|
96
|
+
tabIndex?: number | undefined;
|
|
97
|
+
TouchRippleProps?: Partial<import("@mui/material/ButtonBase/TouchRipple").TouchRippleProps> | undefined;
|
|
98
|
+
touchRippleRef?: import("react").Ref<import("@mui/material/ButtonBase/TouchRipple").TouchRippleActions> | undefined;
|
|
99
|
+
}, "classes"> & import("@mui/material/OverridableComponent").CommonProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
|
|
100
|
+
ref?: import("react").RefObject<HTMLDivElement> | ((instance: HTMLDivElement | null) => void) | null | undefined;
|
|
101
|
+
}, keyof import("@mui/material/OverridableComponent").CommonProps | "label" | "tabIndex" | "children" | "action" | "centerRipple" | "disabled" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "onFocusVisible" | "sx" | "TouchRippleProps" | "touchRippleRef" | "disableFocusRipple" | "value" | "icon" | "iconPosition" | "wrapped"> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Tab, Tabs, tabClasses, tabsClasses } from '@mui/material';
|
|
2
|
+
import { alpha, styled } from '@mui/material/styles';
|
|
3
|
+
export const NavbarTabs = styled(Tabs)(({ theme }) => ({
|
|
4
|
+
backgroundColor: theme.palette.mode === 'dark'
|
|
5
|
+
? theme.palette.common.white
|
|
6
|
+
: alpha(theme.palette.common.black, 0.04),
|
|
7
|
+
borderRadius: theme.shape.borderRadius,
|
|
8
|
+
padding: theme.spacing(0.5),
|
|
9
|
+
flex: 1,
|
|
10
|
+
display: 'flex',
|
|
11
|
+
alignItems: 'center',
|
|
12
|
+
height: 56,
|
|
13
|
+
[`.${tabsClasses.flexContainer}`]: {
|
|
14
|
+
alignItems: 'center',
|
|
15
|
+
},
|
|
16
|
+
[`.${tabsClasses.scroller}`]: {
|
|
17
|
+
overflow: 'initial !important',
|
|
18
|
+
},
|
|
19
|
+
[`.${tabsClasses.indicator}`]: {
|
|
20
|
+
position: 'absolute',
|
|
21
|
+
top: '50%',
|
|
22
|
+
transform: 'translateY(-50%)',
|
|
23
|
+
height: 48,
|
|
24
|
+
backgroundColor: theme.palette.mode === 'dark'
|
|
25
|
+
? theme.palette.common.black
|
|
26
|
+
: theme.palette.common.white,
|
|
27
|
+
borderRadius: theme.shape.borderRadiusSecondary,
|
|
28
|
+
boxShadow: `0px 2px 4px ${alpha(theme.palette.common.black, 0.04)}`,
|
|
29
|
+
},
|
|
30
|
+
}));
|
|
31
|
+
export const NavbarTab = styled(Tab, {
|
|
32
|
+
shouldForwardProp: (prop) => prop !== 'isDarkMode',
|
|
33
|
+
})(({ theme }) => ({
|
|
34
|
+
zIndex: 1,
|
|
35
|
+
display: 'flex',
|
|
36
|
+
flex: 1,
|
|
37
|
+
justifyContent: 'center',
|
|
38
|
+
alignItems: 'center',
|
|
39
|
+
flexDirection: 'row',
|
|
40
|
+
textTransform: 'none',
|
|
41
|
+
height: 48,
|
|
42
|
+
minHeight: 48,
|
|
43
|
+
fontSize: '1rem',
|
|
44
|
+
fontWeight: 700,
|
|
45
|
+
color: theme.palette.mode === 'dark'
|
|
46
|
+
? theme.palette.common.white
|
|
47
|
+
: theme.palette.common.black,
|
|
48
|
+
textDecoration: 'none',
|
|
49
|
+
[`&.${tabClasses.selected}`]: {
|
|
50
|
+
color: theme.palette.mode === 'dark'
|
|
51
|
+
? theme.palette.common.white
|
|
52
|
+
: theme.palette.common.black,
|
|
53
|
+
backgroundColor: 'transparent',
|
|
54
|
+
},
|
|
55
|
+
[`.${tabClasses.iconWrapper}`]: {
|
|
56
|
+
margin: theme.spacing(0, 1, 0, 0),
|
|
57
|
+
},
|
|
58
|
+
}));
|
|
@@ -14,28 +14,33 @@ import { navigationRoutes, shortenWalletAddress } from '../../utils';
|
|
|
14
14
|
import { HeaderAppBar, WalletButton } from './Header.style';
|
|
15
15
|
import { WalletMenu } from './WalletMenu';
|
|
16
16
|
export const WalletHeader = () => {
|
|
17
|
+
return (_jsx(HeaderAppBar, { elevation: 0, sx: { justifyContent: 'flex-end' }, children: _jsx(WalletMenuButton, {}) }));
|
|
18
|
+
};
|
|
19
|
+
export const WalletMenuButton = () => {
|
|
17
20
|
const { account } = useWallet();
|
|
18
|
-
return
|
|
21
|
+
return account.isActive ? _jsx(ConnectedButton, {}) : _jsx(ConnectButton, {});
|
|
19
22
|
};
|
|
20
23
|
const ConnectButton = () => {
|
|
21
24
|
const { t } = useTranslation();
|
|
22
25
|
const { pathname } = useLocation();
|
|
23
|
-
const
|
|
26
|
+
const { walletManagement, subvariant } = useWidgetConfig();
|
|
24
27
|
const { connect: connectWallet } = useWallet();
|
|
25
28
|
const navigate = useNavigate();
|
|
26
29
|
const connect = async () => {
|
|
27
|
-
if (
|
|
30
|
+
if (walletManagement) {
|
|
28
31
|
await connectWallet();
|
|
29
32
|
return;
|
|
30
33
|
}
|
|
31
34
|
navigate(navigationRoutes.selectWallet);
|
|
32
35
|
};
|
|
33
|
-
return (_jsx(WalletButton, { endIcon: _jsx(WalletIcon, {}), onClick: !pathname.includes(navigationRoutes.selectWallet) ? connect : undefined, sx: {
|
|
34
|
-
marginRight: -1.25,
|
|
36
|
+
return (_jsx(WalletButton, { endIcon: subvariant !== 'split' ? _jsx(WalletIcon, {}) : undefined, startIcon: subvariant === 'split' ? _jsx(WalletIcon, {}) : undefined, onClick: !pathname.includes(navigationRoutes.selectWallet) ? connect : undefined, sx: {
|
|
37
|
+
marginRight: subvariant === 'split' ? 0 : -1.25,
|
|
38
|
+
marginLeft: subvariant === 'split' ? -1.25 : 0,
|
|
35
39
|
}, children: t(`button.connectWallet`) }));
|
|
36
40
|
};
|
|
37
41
|
const ConnectedButton = () => {
|
|
38
42
|
const { t } = useTranslation();
|
|
43
|
+
const { subvariant } = useWidgetConfig();
|
|
39
44
|
const { account, disconnect } = useWallet();
|
|
40
45
|
const walletAddress = shortenWalletAddress(account.address);
|
|
41
46
|
const { chain } = useChain(account.chainId);
|
|
@@ -55,7 +60,8 @@ const ConnectedButton = () => {
|
|
|
55
60
|
handleClose();
|
|
56
61
|
};
|
|
57
62
|
return (_jsxs(_Fragment, { children: [_jsx(WalletButton, { endIcon: _jsx(ExpandMoreIcon, {}), startIcon: _jsx(Avatar, { src: chain?.logoURI, alt: chain?.key, sx: { width: 24, height: 24 }, children: chain?.name[0] }), sx: {
|
|
58
|
-
marginRight: -1.25,
|
|
63
|
+
marginRight: subvariant === 'split' ? 0 : -1.25,
|
|
64
|
+
marginLeft: subvariant === 'split' ? -1 : 0,
|
|
59
65
|
}, onClick: handleClick, children: walletAddress }), _jsxs(WalletMenu, { anchorEl: anchorEl, open: Boolean(anchorEl), onClose: handleClose, children: [_jsxs(MenuItem, { onClick: handleCopyAddress, children: [_jsx(ContentCopyIcon, {}), t(`button.copyAddress`)] }), _jsxs(MenuItem, { component: "a", onClick: handleClose, href: `${chain?.metamask.blockExplorerUrls[0]}address/${account.address}`, target: "_blank", children: [_jsx(OpenInNewIcon, {}), t(`button.viewOnExplorer`)] }), _jsx(Button, { onClick: handleDisconnect, fullWidth: true, startIcon: _jsx(PowerSettingsNewIcon, {}), sx: {
|
|
60
66
|
marginTop: 1,
|
|
61
67
|
}, children: t(`button.disconnect`) })] })] }));
|
|
@@ -3,7 +3,7 @@ import { Skeleton } from '@mui/material';
|
|
|
3
3
|
import { useWatch } from 'react-hook-form';
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
5
5
|
import { useNavigate } from 'react-router-dom';
|
|
6
|
-
import { useChain, useToken } from '../../hooks';
|
|
6
|
+
import { useChain, useSwapOnly, useToken } from '../../hooks';
|
|
7
7
|
import { SwapFormKeyHelper, useWidgetConfig } from '../../providers';
|
|
8
8
|
import { navigationRoutes } from '../../utils';
|
|
9
9
|
import { Card, CardTitle } from '../Card';
|
|
@@ -13,6 +13,7 @@ export const SelectTokenButton = ({ formType, compact }) => {
|
|
|
13
13
|
const { t } = useTranslation();
|
|
14
14
|
const navigate = useNavigate();
|
|
15
15
|
const { disabledUI, variant } = useWidgetConfig();
|
|
16
|
+
const swapOnly = useSwapOnly();
|
|
16
17
|
const tokenKey = SwapFormKeyHelper.getTokenKey(formType);
|
|
17
18
|
const [chainId, tokenAddress] = useWatch({
|
|
18
19
|
name: [SwapFormKeyHelper.getChainKey(formType), tokenKey],
|
|
@@ -29,8 +30,10 @@ export const SelectTokenButton = ({ formType, compact }) => {
|
|
|
29
30
|
const isSelected = !!(chain && token);
|
|
30
31
|
const onClick = !disabledUI?.includes(tokenKey) ? handleClick : undefined;
|
|
31
32
|
const defaultPlaceholder = formType === 'to' && variant === 'refuel'
|
|
32
|
-
? t(
|
|
33
|
-
:
|
|
33
|
+
? t('swap.selectChain')
|
|
34
|
+
: formType === 'to' && swapOnly
|
|
35
|
+
? t('swap.selectToken')
|
|
36
|
+
: t('swap.selectChainAndToken');
|
|
34
37
|
const cardTitle = formType === 'from' && variant === 'nft'
|
|
35
38
|
? t(`header.payWith`)
|
|
36
39
|
: t(`swap.${formType}`);
|
package/config/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const name = "@lifi/widget";
|
|
2
|
-
export declare const version = "2.0.0-beta.
|
|
2
|
+
export declare const version = "2.0.0-beta.7";
|
package/config/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export const name = '@lifi/widget';
|
|
2
|
-
export const version = '2.0.0-beta.
|
|
2
|
+
export const version = '2.0.0-beta.7';
|
package/hooks/index.d.ts
CHANGED
|
@@ -15,12 +15,13 @@ export * from './useNavigateBack';
|
|
|
15
15
|
export * from './useProcessMessage';
|
|
16
16
|
export * from './useRouteExecution';
|
|
17
17
|
export * from './useScrollableContainer';
|
|
18
|
+
export * from './useSwapOnly';
|
|
18
19
|
export * from './useSwapRoutes';
|
|
19
20
|
export * from './useToken';
|
|
20
21
|
export * from './useTokenAddressBalance';
|
|
21
22
|
export * from './useTokenBalance';
|
|
22
23
|
export * from './useTokenBalances';
|
|
23
|
-
export * from './useTokens';
|
|
24
24
|
export * from './useTokenSearch';
|
|
25
|
+
export * from './useTokens';
|
|
25
26
|
export * from './useTools';
|
|
26
27
|
export * from './useWidgetEvents';
|
package/hooks/index.js
CHANGED
|
@@ -15,12 +15,13 @@ export * from './useNavigateBack';
|
|
|
15
15
|
export * from './useProcessMessage';
|
|
16
16
|
export * from './useRouteExecution';
|
|
17
17
|
export * from './useScrollableContainer';
|
|
18
|
+
export * from './useSwapOnly';
|
|
18
19
|
export * from './useSwapRoutes';
|
|
19
20
|
export * from './useToken';
|
|
20
21
|
export * from './useTokenAddressBalance';
|
|
21
22
|
export * from './useTokenBalance';
|
|
22
23
|
export * from './useTokenBalances';
|
|
23
|
-
export * from './useTokens';
|
|
24
24
|
export * from './useTokenSearch';
|
|
25
|
+
export * from './useTokens';
|
|
25
26
|
export * from './useTools';
|
|
26
27
|
export * from './useWidgetEvents';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useLayoutEffect, useState } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { ElementId, createElementId } from '../utils';
|
|
3
3
|
import { useDefaultElementId } from './useDefaultElementId';
|
|
4
4
|
import { getScrollableContainer } from './useScrollableContainer';
|
|
5
5
|
const getContentHeight = (elementId) => {
|
|
6
|
-
const headerElement = document.getElementById(createElementId(ElementId.Header, elementId));
|
|
7
6
|
const containerElement = document.getElementById(createElementId(ElementId.ScrollableContainer, elementId));
|
|
7
|
+
const headerElement = document.getElementById(createElementId(ElementId.Header, elementId));
|
|
8
8
|
if (!containerElement || !headerElement) {
|
|
9
9
|
console.warn(`Can't find ${ElementId.ScrollableContainer} or ${ElementId.Header} id.`);
|
|
10
10
|
return 0;
|
|
@@ -15,11 +15,9 @@ const getContentHeight = (elementId) => {
|
|
|
15
15
|
};
|
|
16
16
|
export const useContentHeight = () => {
|
|
17
17
|
const elementId = useDefaultElementId();
|
|
18
|
-
const [contentHeight, setContentHeight] = useState(
|
|
18
|
+
const [contentHeight, setContentHeight] = useState(0);
|
|
19
19
|
useLayoutEffect(() => {
|
|
20
|
-
|
|
21
|
-
setContentHeight(getContentHeight(elementId));
|
|
22
|
-
}
|
|
20
|
+
setContentHeight(getContentHeight(elementId));
|
|
23
21
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
24
22
|
}, []);
|
|
25
23
|
return contentHeight;
|
package/hooks/useInitializer.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const useSwapOnly: () => boolean;
|
package/hooks/useSwapRoutes.js
CHANGED
|
@@ -7,12 +7,14 @@ import { v4 as uuidv4 } from 'uuid';
|
|
|
7
7
|
import { useDebouncedWatch, useGasRefuel, useToken } from '.';
|
|
8
8
|
import { SwapFormKey, useLiFi, useWallet, useWidgetConfig } from '../providers';
|
|
9
9
|
import { useSettings } from '../stores';
|
|
10
|
+
import { useSwapOnly } from './useSwapOnly';
|
|
10
11
|
const refetchTime = 60000;
|
|
11
12
|
export const useSwapRoutes = ({ onSettled, insurableRoute, } = {}) => {
|
|
12
13
|
const lifi = useLiFi();
|
|
13
14
|
const { variant, sdkConfig, insurance, contractTool } = useWidgetConfig();
|
|
14
15
|
const { account, provider } = useWallet();
|
|
15
16
|
const queryClient = useQueryClient();
|
|
17
|
+
const swapOnly = useSwapOnly();
|
|
16
18
|
const { slippage, enabledBridges, enabledAutoRefuel, enabledExchanges, routePriority, } = useSettings([
|
|
17
19
|
'slippage',
|
|
18
20
|
'routePriority',
|
|
@@ -63,7 +65,7 @@ export const useSwapRoutes = ({ onSettled, insurableRoute, } = {}) => {
|
|
|
63
65
|
toContractCallData,
|
|
64
66
|
toContractGasLimit,
|
|
65
67
|
slippage,
|
|
66
|
-
enabledBridges,
|
|
68
|
+
swapOnly ? [] : enabledBridges,
|
|
67
69
|
enabledExchanges,
|
|
68
70
|
routePriority,
|
|
69
71
|
variant,
|
package/i18n/en.json
CHANGED
|
@@ -176,9 +176,9 @@
|
|
|
176
176
|
"rateChange": "Rate change",
|
|
177
177
|
"receiving": "Receiving",
|
|
178
178
|
"refuelStepDetails": "Get gas via {{tool}}",
|
|
179
|
-
"selectChain": "
|
|
179
|
+
"selectChain": "Select chain",
|
|
180
180
|
"selectChainAndToken": "Select chain and token",
|
|
181
|
-
"selectToken": "
|
|
181
|
+
"selectToken": "Select token",
|
|
182
182
|
"sendToAddress": "Send to {{address}}",
|
|
183
183
|
"sendToWallet": "Send to a different wallet",
|
|
184
184
|
"sentToAddress": "Sent to {{address}}",
|
package/i18n/pt.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"button": {
|
|
3
3
|
"auto": "Automático",
|
|
4
|
+
"buy": "Comprar",
|
|
5
|
+
"buyNow": "Comprar agora",
|
|
4
6
|
"cancel": "Cancelar",
|
|
5
7
|
"connectWallet": "Conectar carteira",
|
|
6
8
|
"contactSupport": "Falar com o suporte",
|
|
@@ -23,6 +25,7 @@
|
|
|
23
25
|
"resetSettings": "Redefinir as configurações",
|
|
24
26
|
"restartSwap": "Reiniciar a conversão",
|
|
25
27
|
"reviewGasSwap": "Rever o gás de conversão",
|
|
28
|
+
"reviewPurchase": "Revisar compra",
|
|
26
29
|
"reviewSwap": "Rever conversão",
|
|
27
30
|
"seeDetails": "Ver detalhes",
|
|
28
31
|
"showAll": "Mostrar tudo",
|
|
@@ -39,10 +42,14 @@
|
|
|
39
42
|
},
|
|
40
43
|
"header": {
|
|
41
44
|
"activeSwaps": "Conversões ativas",
|
|
45
|
+
"bridge": "Ponte",
|
|
42
46
|
"checkout": "Finalizar",
|
|
43
47
|
"from": "Converter a partir de",
|
|
44
48
|
"gas": "Gás",
|
|
45
49
|
"gasSwap": "Conversão de gás",
|
|
50
|
+
"payWith": "Pagar com",
|
|
51
|
+
"purchase": "Compra",
|
|
52
|
+
"purchaseDetails": "Detalhes da compra",
|
|
46
53
|
"routes": "Você recebe",
|
|
47
54
|
"selectChain": "Selecionar uma rede",
|
|
48
55
|
"selectWallet": "Selecionar sua carteira",
|
|
@@ -75,6 +82,7 @@
|
|
|
75
82
|
"currentAmount": "Quantidade atual",
|
|
76
83
|
"error": {
|
|
77
84
|
"message": {
|
|
85
|
+
"allowanceRequired": "A quantidade a ser transferida para {{tokenSymbol}} excede a sua permissão atual. Por favor, aumente a sua permissão e tente novamente.",
|
|
78
86
|
"slippageThreshold": "A derrapagem é maior do que o limite definido. Solicite uma nova rota para obter uma nova cotação.",
|
|
79
87
|
"transactionFailed": "Por favor, verifique o explorador de blocos para mais informações.",
|
|
80
88
|
"transactionNotSent": "A transação não foi enviada. {{amount, number(maximumFractionDigits: 9)}} {{tokenSymbol}} na {{chainName}} permanece na sua carteira.",
|
|
@@ -82,6 +90,7 @@
|
|
|
82
90
|
"unknown": "Por favor, tente novamente ou fale com o suporte."
|
|
83
91
|
},
|
|
84
92
|
"title": {
|
|
93
|
+
"allowanceRequired": "Permissão insuficiente",
|
|
85
94
|
"balanceIsTooLow": "O saldo é muito baixo",
|
|
86
95
|
"chainSwitch": "Necessário mudança de rede",
|
|
87
96
|
"failed": "Conversão falhou",
|
|
@@ -131,7 +140,6 @@
|
|
|
131
140
|
"onChain": "em {{nome da rede}}",
|
|
132
141
|
"otherTokens": "Outros tokens",
|
|
133
142
|
"ownedBy": "Possuído por",
|
|
134
|
-
"payWith": "Pagar com",
|
|
135
143
|
"process": {
|
|
136
144
|
"crossChain": {
|
|
137
145
|
"actionRequired": "Por favor, assine a transação",
|
|
@@ -139,6 +147,9 @@
|
|
|
139
147
|
"pending": "Aguardando a transação da ponte",
|
|
140
148
|
"started": "Preparando a transação da ponte"
|
|
141
149
|
},
|
|
150
|
+
"nft": {
|
|
151
|
+
"done": "NFT comprado"
|
|
152
|
+
},
|
|
142
153
|
"receivingChain": {
|
|
143
154
|
"done": "Ponte concluída",
|
|
144
155
|
"partial": "Ponte parcialmente concluída",
|
|
@@ -165,24 +176,27 @@
|
|
|
165
176
|
"rateChange": "Alterar taxa",
|
|
166
177
|
"receiving": "Recebendo",
|
|
167
178
|
"refuelStepDetails": "Obter gás via {{tool}}",
|
|
168
|
-
"
|
|
169
|
-
"selectChain": "Rede",
|
|
179
|
+
"selectChain": "Selecione a rede",
|
|
170
180
|
"selectChainAndToken": "Selecione a rede e o token",
|
|
171
|
-
"selectToken": "Token",
|
|
181
|
+
"selectToken": "Selecione o Token",
|
|
172
182
|
"sendToAddress": "Enviar para",
|
|
173
183
|
"sendToWallet": "Enviar para uma carteira diferente",
|
|
174
184
|
"sentToAddress": "Enviar para",
|
|
175
185
|
"stepBridge": "Ponte",
|
|
186
|
+
"stepBridgeAndBuy": "Transfira e compre",
|
|
176
187
|
"stepDetails": "{{tool}} via LI.FI",
|
|
177
188
|
"stepSwap": "Conversão",
|
|
178
189
|
"stepSwapAndBridge": "Converter e enviar pela ponte",
|
|
190
|
+
"stepSwapAndBuy": "Converta e compre",
|
|
179
191
|
"success": {
|
|
180
192
|
"message": {
|
|
181
193
|
"swapPartiallySuccessful": "Tentamos completar a conversão, mas a {{tool}} ficou sem liquidez para o token {{tokenSymbol}}.",
|
|
194
|
+
"purchaseSuccessful": "Agora você tem {{assetName}} na carteira {{walletAddress}} na cadeia {{chainName}}",
|
|
182
195
|
"swapSuccessful": "Agora há {{amount, number(maximumFractionDigits: 9)}} {{tokenSymbol}} na carteira {{walletAddress}} na rede {{chainName}}."
|
|
183
196
|
},
|
|
184
197
|
"title": {
|
|
185
198
|
"gasSwapSuccessful": "Conversão de gás bem sucedida",
|
|
199
|
+
"purchaseSuccessful": "Compra efetuada com sucesso",
|
|
186
200
|
"refundIssued": "Reembolso emitido",
|
|
187
201
|
"swapPartiallySuccessful": "Conversão parcialmente bem sucedida",
|
|
188
202
|
"swapSuccessful": "Conversão bem sucedida"
|
|
@@ -237,6 +251,7 @@
|
|
|
237
251
|
},
|
|
238
252
|
"numberOfSteps": "Um número de passos para a conversão. Cada etapa pode conter 1-2 transações que requerem uma assinatura.",
|
|
239
253
|
"progressToNextUpdate": "Os dados exibidos serão atualizados automaticamente após {{value}} segundos. Clique aqui para atualizar manualmente.",
|
|
254
|
+
"recommended": "Uma rota econômica que equilibra complexidade e facilidade de uso.",
|
|
240
255
|
"settingsModified": "Configurações (modificado)"
|
|
241
256
|
},
|
|
242
257
|
"wallet": {
|
package/i18n/uk.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"button": {
|
|
3
3
|
"auto": "Авто",
|
|
4
|
+
"buy": "Придбати",
|
|
5
|
+
"buyNow": "Придбати",
|
|
4
6
|
"cancel": "Скасувати",
|
|
5
7
|
"connectWallet": "Під'єднати гаманець",
|
|
6
8
|
"contactSupport": "Служба підтримки",
|
|
@@ -23,6 +25,7 @@
|
|
|
23
25
|
"resetSettings": "Скинути налаштування",
|
|
24
26
|
"restartSwap": "Перезапустити своп",
|
|
25
27
|
"reviewGasSwap": "Переглянути своп газу",
|
|
28
|
+
"reviewPurchase": "Перегляд покупки",
|
|
26
29
|
"reviewSwap": "Переглянути своп",
|
|
27
30
|
"seeDetails": "Детальніше",
|
|
28
31
|
"showAll": "Показати всі",
|
|
@@ -39,12 +42,16 @@
|
|
|
39
42
|
},
|
|
40
43
|
"header": {
|
|
41
44
|
"activeSwaps": "Активні свопи",
|
|
45
|
+
"bridge": "Бридж",
|
|
42
46
|
"checkout": "Розрахунок",
|
|
43
47
|
"from": "Своп з",
|
|
44
48
|
"gas": "Газ",
|
|
45
49
|
"gasSwap": "Своп газу",
|
|
50
|
+
"payWith": "Сплатити за допомогою",
|
|
51
|
+
"purchase": "Купівля",
|
|
52
|
+
"purchaseDetails": "Деталі покупки",
|
|
46
53
|
"routes": "Ви отримаєте",
|
|
47
|
-
"selectChain": "
|
|
54
|
+
"selectChain": "Виберіть чейн",
|
|
48
55
|
"selectWallet": "Виберіть свій гаманець",
|
|
49
56
|
"settings": "Налаштування",
|
|
50
57
|
"swap": "Своп",
|
|
@@ -75,6 +82,7 @@
|
|
|
75
82
|
"currentAmount": "Поточна сума",
|
|
76
83
|
"error": {
|
|
77
84
|
"message": {
|
|
85
|
+
"allowanceRequired": "Сума переказу для {{tokenSymbol}} перевищує поточну межу. Збільшіть доступну кількість у гаманці та спробуйте ще раз.",
|
|
78
86
|
"slippageThreshold": "Прослизання перевищує визначений поріг. Будь ласка, зробіть запит на новий маршрут, щоб отримати нову пропозицію.",
|
|
79
87
|
"transactionFailed": "Будь ласка, перевірте провідник блоків для отримання додаткової інформації.",
|
|
80
88
|
"transactionNotSent": "Транзакція не була відправлена. {{amount, number(maximumFractionDigits: 9)}} {{tokenSymbol}} на {{chainName}} все ще знаходяться у вашому гаманці.",
|
|
@@ -82,6 +90,7 @@
|
|
|
82
90
|
"unknown": "Будь ласка, спробуйте ще раз або зверніться до служби підтримки."
|
|
83
91
|
},
|
|
84
92
|
"title": {
|
|
93
|
+
"allowanceRequired": "Недостатня дозволена кількість",
|
|
85
94
|
"balanceIsTooLow": "Баланс занадто низький",
|
|
86
95
|
"chainSwitch": "Потрібно переключити чейн.",
|
|
87
96
|
"failed": "Помилка обміну.",
|
|
@@ -131,7 +140,6 @@
|
|
|
131
140
|
"onChain": "на {{chainName}}",
|
|
132
141
|
"otherTokens": "Інші токени",
|
|
133
142
|
"ownedBy": "Власник",
|
|
134
|
-
"payWith": "Оплатити з",
|
|
135
143
|
"process": {
|
|
136
144
|
"crossChain": {
|
|
137
145
|
"actionRequired": "Будь ласка, підпишіть транзакцію",
|
|
@@ -139,6 +147,9 @@
|
|
|
139
147
|
"pending": "Очікування бридж транзакції",
|
|
140
148
|
"started": "Підготовка бридж транзакції"
|
|
141
149
|
},
|
|
150
|
+
"nft": {
|
|
151
|
+
"done": "Придбано NFT"
|
|
152
|
+
},
|
|
142
153
|
"receivingChain": {
|
|
143
154
|
"done": "Бридж завершено",
|
|
144
155
|
"partial": "Бридж частково завершено",
|
|
@@ -165,24 +176,27 @@
|
|
|
165
176
|
"rateChange": "Зміна курсу",
|
|
166
177
|
"receiving": "Отримання",
|
|
167
178
|
"refuelStepDetails": "Отримати газ через {{tool}}",
|
|
168
|
-
"
|
|
169
|
-
"selectChain": "Чейн",
|
|
179
|
+
"selectChain": "Виберіть чейн",
|
|
170
180
|
"selectChainAndToken": "Виберіть чейн і токен",
|
|
171
|
-
"selectToken": "
|
|
181
|
+
"selectToken": "Виберіть токен",
|
|
172
182
|
"sendToAddress": "Відправити на {{address}}",
|
|
173
183
|
"sendToWallet": "Надіслати на інший гаманець",
|
|
174
184
|
"sentToAddress": "Відправлено на {{address}}",
|
|
175
185
|
"stepBridge": "Бридж",
|
|
186
|
+
"stepBridgeAndBuy": "Бридж та покупка",
|
|
176
187
|
"stepDetails": "{{tool}} через LI.FI",
|
|
177
188
|
"stepSwap": "Своп",
|
|
178
189
|
"stepSwapAndBridge": "Своп та бридж",
|
|
190
|
+
"stepSwapAndBuy": "Своп та покупка",
|
|
179
191
|
"success": {
|
|
180
192
|
"message": {
|
|
181
193
|
"swapPartiallySuccessful": "Ми намагалися завершити своп, але {{tool}} не вистачило ліквідності токену {{tokenSymbol}}.",
|
|
194
|
+
"purchaseSuccessful": "Тепер ви маєте {{assetName}} в {{walletAddress}} гаманці на ланцюжку {{chainName}}.",
|
|
182
195
|
"swapSuccessful": "Зараз є {{amount, number(maximumFractionDigits: 9)}} {{tokenSymbol}} у гаманці {{walletAddress}} на чейні {{chainName}}."
|
|
183
196
|
},
|
|
184
197
|
"title": {
|
|
185
198
|
"gasSwapSuccessful": "Своп газу успішний",
|
|
199
|
+
"purchaseSuccessful": "Покупка успішна",
|
|
186
200
|
"refundIssued": "Здійснено повернення коштів",
|
|
187
201
|
"swapPartiallySuccessful": "Своп частково успішний",
|
|
188
202
|
"swapSuccessful": "Своп успішний"
|
|
@@ -237,6 +251,7 @@
|
|
|
237
251
|
},
|
|
238
252
|
"numberOfSteps": "Кількість кроків свопу. Кожен крок може містити 1-3 транзакції, які потребують підпису.",
|
|
239
253
|
"progressToNextUpdate": "Зображені дані автоматично оновляться через {{value}} секунд. Натисніть тут, щоб оновити вручну.",
|
|
254
|
+
"recommended": "Дешевий маршрут, який балансує складність і легкість використання.",
|
|
240
255
|
"settingsModified": "Налаштування (змінено)"
|
|
241
256
|
},
|
|
242
257
|
"wallet": {
|
package/index.d.ts
CHANGED
|
@@ -6,4 +6,4 @@ export * from './config/version';
|
|
|
6
6
|
export { useWidgetEvents, widgetEvents } from './hooks';
|
|
7
7
|
export { useWallet } from './providers/WalletProvider';
|
|
8
8
|
export * from './types';
|
|
9
|
-
export declare const LiFiWidget: import("react").
|
|
9
|
+
export declare const LiFiWidget: import("react").ForwardRefExoticComponent<import("./types").WidgetDrawerProps & import("./types").WidgetConfig & import("./types").WidgetConfigPartialProps & import("react").RefAttributes<import("./AppDrawer").WidgetDrawer>>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lifi/widget",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.7",
|
|
4
4
|
"description": "LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.",
|
|
5
5
|
"main": "./cjs/index.js",
|
|
6
6
|
"module": "./index.js",
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
"@ethersproject/experimental": "^5.7.0",
|
|
45
45
|
"@ethersproject/providers": "^5.7.2",
|
|
46
46
|
"@lifi/sdk": "^2.0.0-beta.11",
|
|
47
|
-
"@lifi/wallet-management": "^2.0.0-beta.
|
|
47
|
+
"@lifi/wallet-management": "^2.0.0-beta.5",
|
|
48
48
|
"@mui/icons-material": "^5.11.16",
|
|
49
|
-
"@mui/lab": "^5.0.0-alpha.
|
|
50
|
-
"@mui/material": "^5.12.
|
|
49
|
+
"@mui/lab": "^5.0.0-alpha.129",
|
|
50
|
+
"@mui/material": "^5.12.3",
|
|
51
51
|
"@tanstack/react-query": "^4.29.5",
|
|
52
52
|
"@tanstack/react-virtual": "^3.0.0-beta.54",
|
|
53
53
|
"big.js": "^6.2.1",
|
|
@@ -60,10 +60,10 @@
|
|
|
60
60
|
"react-hook-form": "^7.43.9",
|
|
61
61
|
"react-i18next": "^12.2.2",
|
|
62
62
|
"react-intersection-observer": "^9.4.3",
|
|
63
|
-
"react-router-dom": "^6.
|
|
63
|
+
"react-router-dom": "^6.11.1",
|
|
64
64
|
"react-timer-hook": "^3.0.5",
|
|
65
65
|
"uuid": "^9.0.0",
|
|
66
|
-
"zustand": "^4.3.
|
|
66
|
+
"zustand": "^4.3.8"
|
|
67
67
|
},
|
|
68
68
|
"peerDependencies": {
|
|
69
69
|
"@types/react": "^18.0.0",
|