@dynamic-labs/sdk-react-core 4.29.1 → 4.29.2

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 (28) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/package.cjs +2 -2
  3. package/package.js +2 -2
  4. package/package.json +12 -12
  5. package/src/index.cjs +2 -0
  6. package/src/index.d.ts +1 -0
  7. package/src/index.js +1 -0
  8. package/src/lib/Main.cjs +1 -1
  9. package/src/lib/Main.js +1 -1
  10. package/src/lib/client/extension/user/useOnboardingCompleteUser/useOnboardingCompleteUser.js +1 -1
  11. package/src/lib/context/DynamicContext/DynamicContext.cjs +2 -2
  12. package/src/lib/context/DynamicContext/DynamicContext.js +2 -2
  13. package/src/lib/modals/SyncWalletPromptModal/SyncWalletPromptModal.cjs +2 -2
  14. package/src/lib/modals/SyncWalletPromptModal/SyncWalletPromptModal.js +2 -2
  15. package/src/lib/utils/hooks/index.d.ts +1 -0
  16. package/src/lib/utils/hooks/useConnectUnifiedForFunding/useConnectUnifiedForFunding.cjs +201 -0
  17. package/src/lib/utils/hooks/useConnectUnifiedForFunding/useConnectUnifiedForFunding.js +197 -0
  18. package/src/lib/utils/hooks/useDynamicWaas/useDynamicWaas.cjs +5 -2
  19. package/src/lib/utils/hooks/useDynamicWaas/useDynamicWaas.d.ts +1 -1
  20. package/src/lib/utils/hooks/useDynamicWaas/useDynamicWaas.js +5 -2
  21. package/src/lib/utils/hooks/usePayWithDynamic/index.d.ts +1 -1
  22. package/src/lib/utils/hooks/usePayWithDynamic/usePayWithDynamic.cjs +284 -0
  23. package/src/lib/utils/hooks/usePayWithDynamic/usePayWithDynamic.js +280 -0
  24. package/src/lib/utils/hooks/useWalletOptions/useWalletOptions.cjs +1 -0
  25. package/src/lib/utils/hooks/useWalletOptions/useWalletOptions.d.ts +2 -0
  26. package/src/lib/utils/hooks/useWalletOptions/useWalletOptions.js +1 -0
  27. package/src/lib/utils/hooks/useWalletUiUtils/useWalletUiUtils.cjs +2 -2
  28. package/src/lib/utils/hooks/useWalletUiUtils/useWalletUiUtils.js +2 -2
