@dynamic-labs/sdk-react-core 4.0.0-alpha.36 → 4.0.0-alpha.38

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.
@@ -60,6 +60,7 @@ require('../../components/Transition/ZoomTransition/ZoomTransition.cjs');
60
60
  require('../../components/Transition/SlideInUpTransition/SlideInUpTransition.cjs');
61
61
  require('../../components/Transition/OpacityTransition/OpacityTransition.cjs');
62
62
  require('../../components/OverlayCardBase/OverlayCardTarget/OverlayCardTarget.cjs');
63
+ var Skeleton = require('../../components/Skeleton/Skeleton.cjs');
63
64
  require('../../context/SocialRedirectContext/SocialRedirectContext.cjs');
64
65
  require('../../context/WalletGroupContext/WalletGroupContext.cjs');
65
66
  require('../DynamicWidget/components/DynamicWidgetHeader/DynamicWidgetHeader.cjs');
@@ -91,7 +92,7 @@ var DynamicBridgeUserProfile = require('./components/DynamicBridgeUserProfile/Dy
91
92
  var DynamicBridgeWidgetContext = require('./context/DynamicBridgeWidgetContext/DynamicBridgeWidgetContext.cjs');
92
93
 
93
94
  const DynamicBridgeWidget = ({ className, variant = 'modal', iconVariant = 'chain', }) => {
94
- const { showAuthFlow, setShowBridgeWidget, bridgeChains, setShowAuthFlow, connectedWallets, } = useInternalDynamicContext.useInternalDynamicContext();
95
+ const { showAuthFlow, setShowBridgeWidget, bridgeChains, setShowAuthFlow, connectedWallets, sdkHasLoaded, } = useInternalDynamicContext.useInternalDynamicContext();
95
96
  const { widgetRef, inlineControlsRef } = DynamicBridgeWidgetContext.useDynamicBridgeWidgetContext();
96
97
  const { t } = reactI18next.useTranslation();
97
98
  const closeOnOutsideClick = React.useCallback((e) => {
@@ -106,6 +107,9 @@ const DynamicBridgeWidget = ({ className, variant = 'modal', iconVariant = 'chai
106
107
  index.useOnClickOutside(widgetRef, closeOnOutsideClick);
107
108
  return (jsxRuntime.jsxs(ShadowDOM.ShadowDOM, { id: 'dynamic-bridge-widget', className: 'dynamic-widget__container', children: [jsxRuntime.jsx(InlineWidget.InlineWidget, { ref: inlineControlsRef, className: className, dataTestId: 'BridgeWidgetNav', children: bridgeChains === null || bridgeChains === void 0 ? void 0 : bridgeChains.map(({ chain }) => {
108
109
  const ChainIcon = getChainIcon.getChainIcon(chain);
110
+ if (!sdkHasLoaded) {
111
+ return (jsxRuntime.jsx(InlineWidgetButton.InlineWidgetButton, { icon: jsxRuntime.jsx(ChainIcon, {}), className: 'dynamic-bridge-widget__skeleton-button', children: jsxRuntime.jsx(Skeleton.Skeleton, { className: 'dynamic-bridge-widget__skeleton' }) }, `skeleton-${chain}`));
112
+ }
109
113
  const connectedChainWallets = connectedWallets.filter(({ chain: connectedChain }) => connectedChain === chain);
110
114
  if (connectedChainWallets.length > 0) {
111
115
  return connectedChainWallets.map((wallet) => (jsxRuntime.jsx(InlineWidgetButton.InlineWidgetButton, { icon: iconVariant === 'wallet' ? (jsxRuntime.jsx(walletBook.WalletIcon, { icon: wallet.connector.metadata.icon, walletKey: wallet.connector.key })) : (jsxRuntime.jsx(ChainIcon, {})), onClick: () => setShowBridgeWidget(true), children: shortenWalletAddress.shortenWalletAddress(wallet.address) }, wallet.id)));
@@ -56,6 +56,7 @@ import '../../components/Transition/ZoomTransition/ZoomTransition.js';
56
56
  import '../../components/Transition/SlideInUpTransition/SlideInUpTransition.js';
57
57
  import '../../components/Transition/OpacityTransition/OpacityTransition.js';
58
58
  import '../../components/OverlayCardBase/OverlayCardTarget/OverlayCardTarget.js';
59
+ import { Skeleton } from '../../components/Skeleton/Skeleton.js';
59
60
  import '../../context/SocialRedirectContext/SocialRedirectContext.js';
60
61
  import '../../context/WalletGroupContext/WalletGroupContext.js';
61
62
  import '../DynamicWidget/components/DynamicWidgetHeader/DynamicWidgetHeader.js';
@@ -87,7 +88,7 @@ import { DynamicBridgeUserProfile } from './components/DynamicBridgeUserProfile/
87
88
  import { useDynamicBridgeWidgetContext } from './context/DynamicBridgeWidgetContext/DynamicBridgeWidgetContext.js';
88
89
 
89
90
  const DynamicBridgeWidget = ({ className, variant = 'modal', iconVariant = 'chain', }) => {
90
- const { showAuthFlow, setShowBridgeWidget, bridgeChains, setShowAuthFlow, connectedWallets, } = useInternalDynamicContext();
91
+ const { showAuthFlow, setShowBridgeWidget, bridgeChains, setShowAuthFlow, connectedWallets, sdkHasLoaded, } = useInternalDynamicContext();
91
92
  const { widgetRef, inlineControlsRef } = useDynamicBridgeWidgetContext();
92
93
  const { t } = useTranslation();
93
94
  const closeOnOutsideClick = useCallback((e) => {
@@ -102,6 +103,9 @@ const DynamicBridgeWidget = ({ className, variant = 'modal', iconVariant = 'chai
102
103
  useOnClickOutside(widgetRef, closeOnOutsideClick);
103
104
  return (jsxs(ShadowDOM, { id: 'dynamic-bridge-widget', className: 'dynamic-widget__container', children: [jsx(InlineWidget, { ref: inlineControlsRef, className: className, dataTestId: 'BridgeWidgetNav', children: bridgeChains === null || bridgeChains === void 0 ? void 0 : bridgeChains.map(({ chain }) => {
104
105
  const ChainIcon = getChainIcon(chain);
106
+ if (!sdkHasLoaded) {
107
+ return (jsx(InlineWidgetButton, { icon: jsx(ChainIcon, {}), className: 'dynamic-bridge-widget__skeleton-button', children: jsx(Skeleton, { className: 'dynamic-bridge-widget__skeleton' }) }, `skeleton-${chain}`));
108
+ }
105
109
  const connectedChainWallets = connectedWallets.filter(({ chain: connectedChain }) => connectedChain === chain);
106
110
  if (connectedChainWallets.length > 0) {
107
111
  return connectedChainWallets.map((wallet) => (jsx(InlineWidgetButton, { icon: iconVariant === 'wallet' ? (jsx(WalletIcon, { icon: wallet.connector.metadata.icon, walletKey: wallet.connector.key })) : (jsx(ChainIcon, {})), onClick: () => setShowBridgeWidget(true), children: shortenWalletAddress(wallet.address) }, wallet.id)));
@@ -89,11 +89,27 @@ require('../../../../../components/Popper/Popper/Popper.cjs');
89
89
  require('../../../../../components/Popper/PopperContext/PopperContext.cjs');
90
90
  require('qrcode');
91
91
 
92
- const ActiveWalletAddress = ({ address, nameServiceName, menuOption, fullWidth = false, isLoading = false, }) => {
92
+ /**
93
+ * If the wallet has no icon, returns its key, nicely formatted.
94
+ */
95
+ const getNameIfNoIcon = (wallet) => {
96
+ if (!wallet)
97
+ return undefined;
98
+ const noIcon = !wallet.connector.metadata.icon ||
99
+ wallet.connector.metadata.icon.includes('unknown-wallet');
100
+ return noIcon
101
+ ? wallet.key
102
+ .replace(/[-_]/g, ' ')
103
+ .replace(/\b\w/g, (char) => char.toUpperCase())
104
+ : undefined;
105
+ };
106
+ const ActiveWalletAddress = ({ wallet, nameServiceName, menuOption, fullWidth = false, isLoading = false, }) => {
93
107
  const { showAlert } = PasskeyContext.usePasskeyContext();
108
+ const header = nameServiceName || getNameIfNoIcon(wallet);
94
109
  return (jsxRuntime.jsxs("div", { className: 'active-wallet-information__address-container', children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx(Typography.Typography, { className: fullWidth
95
110
  ? 'active-wallet-information__handle--full-width'
96
- : 'active-wallet-information__handle', color: 'primary', variant: 'body_normal', children: nameServiceName }), jsxRuntime.jsx(Typography.Typography, { className: 'active-wallet-information__address', weight: nameServiceName ? 'regular' : 'medium', variant: nameServiceName ? 'body_small' : 'body_normal', color: nameServiceName ? 'secondary' : 'primary', children: isLoading ? (jsxRuntime.jsx(Skeleton.Skeleton, { className: 'active-wallet-information__address-skeleton' })) : (shortenWalletAddress.shortenWalletAddress(address, 4, 4)) })] }), jsxRuntime.jsx(DotsMenu.DotsMenu, { "data-testid": 'dots-menu', options: menuOption, buttonClassName: 'active-wallet-information__dots-menu', buttonClassNameWithOpenMenu: 'active-wallet-information__dots-menu', iconOverride: showAlert() ? (jsxRuntime.jsx(IconWithStatus.IconWithStatus, { Icon: () => jsxRuntime.jsx(gear.ReactComponent, { width: 16, height: 16 }), variant: 'yellow' })) : (jsxRuntime.jsx(gear.ReactComponent, { width: 16, height: 16 })) })] }));
111
+ : 'active-wallet-information__handle', color: 'primary', variant: 'body_normal', children: header }), jsxRuntime.jsx(Typography.Typography, { className: 'active-wallet-information__address', weight: header ? 'regular' : 'medium', variant: header ? 'body_small' : 'body_normal', color: header ? 'secondary' : 'primary', children: isLoading ? (jsxRuntime.jsx(Skeleton.Skeleton, { className: 'active-wallet-information__address-skeleton' })) : (shortenWalletAddress.shortenWalletAddress(wallet === null || wallet === void 0 ? void 0 : wallet.address, 4, 4)) })] }), jsxRuntime.jsx(DotsMenu.DotsMenu, { "data-testid": 'dots-menu', options: menuOption, buttonClassName: 'active-wallet-information__dots-menu', buttonClassNameWithOpenMenu: 'active-wallet-information__dots-menu', iconOverride: showAlert() ? (jsxRuntime.jsx(IconWithStatus.IconWithStatus, { Icon: () => jsxRuntime.jsx(gear.ReactComponent, { width: 16, height: 16 }), variant: 'yellow' })) : (jsxRuntime.jsx(gear.ReactComponent, { width: 16, height: 16 })) })] }));
97
112
  };
98
113
 
99
114
  exports.ActiveWalletAddress = ActiveWalletAddress;
115
+ exports.getNameIfNoIcon = getNameIfNoIcon;
@@ -1,11 +1,16 @@
1
- /// <reference types="react" />
1
+ import { FC } from 'react';
2
+ import { Wallet } from '../../../../../shared';
2
3
  import { DotsMenuOption } from '../../DotsMenu';
3
- type Props = {
4
- address?: string;
4
+ type ActiveWalletAddressProps = {
5
+ wallet: Wallet | null;
5
6
  nameServiceName?: string;
6
7
  menuOption: DotsMenuOption[];
7
8
  fullWidth?: boolean;
8
9
  isLoading?: boolean;
9
10
  };
10
- export declare const ActiveWalletAddress: ({ address, nameServiceName, menuOption, fullWidth, isLoading, }: Props) => JSX.Element;
11
+ /**
12
+ * If the wallet has no icon, returns its key, nicely formatted.
13
+ */
14
+ export declare const getNameIfNoIcon: (wallet: Wallet | null) => string | undefined;
15
+ export declare const ActiveWalletAddress: FC<ActiveWalletAddressProps>;
11
16
  export {};
@@ -85,11 +85,26 @@ import '../../../../../components/Popper/Popper/Popper.js';
85
85
  import '../../../../../components/Popper/PopperContext/PopperContext.js';
86
86
  import 'qrcode';
87
87
 
88
- const ActiveWalletAddress = ({ address, nameServiceName, menuOption, fullWidth = false, isLoading = false, }) => {
88
+ /**
89
+ * If the wallet has no icon, returns its key, nicely formatted.
90
+ */
91
+ const getNameIfNoIcon = (wallet) => {
92
+ if (!wallet)
93
+ return undefined;
94
+ const noIcon = !wallet.connector.metadata.icon ||
95
+ wallet.connector.metadata.icon.includes('unknown-wallet');
96
+ return noIcon
97
+ ? wallet.key
98
+ .replace(/[-_]/g, ' ')
99
+ .replace(/\b\w/g, (char) => char.toUpperCase())
100
+ : undefined;
101
+ };
102
+ const ActiveWalletAddress = ({ wallet, nameServiceName, menuOption, fullWidth = false, isLoading = false, }) => {
89
103
  const { showAlert } = usePasskeyContext();
104
+ const header = nameServiceName || getNameIfNoIcon(wallet);
90
105
  return (jsxs("div", { className: 'active-wallet-information__address-container', children: [jsxs("div", { children: [jsx(Typography, { className: fullWidth
91
106
  ? 'active-wallet-information__handle--full-width'
92
- : 'active-wallet-information__handle', color: 'primary', variant: 'body_normal', children: nameServiceName }), jsx(Typography, { className: 'active-wallet-information__address', weight: nameServiceName ? 'regular' : 'medium', variant: nameServiceName ? 'body_small' : 'body_normal', color: nameServiceName ? 'secondary' : 'primary', children: isLoading ? (jsx(Skeleton, { className: 'active-wallet-information__address-skeleton' })) : (shortenWalletAddress(address, 4, 4)) })] }), jsx(DotsMenu, { "data-testid": 'dots-menu', options: menuOption, buttonClassName: 'active-wallet-information__dots-menu', buttonClassNameWithOpenMenu: 'active-wallet-information__dots-menu', iconOverride: showAlert() ? (jsx(IconWithStatus, { Icon: () => jsx(SvgGear, { width: 16, height: 16 }), variant: 'yellow' })) : (jsx(SvgGear, { width: 16, height: 16 })) })] }));
107
+ : 'active-wallet-information__handle', color: 'primary', variant: 'body_normal', children: header }), jsx(Typography, { className: 'active-wallet-information__address', weight: header ? 'regular' : 'medium', variant: header ? 'body_small' : 'body_normal', color: header ? 'secondary' : 'primary', children: isLoading ? (jsx(Skeleton, { className: 'active-wallet-information__address-skeleton' })) : (shortenWalletAddress(wallet === null || wallet === void 0 ? void 0 : wallet.address, 4, 4)) })] }), jsx(DotsMenu, { "data-testid": 'dots-menu', options: menuOption, buttonClassName: 'active-wallet-information__dots-menu', buttonClassNameWithOpenMenu: 'active-wallet-information__dots-menu', iconOverride: showAlert() ? (jsx(IconWithStatus, { Icon: () => jsx(SvgGear, { width: 16, height: 16 }), variant: 'yellow' })) : (jsx(SvgGear, { width: 16, height: 16 })) })] }));
93
108
  };
94
109
 
95
- export { ActiveWalletAddress };
110
+ export { ActiveWalletAddress, getNameIfNoIcon };
@@ -177,7 +177,7 @@ const ActiveWalletInformation = ({ isLoading = false, }) => {
177
177
  return (jsxRuntime.jsx(ActiveBitcoinWalletAddresses.ActiveBitcoinWalletAddresses, { wallet: primaryWallet, menuOption: options }));
178
178
  }
179
179
  else {
180
- return (jsxRuntime.jsx(ActiveWalletAddress.ActiveWalletAddress, { address: address, nameServiceName: (nameService === null || nameService === void 0 ? void 0 : nameService.name) || (user === null || user === void 0 ? void 0 : user.email), menuOption: options, isLoading: isLoading, fullWidth: shouldHideNetwork }));
180
+ return (jsxRuntime.jsx(ActiveWalletAddress.ActiveWalletAddress, { wallet: primaryWallet, nameServiceName: (nameService === null || nameService === void 0 ? void 0 : nameService.name) || (user === null || user === void 0 ? void 0 : user.email), menuOption: options, isLoading: isLoading, fullWidth: shouldHideNetwork }));
181
181
  }
182
182
  };
183
183
  const enableMultiAsset = (authMode === 'connect-and-sign' ||
@@ -173,7 +173,7 @@ const ActiveWalletInformation = ({ isLoading = false, }) => {
173
173
  return (jsx(ActiveBitcoinWalletAddresses, { wallet: primaryWallet, menuOption: options }));
174
174
  }
175
175
  else {
176
- return (jsx(ActiveWalletAddress, { address: address, nameServiceName: (nameService === null || nameService === void 0 ? void 0 : nameService.name) || (user === null || user === void 0 ? void 0 : user.email), menuOption: options, isLoading: isLoading, fullWidth: shouldHideNetwork }));
176
+ return (jsx(ActiveWalletAddress, { wallet: primaryWallet, nameServiceName: (nameService === null || nameService === void 0 ? void 0 : nameService.name) || (user === null || user === void 0 ? void 0 : user.email), menuOption: options, isLoading: isLoading, fullWidth: shouldHideNetwork }));
177
177
  }
178
178
  };
179
179
  const enableMultiAsset = (authMode === 'connect-and-sign' ||
@@ -114,16 +114,17 @@ LinkButton.displayName = 'LinkButton';
114
114
  const DynamicWidgetWalletHeader = ({ variant, }) => {
115
115
  const { primaryWallet, user } = useInternalDynamicContext.useInternalDynamicContext();
116
116
  const { open: openSendBalanceModal } = SendBalanceContext.useSendBalance();
117
- const { supportsFunding, setShowFunding, fundingEnabled } = FundingContext.useFundingContext();
117
+ const { supportsFunding: _supportsFunding, setShowFunding, fundingEnabled, } = FundingContext.useFundingContext();
118
118
  const { setDynamicWidgetView, setIsOpen } = DynamicWidgetContext.useWidgetContext();
119
119
  const { isLoadingEmbeddedWallet } = WalletContext.useWalletContext();
120
120
  const { t } = reactI18next.useTranslation();
121
+ const supportsFunding = _supportsFunding && (primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector.isAvailable);
121
122
  const isSendBalanceEnabled = React.useMemo(() => {
122
123
  const connector = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector;
123
124
  if (!connector)
124
125
  return false;
125
126
  return walletConnectorCore.isSendBalanceWalletConnector(connector);
126
- }, [primaryWallet]);
127
+ }, [primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector]);
127
128
  const handleOnClickSend = () => {
128
129
  if (variant === 'dropdown') {
129
130
  setIsOpen(false);
@@ -106,16 +106,17 @@ LinkButton.displayName = 'LinkButton';
106
106
  const DynamicWidgetWalletHeader = ({ variant, }) => {
107
107
  const { primaryWallet, user } = useInternalDynamicContext();
108
108
  const { open: openSendBalanceModal } = useSendBalance();
109
- const { supportsFunding, setShowFunding, fundingEnabled } = useFundingContext();
109
+ const { supportsFunding: _supportsFunding, setShowFunding, fundingEnabled, } = useFundingContext();
110
110
  const { setDynamicWidgetView, setIsOpen } = useWidgetContext();
111
111
  const { isLoadingEmbeddedWallet } = useWalletContext();
112
112
  const { t } = useTranslation();
113
+ const supportsFunding = _supportsFunding && (primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector.isAvailable);
113
114
  const isSendBalanceEnabled = useMemo(() => {
114
115
  const connector = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector;
115
116
  if (!connector)
116
117
  return false;
117
118
  return isSendBalanceWalletConnector(connector);
118
- }, [primaryWallet]);
119
+ }, [primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector]);
119
120
  const handleOnClickSend = () => {
120
121
  if (variant === 'dropdown') {
121
122
  setIsOpen(false);