@@ -0,0 +1,280 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../../../_virtual/_tslib.js';
3
+ import { useCallback } from 'react';
4
+ import '@dynamic-labs-sdk/client/core';
5
+ import '@dynamic-labs/sdk-api-core';
6
+ import '../../../client/client.js';
7
+ import '@dynamic-labs-sdk/client';
8
+ import '../../../config/ApiEndpoint.js';
9
+ import '@dynamic-labs/utils';
10
+ import '../../constants/values.js';
11
+ import '@dynamic-labs/multi-wallet';
12
+ import { logger } from '../../../shared/logger.js';
13
+ import '../../constants/colors.js';
14
+ import 'react-international-phone';
15
+ import '@dynamic-labs/iconic';
16
+ import '@dynamic-labs/wallet-connector-core';
17
+ import 'react/jsx-runtime';
18
+ import '../../../context/ViewContext/ViewContext.js';
19
+ import '@dynamic-labs/wallet-book';
20
+ import '../../../shared/consts/index.js';
21
+ import '../../../store/state/nonce/nonce.js';
22
+ import { useProjectSettings } from '../../../store/state/projectSettings/projectSettings.js';
23
+ import '../../../locale/locale.js';
24
+ import '../../../store/state/dynamicContextProps/dynamicContextProps.js';
25
+ import '../../../store/state/primaryWalletId/primaryWalletId.js';
26
+ import '../../../store/state/connectedWalletsInfo/connectedWalletsInfo.js';
27
+ import '../../../events/dynamicEvents.js';
28
+ import { useOnboardingCompleteUser } from '../../../client/extension/user/useOnboardingCompleteUser/useOnboardingCompleteUser.js';
29
+ import { useOnrampContext } from '../../../context/OnrampContext/OnrampContext.js';
30
+ import { useConnectUnifiedForFunding } from '../useConnectUnifiedForFunding/useConnectUnifiedForFunding.js';
31
+ import { useSocialAccounts } from '../useSocialAccounts/useSocialAccounts.js';
32
+ import { usePromptAmountAndFundWithWallet } from '../useFundWithWallet/usePromptAmountAndFundWithWallet/usePromptAmountAndFundWithWallet.js';
33
+ import { usePromptAmountAndFundWithExchange } from '../usePromptAndFundWithExchange/usePromptAndFundWithExchange.js';
34
+ import { useWalletItemActions } from '../useWalletItemActions/useWalletItemActions.js';
35
+ import { getWalletOptions } from '../../../store/state/walletOptions/walletOptions.js';
36
+ import '../../../context/DynamicContext/DynamicContext.js';
37
+ import '../../../store/state/loadingAndLifecycle/loadingAndLifecycle.js';
38
+ import '../../../context/CaptchaContext/CaptchaContext.js';
39
+ import '../../../context/ErrorContext/ErrorContext.js';
40
+ import '../../../context/AccessDeniedContext/AccessDeniedContext.js';
41
+ import '../../../context/AccountExistsContext/AccountExistsContext.js';
42
+ import '../../../context/UserWalletsContext/UserWalletsContext.js';
43
+ import '../../../store/state/authMode/authMode.js';
44
+ import '../../../context/VerificationContext/VerificationContext.js';
45
+ import 'react-dom';
46
+ import '../../functions/compareChains/compareChains.js';
47
+ import '../../../views/Passkey/utils/findPrimaryEmbeddedChain/findPrimaryEmbeddedChain.js';
48
+ import '../../../context/ThemeContext/ThemeContext.js';
49
+ import '../useUserUpdateRequest/useUpdateUser/userFieldsSchema.js';
50
+ import 'bs58';
51
+ import 'yup';
52
+ import '../../../context/MockContext/MockContext.js';
53
+ import '../../../views/CollectUserDataView/useFields.js';
54
+ import '../../../context/FieldsStateContext/FieldsStateContext.js';
55
+ import '../../../context/UserFieldEditorContext/UserFieldEditorContext.js';
56
+ import '@dynamic-labs/rpc-providers';
57
+ import 'react-i18next';
58
+ import '../../../components/Accordion/components/AccordionItem/AccordionItem.js';
59
+ import '../../../components/Alert/Alert.js';
60
+ import '../../../context/WalletContext/WalletContext.js';
61
+ import '../../../components/ShadowDOM/ShadowDOM.js';
62
+ import '../../../components/IconButton/IconButton.js';
63
+ import '../../../components/InlineWidget/InlineWidget.js';
64
+ import '../../../components/Input/Input.js';
65
+ import '../../../components/IsBrowser/IsBrowser.js';
66
+ import '../../../components/MenuList/Dropdown/Dropdown.js';
67
+ import '../../../components/OverlayCard/OverlayCard.js';
68
+ import '../../../components/Transition/ZoomTransition/ZoomTransition.js';
69
+ import '../../../components/Transition/SlideInUpTransition/SlideInUpTransition.js';
70
+ import '../../../components/Transition/OpacityTransition/OpacityTransition.js';
71
+ import '../../../components/PasskeyCreatedSuccessBanner/PasskeyCreatedSuccessBanner.js';
72
+ import '../../../components/Popper/Popper/Popper.js';
73
+ import '../../../components/Popper/PopperContext/PopperContext.js';
74
+ import 'react-focus-lock';
75
+ import 'qrcode';
76
+ import 'formik';
77
+ import '../useSubdomainCheck/useSubdomainCheck.js';
78
+ import '../../../context/WalletGroupContext/WalletGroupContext.js';
79
+ import '../../../context/IpConfigurationContext/IpConfigurationContext.js';
80
+ import '../../../context/SocialRedirectContext/SocialRedirectContext.js';
81
+ import '../../../context/ConnectWithOtpContext/ConnectWithOtpContext.js';
82
+ import '../../../widgets/DynamicBridgeWidget/views/WalletsView/components/SecondaryWallets/SecondaryWallets.js';
83
+ import '@hcaptcha/react-hcaptcha';
84
+ import '../../../context/LoadingContext/LoadingContext.js';
85
+ import '../../../widgets/DynamicWidget/context/DynamicWidgetContext.js';
86
+ import '../../../widgets/DynamicWidget/helpers/convertExchangeKeyAndProviderEnum.js';
87
+ import '../../../views/ExchangeWhitelistWarning/ExchangeWhitelistWarning.js';
88
+ import '../../../context/ErrorContext/hooks/useErrorText/useErrorText.js';
89
+ import '../../../context/FooterAnimationContext/index.js';
90
+ import '@dynamic-labs/types';
91
+ import '../useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/constants.js';
92
+ import '../../../views/MfaChooseDeviceView/getMfaOptions/getMfaOptions.js';
93
+ import '../../../context/PasskeyContext/PasskeyContext.js';
94
+ import '../../../store/state/sendBalances.js';
95
+ import '../../../store/state/connectorsInitializing/connectorsInitializing.js';
96
+ import '../../../components/OverlayCardBase/OverlayCardTarget/OverlayCardTarget.js';
97
+ import '../../../widgets/DynamicWidget/components/DynamicWidgetHeader/DynamicWidgetHeader.js';
98
+ import '../../../views/TransactionConfirmationView/TransactionConfirmationView.js';
99
+ import '../../../widgets/DynamicWidget/components/PasskeyCard/PasskeyCard.js';
100
+ import '../../../../index.js';
101
+ import '../../../widgets/DynamicWidget/views/ReceiveWalletFunds/ReceiveWalletFunds.js';
102
+ import '../../../store/state/tokenBalances.js';
103
+ import '../../../store/state/multichainBalances.js';
104
+ import '../../../shared/utils/functions/getInitialUrl/getInitialUrl.js';
105
+ import { useInternalDynamicContext } from '../../../context/DynamicContext/useDynamicContext/useInternalDynamicContext/useInternalDynamicContext.js';
106
+
107
+ const usePayWithDynamic = () => {
108
+ const connectUnifiedForFunding = useConnectUnifiedForFunding();
109
+ const projectSettings = useProjectSettings();
110
+ const { linkSocialAccount, signInWithSocialAccount } = useSocialAccounts();
111
+ const user = useOnboardingCompleteUser();
112
+ const { openOnramp, setEnabledOnrampProvidersTargetValue } = useOnrampContext();
113
+ const promptWallet = usePromptAmountAndFundWithWallet();
114
+ const promptExchange = usePromptAmountAndFundWithExchange();
115
+ const { handleWalletItemClick } = useWalletItemActions();
116
+ const { walletConnectorOptions } = getWalletOptions();
117
+ const { setShowAuthFlow, setShowDynamicUserProfile } = useInternalDynamicContext();
118
+ // Flow for funding via wallet
119
+ const handleWalletFlow = useCallback(({ wallet, props, onBack }) => {
120
+ // If user is not onboarded, trigger wallet connector UI
121
+ if (!user) {
122
+ const option = walletConnectorOptions.find(({ key }) => key === wallet.connector.key);
123
+ if (option)
124
+ handleWalletItemClick(option);
125
+ }
126
+ // Prompt for amount and execute wallet funding (shows deposit screen)
127
+ promptWallet({
128
+ amount: { rule: 'exact', value: props.tokenAmount },
129
+ destinationAddress: props.destinationAddress,
130
+ network: props.network,
131
+ onBack,
132
+ token: { rule: 'exact-with-amount', value: props.tokenSymbol },
133
+ wallet: wallet,
134
+ });
135
+ setShowAuthFlow(false);
136
+ }, [
137
+ handleWalletItemClick,
138
+ promptWallet,
139
+ setShowAuthFlow,
140
+ user,
141
+ walletConnectorOptions,
142
+ ]);
143
+ // Flow for linking or signing in with social account before exchange
144
+ const handleSocialConnect = useCallback((_a) => __awaiter(void 0, [_a], void 0, function* ({ provider, exchange, props, isSocialProviderAlreadyVerified, }) {
145
+ // if connected social return since already signed in
146
+ if (isSocialProviderAlreadyVerified) {
147
+ return false;
148
+ }
149
+ const payload = {
150
+ payingWithDynamic: {
151
+ chainName: props.chainName,
152
+ destinationAddress: props.destinationAddress,
153
+ network: props.network,
154
+ tokenAmount: props.tokenAmount,
155
+ tokenSymbol: props.tokenSymbol,
156
+ },
157
+ triggerFundFromExchangeOnSuccess: exchange,
158
+ };
159
+ if (user) {
160
+ // link if user exists
161
+ yield linkSocialAccount(provider, payload);
162
+ }
163
+ else {
164
+ // sign in if no user
165
+ yield signInWithSocialAccount(provider, payload);
166
+ }
167
+ return true;
168
+ }), [linkSocialAccount, signInWithSocialAccount, user]);
169
+ // exchange flow
170
+ const handleExchangeFlow = useCallback((_b) => __awaiter(void 0, [_b], void 0, function* ({ exchange, props, onBack }) {
171
+ var _c, _d, _e, _f, _g;
172
+ const fullExchange = (_c = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.exchanges) === null || _c === void 0 ? void 0 : _c.find((e) => e.exchange === exchange);
173
+ // Social provider for this exchange, if any
174
+ const provider = fullExchange === null || fullExchange === void 0 ? void 0 : fullExchange.socialProvider;
175
+ const isProviderSocialConnectEnabled = provider &&
176
+ Boolean((_e = (_d = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) === null || _d === void 0 ? void 0 : _d.find((p) => p.provider === provider)) === null || _e === void 0 ? void 0 : _e.enabledAt);
177
+ // Check if user already verified this social provider
178
+ const isSocialProviderAlreadyVerified = (_g = (_f = user === null || user === void 0 ? void 0 : user.verifiedCredentials) === null || _f === void 0 ? void 0 : _f.some((c) => c.oauthProvider === provider)) !== null && _g !== void 0 ? _g : false;
179
+ // If exchange requires social connect, handle that first
180
+ if (isProviderSocialConnectEnabled && provider) {
181
+ const handled = yield handleSocialConnect({
182
+ exchange,
183
+ isSocialProviderAlreadyVerified,
184
+ props,
185
+ provider,
186
+ });
187
+ // Social connect flow opened, stop here
188
+ if (handled)
189
+ return;
190
+ // If already connected, prompt amount and fund with exchange
191
+ promptExchange({
192
+ exchange,
193
+ onBack,
194
+ payingWithDynamic: props,
195
+ });
196
+ return;
197
+ }
198
+ // No social provider = use on-ramp provider if configured
199
+ if (fullExchange === null || fullExchange === void 0 ? void 0 : fullExchange.onRampProvider) {
200
+ yield openOnramp({
201
+ address: props.destinationAddress,
202
+ chainName: props.chainName,
203
+ network: String(props.network),
204
+ onrampProvider: fullExchange.onRampProvider,
205
+ overrideOnRamp: true,
206
+ payingWithDynamic: true,
207
+ token: props.tokenSymbol,
208
+ tokenAmount: props.tokenAmount,
209
+ });
210
+ }
211
+ }), [
212
+ projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.exchanges,
213
+ projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers,
214
+ user === null || user === void 0 ? void 0 : user.verifiedCredentials,
215
+ handleSocialConnect,
216
+ promptExchange,
217
+ openOnramp,
218
+ ]);
219
+ const payWithDynamic = useCallback((props) => __awaiter(void 0, void 0, void 0, function* () {
220
+ try {
221
+ setEnabledOnrampProvidersTargetValue({
222
+ address: props.destinationAddress,
223
+ chainName: props.chainName,
224
+ network: String(props.network),
225
+ token: props.tokenSymbol,
226
+ tokenAmount: props.tokenAmount,
227
+ });
228
+ const result = yield connectUnifiedForFunding({
229
+ initiatedByWidget: false,
230
+ });
231
+ if (result.kind === 'wallet') {
232
+ handleWalletFlow({
233
+ onBack: () => {
234
+ setShowAuthFlow(true);
235
+ setShowDynamicUserProfile(false);
236
+ payWithDynamic(props);
237
+ },
238
+ props,
239
+ wallet: result.wallet,
240
+ });
241
+ }
242
+ else if (result.kind === 'exchange') {
243
+ yield handleExchangeFlow({
244
+ exchange: result.exchange,
245
+ onBack: () => {
246
+ setShowAuthFlow(true);
247
+ setShowDynamicUserProfile(false);
248
+ payWithDynamic(props);
249
+ },
250
+ props,
251
+ });
252
+ }
253
+ else {
254
+ yield openOnramp({
255
+ address: props.destinationAddress,
256
+ chainName: props.chainName,
257
+ network: String(props.network),
258
+ onrampProvider: result.onramp.id,
259
+ payingWithDynamic: true,
260
+ token: props.tokenSymbol,
261
+ tokenAmount: props.tokenAmount,
262
+ });
263
+ }
264
+ }
265
+ catch (error) {
266
+ logger.error('usePayWithDynamic failed', error);
267
+ }
268
+ }), [
269
+ setEnabledOnrampProvidersTargetValue,
270
+ connectUnifiedForFunding,
271
+ handleWalletFlow,
272
+ setShowAuthFlow,
273
+ setShowDynamicUserProfile,
274
+ handleExchangeFlow,
275
+ openOnramp,
276
+ ]);
277
+ return payWithDynamic;
278
+ };
279
+
280
+ export { usePayWithDynamic };
@@ -131,6 +131,7 @@ const useWalletOptions = () => {
131
131
  isInstalledOnBrowser: option.isInstalledOnBrowser,
132
132
  isWalletConnect: option.walletConnector.isWalletConnect,
133
133
  key: option.walletConnector.key,
134
+ metadata: option.walletConnector.metadata,
134
135
  name: option.name,
135
136
  };
136
137
  });
@@ -8,6 +8,7 @@ export declare const useWalletOptions: () => {
8
8
  isInstalledOnBrowser: boolean;
9
9
  isWalletConnect: boolean;
10
10
  key: string;
11
+ metadata: import("@dynamic-labs/wallet-connector-core").WalletMetadata;
11
12
  name: string;
12
13
  }[];
13
14
  selectWalletOption: (walletKey: string, selectGroupIfAvailable?: boolean) => Promise<Wallet<import("@dynamic-labs/wallet-connector-core").WalletConnectorCore.WalletConnector>>;
@@ -18,6 +19,7 @@ export declare const useWalletOptions: () => {
18
19
  isInstalledOnBrowser: boolean;
19
20
  isWalletConnect: boolean;
20
21
  key: string;
22
+ metadata: import("@dynamic-labs/wallet-connector-core").WalletMetadata;
21
23
  name: string;
22
24
  }[];
23
25
  };
@@ -127,6 +127,7 @@ const useWalletOptions = () => {
127
127
  isInstalledOnBrowser: option.isInstalledOnBrowser,
128
128
  isWalletConnect: option.walletConnector.isWalletConnect,
129
129
  key: option.walletConnector.key,
130
+ metadata: option.walletConnector.metadata,
130
131
  name: option.name,
131
132
  };
132
133
  });
@@ -65,6 +65,8 @@ require('../../../store/state/tokenBalances.cjs');
65
65
  require('../../../store/state/multichainBalances.cjs');
66
66
  require('../../../context/WalletGroupContext/WalletGroupContext.cjs');
67
67
  require('../../../shared/utils/functions/getInitialUrl/getInitialUrl.cjs');
68
+ require('../../../context/OnrampContext/OnrampContext.cjs');
69
+ require('../../../../index.cjs');
68
70
  require('react-dom');
69
71
  require('../../../components/ShadowDOM/ShadowDOM.cjs');
70
72
  require('../../../components/IconButton/IconButton.cjs');
@@ -93,13 +95,11 @@ require('../../../context/ErrorContext/hooks/useErrorText/useErrorText.cjs');
93
95
  require('../../../context/FooterAnimationContext/index.cjs');
94
96
  require('../../../views/MfaChooseDeviceView/getMfaOptions/getMfaOptions.cjs');
95
97
  require('../../../context/PasskeyContext/PasskeyContext.cjs');
96
- require('../../../context/OnrampContext/OnrampContext.cjs');
97
98
  require('../../../store/state/sendBalances.cjs');
98
99
  require('../../../components/OverlayCardBase/OverlayCardTarget/OverlayCardTarget.cjs');
99
100
  require('../../../widgets/DynamicWidget/components/DynamicWidgetHeader/DynamicWidgetHeader.cjs');
100
101
  require('../../../views/TransactionConfirmationView/TransactionConfirmationView.cjs');
101
102
  require('../../../widgets/DynamicWidget/components/PasskeyCard/PasskeyCard.cjs');
102
- require('../../../../index.cjs');
103
103
  require('../../../widgets/DynamicWidget/views/ReceiveWalletFunds/ReceiveWalletFunds.cjs');
104
104
  var SignMessageConfirmationModal = require('../../../modals/SignMessageConfirmationModal/SignMessageConfirmationModal.cjs');
105
105
  var SyncWalletPromptModal = require('../../../modals/SyncWalletPromptModal/SyncWalletPromptModal.cjs');
@@ -61,6 +61,8 @@ import '../../../store/state/tokenBalances.js';
61
61
  import '../../../store/state/multichainBalances.js';
62
62
  import '../../../context/WalletGroupContext/WalletGroupContext.js';
63
63
  import '../../../shared/utils/functions/getInitialUrl/getInitialUrl.js';
64
+ import '../../../context/OnrampContext/OnrampContext.js';
65
+ import '../../../../index.js';
64
66
  import 'react-dom';
65
67
  import '../../../components/ShadowDOM/ShadowDOM.js';
66
68
  import '../../../components/IconButton/IconButton.js';
@@ -89,13 +91,11 @@ import '../../../context/ErrorContext/hooks/useErrorText/useErrorText.js';
89
91
  import '../../../context/FooterAnimationContext/index.js';
90
92
  import '../../../views/MfaChooseDeviceView/getMfaOptions/getMfaOptions.js';
91
93
  import '../../../context/PasskeyContext/PasskeyContext.js';
92
- import '../../../context/OnrampContext/OnrampContext.js';
93
94
  import '../../../store/state/sendBalances.js';
94
95
  import '../../../components/OverlayCardBase/OverlayCardTarget/OverlayCardTarget.js';
95
96
  import '../../../widgets/DynamicWidget/components/DynamicWidgetHeader/DynamicWidgetHeader.js';
96
97
  import '../../../views/TransactionConfirmationView/TransactionConfirmationView.js';
97
98
  import '../../../widgets/DynamicWidget/components/PasskeyCard/PasskeyCard.js';
98
- import '../../../../index.js';
99
99
  import '../../../widgets/DynamicWidget/views/ReceiveWalletFunds/ReceiveWalletFunds.js';
100
100
  import { SignMessageConfirmationModal } from '../../../modals/SignMessageConfirmationModal/SignMessageConfirmationModal.js';
101
101
  import { SyncWalletPromptModal } from '../../../modals/SyncWalletPromptModal/SyncWalletPromptModal.js';