@dynamic-labs/sdk-react-core 4.9.0 → 4.9.1
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/CHANGELOG.md +17 -0
- package/package.cjs +1 -1
- package/package.js +1 -1
- package/package.json +11 -11
- package/src/lib/components/UserProfile/parts/UserProfileSocialAccount/UserProfileSocialAccount.cjs +10 -4
- package/src/lib/components/UserProfile/parts/UserProfileSocialAccount/UserProfileSocialAccount.js +10 -4
- package/src/lib/context/DynamicContext/types/SettingsOverrides.d.ts +12 -5
- package/src/lib/context/OnrampContext/useEnabledOnrampProviders/useEnabledOnrampProviders.cjs +18 -1
- package/src/lib/context/OnrampContext/useEnabledOnrampProviders/useEnabledOnrampProviders.d.ts +2 -2
- package/src/lib/context/OnrampContext/useEnabledOnrampProviders/useEnabledOnrampProviders.js +19 -2
- package/src/lib/context/SocialRedirectContext/hooks/useRedirectSocialHandler/useRedirectSocialHandler.cjs +5 -5
- package/src/lib/context/SocialRedirectContext/hooks/useRedirectSocialHandler/useRedirectSocialHandler.js +5 -5
- package/src/lib/utils/functions/findWalletOptionFor/findWalletOptionFor.cjs +1 -1
- package/src/lib/utils/functions/findWalletOptionFor/findWalletOptionFor.js +1 -1
- package/src/lib/utils/functions/generateMessages/index.cjs +19 -9
- package/src/lib/utils/functions/generateMessages/index.js +19 -9
- package/src/lib/utils/functions/index.d.ts +0 -1
- package/src/lib/utils/functions/onrampConfigurationToOnrampOption/onrampConfigurationToOnrampOption.cjs +31 -18
- package/src/lib/utils/functions/onrampConfigurationToOnrampOption/onrampConfigurationToOnrampOption.d.ts +3 -0
- package/src/lib/utils/functions/onrampConfigurationToOnrampOption/onrampConfigurationToOnrampOption.js +31 -18
- package/src/lib/utils/functions/onrampProviders/coinbase.cjs +55 -0
- package/src/lib/utils/functions/onrampProviders/coinbase.d.ts +15 -0
- package/src/lib/utils/functions/onrampProviders/coinbase.js +50 -0
- package/src/lib/utils/functions/onrampProviders/index.cjs +24 -0
- package/src/lib/utils/functions/onrampProviders/index.d.ts +11 -0
- package/src/lib/utils/functions/onrampProviders/index.js +19 -0
- package/src/lib/utils/functions/openOnrampPopup.cjs +8 -5
- package/src/lib/utils/functions/openOnrampPopup.d.ts +4 -2
- package/src/lib/utils/functions/openOnrampPopup.js +8 -5
- package/src/lib/utils/functions/socialStorage/socialStorage.d.ts +2 -0
- package/src/lib/utils/hooks/useDynamicWaas/useDynamicWaas.cjs +2 -2
- package/src/lib/utils/hooks/useDynamicWaas/useDynamicWaas.js +2 -2
- package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.cjs +2 -0
- package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.d.ts +2 -1
- package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.js +2 -0
- package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.cjs +5 -1
- package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.d.ts +5 -1
- package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.js +5 -1
- package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.cjs +2 -1
- package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.d.ts +2 -1
- package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.js +2 -1
- package/src/lib/utils/hooks/useUserAuth/useUserAuth.cjs +8 -2
- package/src/lib/utils/hooks/useUserAuth/useUserAuth.js +9 -3
- package/src/lib/widgets/OnrampWidget/OnrampWidget.cjs +11 -2
- package/src/lib/widgets/OnrampWidget/OnrampWidget.d.ts +4 -0
- package/src/lib/widgets/OnrampWidget/OnrampWidget.js +11 -2
- package/src/lib/utils/functions/coinbaseOnramp/formatCoinbaseOnrampUrl.cjs +0 -27
- package/src/lib/utils/functions/coinbaseOnramp/formatCoinbaseOnrampUrl.d.ts +0 -2
- package/src/lib/utils/functions/coinbaseOnramp/formatCoinbaseOnrampUrl.js +0 -23
- package/src/lib/utils/functions/coinbaseOnramp/index.d.ts +0 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
/**
|
|
3
|
+
* Gets the enabled non-testnet networks for a wallet
|
|
4
|
+
* @param wallet User's wallet
|
|
5
|
+
* @returns Array of enabled non-testnet networks, or empty array if no wallet or networks
|
|
6
|
+
*/
|
|
7
|
+
const getEnabledNonTestnetNetworks = (wallet) => {
|
|
8
|
+
if (!wallet ||
|
|
9
|
+
!wallet.connector ||
|
|
10
|
+
typeof wallet.connector.getEnabledNetworks !== 'function') {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
const networks = wallet.connector.getEnabledNetworks();
|
|
14
|
+
if (!networks || networks.length === 0) {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
return networks.filter((network) => !network.isTestnet);
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Formats a Coinbase onramp URL with wallet information
|
|
21
|
+
* @param url Base URL from Coinbase
|
|
22
|
+
* @param wallet User's wallet
|
|
23
|
+
* @returns Formatted URL with wallet information
|
|
24
|
+
*/
|
|
25
|
+
const formatCoinbaseOnrampUrl = (url, wallet) => {
|
|
26
|
+
const nonTestnetNetworks = getEnabledNonTestnetNetworks(wallet);
|
|
27
|
+
if (nonTestnetNetworks.length === 0 || !(wallet === null || wallet === void 0 ? void 0 : wallet.address)) {
|
|
28
|
+
return url;
|
|
29
|
+
}
|
|
30
|
+
const baseUrl = new URL(url);
|
|
31
|
+
const appId = baseUrl.searchParams.get('appId');
|
|
32
|
+
// If no appId is present, return the original URL
|
|
33
|
+
if (!appId) {
|
|
34
|
+
return url;
|
|
35
|
+
}
|
|
36
|
+
// Filter out networks with empty or undefined keys and remove duplicates
|
|
37
|
+
const uniqueNetworkKeys = Array.from(new Set(nonTestnetNetworks
|
|
38
|
+
.map((network) => network.key)
|
|
39
|
+
.filter((key) => Boolean(key))));
|
|
40
|
+
if (uniqueNetworkKeys.length === 0) {
|
|
41
|
+
return url;
|
|
42
|
+
}
|
|
43
|
+
// Construct the URL with the raw query parameters
|
|
44
|
+
const finalUrl = `${baseUrl.origin}${baseUrl.pathname}?appId=${appId}&addresses=${encodeURIComponent(JSON.stringify({
|
|
45
|
+
[wallet.address]: uniqueNetworkKeys,
|
|
46
|
+
}))}`;
|
|
47
|
+
return finalUrl;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export { formatCoinbaseOnrampUrl, getEnabledNonTestnetNetworks };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
+
|
|
6
|
+
var coinbase = require('./coinbase.cjs');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Registry of provider-specific URL formatters
|
|
10
|
+
*/
|
|
11
|
+
const providerUrlFormatters = {
|
|
12
|
+
coinbaseOnramp: coinbase.formatCoinbaseOnrampUrl,
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Registry of provider display modes (iframe or popup)
|
|
16
|
+
*/
|
|
17
|
+
const providerDisplayModes = {
|
|
18
|
+
coinbaseOnramp: 'popup',
|
|
19
|
+
// Default for other providers is iframe
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
exports.formatCoinbaseOnrampUrl = coinbase.formatCoinbaseOnrampUrl;
|
|
23
|
+
exports.providerDisplayModes = providerDisplayModes;
|
|
24
|
+
exports.providerUrlFormatters = providerUrlFormatters;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Wallet } from '@dynamic-labs/wallet-connector-core';
|
|
2
|
+
import { formatCoinbaseOnrampUrl } from './coinbase';
|
|
3
|
+
/**
|
|
4
|
+
* Registry of provider-specific URL formatters
|
|
5
|
+
*/
|
|
6
|
+
export declare const providerUrlFormatters: Record<string, (url: string, wallet: Wallet) => string>;
|
|
7
|
+
/**
|
|
8
|
+
* Registry of provider display modes (iframe or popup)
|
|
9
|
+
*/
|
|
10
|
+
export declare const providerDisplayModes: Record<string, 'iframe' | 'popup'>;
|
|
11
|
+
export { formatCoinbaseOnrampUrl };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
import { formatCoinbaseOnrampUrl } from './coinbase.js';
|
|
3
|
+
export { formatCoinbaseOnrampUrl } from './coinbase.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Registry of provider-specific URL formatters
|
|
7
|
+
*/
|
|
8
|
+
const providerUrlFormatters = {
|
|
9
|
+
coinbaseOnramp: formatCoinbaseOnrampUrl,
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Registry of provider display modes (iframe or popup)
|
|
13
|
+
*/
|
|
14
|
+
const providerDisplayModes = {
|
|
15
|
+
coinbaseOnramp: 'popup',
|
|
16
|
+
// Default for other providers is iframe
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export { providerDisplayModes, providerUrlFormatters };
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
5
|
|
|
6
6
|
var _tslib = require('../../../../_virtual/_tslib.cjs');
|
|
7
|
-
var
|
|
7
|
+
var sdkApiCore = require('@dynamic-labs/sdk-api-core');
|
|
8
|
+
var index = require('./onrampProviders/index.cjs');
|
|
8
9
|
var openPopup = require('./openPopup/openPopup.cjs');
|
|
9
10
|
|
|
10
11
|
const ONRAMP_POPUP_CONFIG = {
|
|
@@ -12,15 +13,17 @@ const ONRAMP_POPUP_CONFIG = {
|
|
|
12
13
|
width: 500,
|
|
13
14
|
};
|
|
14
15
|
/**
|
|
15
|
-
* Opens an onramp popup
|
|
16
|
+
* Opens an onramp popup and sets up event listeners to handle popup closure
|
|
16
17
|
* @param url The base URL to open in the popup
|
|
17
18
|
* @param wallet The user's wallet (optional)
|
|
18
19
|
* @param setShowOnramp Callback to update the UI state when popup is closed
|
|
20
|
+
* @param provider The onramp provider ID
|
|
19
21
|
* @returns A promise that resolves when the popup is opened
|
|
20
22
|
*/
|
|
21
|
-
const openOnrampPopup = (
|
|
22
|
-
// Format the URL with wallet information
|
|
23
|
-
const
|
|
23
|
+
const openOnrampPopup = (url_1, wallet_1, setShowOnramp_1, ...args_1) => _tslib.__awaiter(void 0, [url_1, wallet_1, setShowOnramp_1, ...args_1], void 0, function* (url, wallet, setShowOnramp, provider = sdkApiCore.OnrampProviders.CoinbaseOnramp) {
|
|
24
|
+
// Format the URL with wallet information if a formatter exists for this provider
|
|
25
|
+
const formatUrl = index.providerUrlFormatters[provider] || ((url) => url);
|
|
26
|
+
const formattedUrl = wallet ? formatUrl(url, wallet) : url;
|
|
24
27
|
// Open the popup - errors will propagate to the caller
|
|
25
28
|
yield openPopup.openPopup(formattedUrl, ONRAMP_POPUP_CONFIG.width, ONRAMP_POPUP_CONFIG.height, () => {
|
|
26
29
|
// When the popup is closed (by user or programmatically), update the UI
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import type { Wallet } from '@dynamic-labs/wallet-connector-core';
|
|
2
|
+
import { OnrampProviders } from '@dynamic-labs/sdk-api-core';
|
|
2
3
|
export declare const ONRAMP_POPUP_CONFIG: {
|
|
3
4
|
readonly height: 600;
|
|
4
5
|
readonly width: 500;
|
|
5
6
|
};
|
|
6
7
|
/**
|
|
7
|
-
* Opens an onramp popup
|
|
8
|
+
* Opens an onramp popup and sets up event listeners to handle popup closure
|
|
8
9
|
* @param url The base URL to open in the popup
|
|
9
10
|
* @param wallet The user's wallet (optional)
|
|
10
11
|
* @param setShowOnramp Callback to update the UI state when popup is closed
|
|
12
|
+
* @param provider The onramp provider ID
|
|
11
13
|
* @returns A promise that resolves when the popup is opened
|
|
12
14
|
*/
|
|
13
|
-
export declare const openOnrampPopup: (url: string, wallet: Wallet | undefined, setShowOnramp: (show: boolean) => void) => Promise<void>;
|
|
15
|
+
export declare const openOnrampPopup: (url: string, wallet: Wallet | undefined, setShowOnramp: (show: boolean) => void, provider?: OnrampProviders) => Promise<void>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
import { __awaiter } from '../../../../_virtual/_tslib.js';
|
|
3
|
-
import {
|
|
3
|
+
import { OnrampProviders } from '@dynamic-labs/sdk-api-core';
|
|
4
|
+
import { providerUrlFormatters } from './onrampProviders/index.js';
|
|
4
5
|
import { openPopup } from './openPopup/openPopup.js';
|
|
5
6
|
|
|
6
7
|
const ONRAMP_POPUP_CONFIG = {
|
|
@@ -8,15 +9,17 @@ const ONRAMP_POPUP_CONFIG = {
|
|
|
8
9
|
width: 500,
|
|
9
10
|
};
|
|
10
11
|
/**
|
|
11
|
-
* Opens an onramp popup
|
|
12
|
+
* Opens an onramp popup and sets up event listeners to handle popup closure
|
|
12
13
|
* @param url The base URL to open in the popup
|
|
13
14
|
* @param wallet The user's wallet (optional)
|
|
14
15
|
* @param setShowOnramp Callback to update the UI state when popup is closed
|
|
16
|
+
* @param provider The onramp provider ID
|
|
15
17
|
* @returns A promise that resolves when the popup is opened
|
|
16
18
|
*/
|
|
17
|
-
const openOnrampPopup = (
|
|
18
|
-
// Format the URL with wallet information
|
|
19
|
-
const
|
|
19
|
+
const openOnrampPopup = (url_1, wallet_1, setShowOnramp_1, ...args_1) => __awaiter(void 0, [url_1, wallet_1, setShowOnramp_1, ...args_1], void 0, function* (url, wallet, setShowOnramp, provider = OnrampProviders.CoinbaseOnramp) {
|
|
20
|
+
// Format the URL with wallet information if a formatter exists for this provider
|
|
21
|
+
const formatUrl = providerUrlFormatters[provider] || ((url) => url);
|
|
22
|
+
const formattedUrl = wallet ? formatUrl(url, wallet) : url;
|
|
20
23
|
// Open the popup - errors will propagate to the caller
|
|
21
24
|
yield openPopup(formattedUrl, ONRAMP_POPUP_CONFIG.width, ONRAMP_POPUP_CONFIG.height, () => {
|
|
22
25
|
// When the popup is closed (by user or programmatically), update the UI
|
|
@@ -13,6 +13,8 @@ export type SocialStorageItem = {
|
|
|
13
13
|
code?: string;
|
|
14
14
|
/** Social auth mode, either sign-in or link */
|
|
15
15
|
mode: SocialAuthMode;
|
|
16
|
+
/** Whether to show the widget after a connection is made */
|
|
17
|
+
showWidgetAfterConnection?: boolean;
|
|
16
18
|
};
|
|
17
19
|
export type SocialStorage = Partial<Record<ProviderEnum, SocialStorageItem>>;
|
|
18
20
|
export declare const searchSocialStorageByState: (targetState: string) => SocialStorageItem | undefined;
|
|
@@ -133,8 +133,8 @@ const useDynamicWaas = () => {
|
|
|
133
133
|
}
|
|
134
134
|
if (!walletConnectorOptions.length || !environmentId || !apiBaseUrl)
|
|
135
135
|
return undefined;
|
|
136
|
-
const
|
|
137
|
-
|
|
136
|
+
const walletConnector = (_a = walletConnectorOptions.find((option) => option.key.includes(dynamicWaasKey) &&
|
|
137
|
+
option.walletConnector.connectedChain === chainName)) === null || _a === void 0 ? void 0 : _a.walletConnector;
|
|
138
138
|
if (!walletConnector) {
|
|
139
139
|
throw new utils.DynamicError(constants.DYNAMIC_WAAS_CONNECTOR_NOT_FOUND_ERROR);
|
|
140
140
|
}
|
|
@@ -129,8 +129,8 @@ const useDynamicWaas = () => {
|
|
|
129
129
|
}
|
|
130
130
|
if (!walletConnectorOptions.length || !environmentId || !apiBaseUrl)
|
|
131
131
|
return undefined;
|
|
132
|
-
const
|
|
133
|
-
|
|
132
|
+
const walletConnector = (_a = walletConnectorOptions.find((option) => option.key.includes(dynamicWaasKey) &&
|
|
133
|
+
option.walletConnector.connectedChain === chainName)) === null || _a === void 0 ? void 0 : _a.walletConnector;
|
|
134
134
|
if (!walletConnector) {
|
|
135
135
|
throw new DynamicError(DYNAMIC_WAAS_CONNECTOR_NOT_FOUND_ERROR);
|
|
136
136
|
}
|
|
@@ -160,6 +160,7 @@ const useEmbeddedWallet = () => {
|
|
|
160
160
|
return revealTurnkeyEmbeddedWalletKey(options);
|
|
161
161
|
});
|
|
162
162
|
const shouldPromptForKeyExport = React.useCallback(() => { var _a; return Boolean((_a = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _a === void 0 ? void 0 : _a.promptForKeyExport); }, [projectSettings]);
|
|
163
|
+
const embeddedWalletSettingVersion = React.useCallback(() => { var _a; return (_a = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _a === void 0 ? void 0 : _a.defaultWalletVersion; }, [projectSettings]);
|
|
163
164
|
const shouldAutoCreateEmbeddedWallet = React.useCallback((verifiedUser) => {
|
|
164
165
|
var _a, _b, _c, _d, _e, _f;
|
|
165
166
|
const hasEmbeddedWalletProviderEnabled = isTurnkeyEnabled.isTurnkeyEnabled(projectSettings);
|
|
@@ -197,6 +198,7 @@ const useEmbeddedWallet = () => {
|
|
|
197
198
|
createEmbeddedWalletAccount,
|
|
198
199
|
createOrRestoreSession,
|
|
199
200
|
createPasskey,
|
|
201
|
+
embeddedWalletSettingVersion,
|
|
200
202
|
getPasskeys,
|
|
201
203
|
getWalletVersion,
|
|
202
204
|
isLoadingEmbeddedWallet,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EmbeddedWalletChainEnum } from '@dynamic-labs/sdk-api-core';
|
|
1
|
+
import { EmbeddedWalletChainEnum, EmbeddedWalletVersionEnum } from '@dynamic-labs/sdk-api-core';
|
|
2
2
|
import { Wallet } from '../../../shared';
|
|
3
3
|
import { UserProfile } from '../../../..';
|
|
4
4
|
/**
|
|
@@ -27,6 +27,7 @@ export declare const useEmbeddedWallet: () => {
|
|
|
27
27
|
readonly createPasskey: (options: {
|
|
28
28
|
oneTimeCode: string;
|
|
29
29
|
} | undefined) => Promise<import("dist/packages/wallet-connector-core/src").WebAuthnAttestation>;
|
|
30
|
+
readonly embeddedWalletSettingVersion: () => EmbeddedWalletVersionEnum | undefined;
|
|
30
31
|
readonly getPasskeys: () => Promise<import("@dynamic-labs/sdk-api-core").UserPasskey[]>;
|
|
31
32
|
readonly getWalletVersion: () => import(".").EmbeddedWalletVersion | undefined;
|
|
32
33
|
readonly isLoadingEmbeddedWallet: boolean;
|
|
@@ -156,6 +156,7 @@ const useEmbeddedWallet = () => {
|
|
|
156
156
|
return revealTurnkeyEmbeddedWalletKey(options);
|
|
157
157
|
});
|
|
158
158
|
const shouldPromptForKeyExport = useCallback(() => { var _a; return Boolean((_a = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _a === void 0 ? void 0 : _a.promptForKeyExport); }, [projectSettings]);
|
|
159
|
+
const embeddedWalletSettingVersion = useCallback(() => { var _a; return (_a = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _a === void 0 ? void 0 : _a.defaultWalletVersion; }, [projectSettings]);
|
|
159
160
|
const shouldAutoCreateEmbeddedWallet = useCallback((verifiedUser) => {
|
|
160
161
|
var _a, _b, _c, _d, _e, _f;
|
|
161
162
|
const hasEmbeddedWalletProviderEnabled = isTurnkeyEnabled(projectSettings);
|
|
@@ -193,6 +194,7 @@ const useEmbeddedWallet = () => {
|
|
|
193
194
|
createEmbeddedWalletAccount,
|
|
194
195
|
createOrRestoreSession,
|
|
195
196
|
createPasskey,
|
|
197
|
+
embeddedWalletSettingVersion,
|
|
196
198
|
getPasskeys,
|
|
197
199
|
getWalletVersion,
|
|
198
200
|
isLoadingEmbeddedWallet,
|
|
@@ -144,11 +144,15 @@ const useSocialAccounts = () => {
|
|
|
144
144
|
}
|
|
145
145
|
return true;
|
|
146
146
|
}, [handleError, projectSettings]);
|
|
147
|
-
const linkSocialAccount = React.useCallback((provider_1, ...args_1) => _tslib.__awaiter(void 0, [provider_1, ...args_1], void 0, function* (provider, { redirectUrl } = {
|
|
147
|
+
const linkSocialAccount = React.useCallback((provider_1, ...args_1) => _tslib.__awaiter(void 0, [provider_1, ...args_1], void 0, function* (provider, { redirectUrl, showWidgetAfterConnection } = {
|
|
148
|
+
redirectUrl: undefined,
|
|
149
|
+
showWidgetAfterConnection: false,
|
|
150
|
+
}) {
|
|
148
151
|
connectSocialAccount({
|
|
149
152
|
authMode: 'link',
|
|
150
153
|
provider,
|
|
151
154
|
redirectUrl,
|
|
155
|
+
showWidgetAfterConnection,
|
|
152
156
|
validator: checkValidOAuthLinking,
|
|
153
157
|
});
|
|
154
158
|
}), [checkValidOAuthLinking, connectSocialAccount]);
|
|
@@ -5,6 +5,10 @@ type ConnectSocialProps = {
|
|
|
5
5
|
* Overrides the redirectUrl provided by DynamicContextProvider
|
|
6
6
|
*/
|
|
7
7
|
redirectUrl?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Whether to show the widget after a connection is made
|
|
10
|
+
*/
|
|
11
|
+
showWidgetAfterConnection?: boolean;
|
|
8
12
|
};
|
|
9
13
|
export declare const useSocialAccounts: () => {
|
|
10
14
|
readonly error: import("@dynamic-labs/types").SocialOAuthError | undefined;
|
|
@@ -12,7 +16,7 @@ export declare const useSocialAccounts: () => {
|
|
|
12
16
|
readonly getLinkedAccounts: (provider: ProviderEnum) => SocialAccountInformation[];
|
|
13
17
|
readonly isLinked: (provider: ProviderEnum) => boolean;
|
|
14
18
|
readonly isProcessing: boolean;
|
|
15
|
-
readonly linkSocialAccount: (provider: ProviderEnum, { redirectUrl }?: ConnectSocialProps) => Promise<void>;
|
|
19
|
+
readonly linkSocialAccount: (provider: ProviderEnum, { redirectUrl, showWidgetAfterConnection }?: ConnectSocialProps) => Promise<void>;
|
|
16
20
|
readonly signInWithSocialAccount: (provider: ProviderEnum, { redirectUrl }?: ConnectSocialProps) => Promise<void>;
|
|
17
21
|
readonly unlinkSocialAccount: (provider: ProviderEnum, verifiedCredentialId?: string) => Promise<void>;
|
|
18
22
|
};
|
|
@@ -140,11 +140,15 @@ const useSocialAccounts = () => {
|
|
|
140
140
|
}
|
|
141
141
|
return true;
|
|
142
142
|
}, [handleError, projectSettings]);
|
|
143
|
-
const linkSocialAccount = useCallback((provider_1, ...args_1) => __awaiter(void 0, [provider_1, ...args_1], void 0, function* (provider, { redirectUrl } = {
|
|
143
|
+
const linkSocialAccount = useCallback((provider_1, ...args_1) => __awaiter(void 0, [provider_1, ...args_1], void 0, function* (provider, { redirectUrl, showWidgetAfterConnection } = {
|
|
144
|
+
redirectUrl: undefined,
|
|
145
|
+
showWidgetAfterConnection: false,
|
|
146
|
+
}) {
|
|
144
147
|
connectSocialAccount({
|
|
145
148
|
authMode: 'link',
|
|
146
149
|
provider,
|
|
147
150
|
redirectUrl,
|
|
151
|
+
showWidgetAfterConnection,
|
|
148
152
|
validator: checkValidOAuthLinking,
|
|
149
153
|
});
|
|
150
154
|
}), [checkValidOAuthLinking, connectSocialAccount]);
|
|
@@ -354,7 +354,7 @@ const useSocialAuth = ({ onSettled, onError, onFarcasterUrl, }) => {
|
|
|
354
354
|
shouldRegisterSessionKeysOnSignin,
|
|
355
355
|
signInAccount,
|
|
356
356
|
]);
|
|
357
|
-
const connectSocialAccount = React.useCallback((_c) => _tslib.__awaiter(void 0, [_c], void 0, function* ({ authMode, provider, validator, captchaToken, redirectUrl, telegramAuthToken, }) {
|
|
357
|
+
const connectSocialAccount = React.useCallback((_c) => _tslib.__awaiter(void 0, [_c], void 0, function* ({ authMode, provider, validator, captchaToken, redirectUrl, telegramAuthToken, showWidgetAfterConnection, }) {
|
|
358
358
|
var _d, _e;
|
|
359
359
|
clearError();
|
|
360
360
|
setIsProcessing(true);
|
|
@@ -388,6 +388,7 @@ const useSocialAuth = ({ onSettled, onError, onFarcasterUrl, }) => {
|
|
|
388
388
|
captchaToken,
|
|
389
389
|
codeVerifier: usingPkce ? verifier : undefined,
|
|
390
390
|
mode: authMode,
|
|
391
|
+
showWidgetAfterConnection,
|
|
391
392
|
state,
|
|
392
393
|
});
|
|
393
394
|
const loginUrlString = getOauthLoginUrl.getOauthLoginUrl((_d = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) !== null && _d !== void 0 ? _d : [], provider);
|
|
@@ -14,6 +14,7 @@ export type ConnectSocialAccountProps = {
|
|
|
14
14
|
captchaToken?: string;
|
|
15
15
|
redirectUrl?: string;
|
|
16
16
|
telegramAuthToken?: string;
|
|
17
|
+
showWidgetAfterConnection?: boolean;
|
|
17
18
|
};
|
|
18
19
|
export declare const useSocialAuth: ({ onSettled, onError, onFarcasterUrl, }: UseSocialAuthProps) => {
|
|
19
20
|
readonly checkValidProvider: (provider: ProviderEnum, authMode: SocialAuthMode) => boolean;
|
|
@@ -27,7 +28,7 @@ export declare const useSocialAuth: ({ onSettled, onError, onFarcasterUrl, }: Us
|
|
|
27
28
|
telegramAuthToken?: string | undefined;
|
|
28
29
|
forceCreateUser?: boolean | undefined;
|
|
29
30
|
}) => Promise<void>;
|
|
30
|
-
readonly connectSocialAccount: ({ authMode, provider, validator, captchaToken, redirectUrl, telegramAuthToken, }: ConnectSocialAccountProps) => Promise<void>;
|
|
31
|
+
readonly connectSocialAccount: ({ authMode, provider, validator, captchaToken, redirectUrl, telegramAuthToken, showWidgetAfterConnection, }: ConnectSocialAccountProps) => Promise<void>;
|
|
31
32
|
readonly error: SocialOAuthError | undefined;
|
|
32
33
|
readonly handleError: (provider: ProviderEnum | undefined, code: SocialOAuthErrorCode, message: string, options?: {
|
|
33
34
|
raiseAuthFailure?: boolean | undefined;
|
|
@@ -350,7 +350,7 @@ const useSocialAuth = ({ onSettled, onError, onFarcasterUrl, }) => {
|
|
|
350
350
|
shouldRegisterSessionKeysOnSignin,
|
|
351
351
|
signInAccount,
|
|
352
352
|
]);
|
|
353
|
-
const connectSocialAccount = useCallback((_c) => __awaiter(void 0, [_c], void 0, function* ({ authMode, provider, validator, captchaToken, redirectUrl, telegramAuthToken, }) {
|
|
353
|
+
const connectSocialAccount = useCallback((_c) => __awaiter(void 0, [_c], void 0, function* ({ authMode, provider, validator, captchaToken, redirectUrl, telegramAuthToken, showWidgetAfterConnection, }) {
|
|
354
354
|
var _d, _e;
|
|
355
355
|
clearError();
|
|
356
356
|
setIsProcessing(true);
|
|
@@ -384,6 +384,7 @@ const useSocialAuth = ({ onSettled, onError, onFarcasterUrl, }) => {
|
|
|
384
384
|
captchaToken,
|
|
385
385
|
codeVerifier: usingPkce ? verifier : undefined,
|
|
386
386
|
mode: authMode,
|
|
387
|
+
showWidgetAfterConnection,
|
|
387
388
|
state,
|
|
388
389
|
});
|
|
389
390
|
const loginUrlString = getOauthLoginUrl((_d = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) !== null && _d !== void 0 ? _d : [], provider);
|
|
@@ -108,7 +108,7 @@ const useUserAuth = ({ authMethod, }) => {
|
|
|
108
108
|
const { setErrorMessage, setError } = ErrorContext.useErrorContext();
|
|
109
109
|
const { setExistentAccountData } = AccountExistsContext.useAccountExistsContext();
|
|
110
110
|
const handleAuthenticatedUser = useHandleAuthenticatedUser.useHandleAuthenticatedUser();
|
|
111
|
-
const { shouldAutoCreateEmbeddedWallet, shouldPromptForKeyExport } = useEmbeddedWallet.useEmbeddedWallet();
|
|
111
|
+
const { shouldAutoCreateEmbeddedWallet, shouldPromptForKeyExport, embeddedWalletSettingVersion, } = useEmbeddedWallet.useEmbeddedWallet();
|
|
112
112
|
const isVerifyResponse = (response) => response.user;
|
|
113
113
|
const initAuth = (_a) => _tslib.__awaiter(void 0, [_a], void 0, function* ({ isSignIn = true, verifyFunction, onVerifySuccess, onSettled, onError, showSuccessMessage = false, skipDefaultErrorHandling = false, }) {
|
|
114
114
|
var _b;
|
|
@@ -145,6 +145,7 @@ const useUserAuth = ({ authMethod, }) => {
|
|
|
145
145
|
// we should only close auth flow if no wallet is going to be created or there is no key export
|
|
146
146
|
// otherwise there will be a glitch with auth flow closing and then reopening for passkeys or export
|
|
147
147
|
const shouldCreateWallet = shouldAutoCreateEmbeddedWallet(verifiedUser);
|
|
148
|
+
// only support export prompt on v2 and higher
|
|
148
149
|
const shouldPromptExport = shouldPromptForKeyExport();
|
|
149
150
|
if (showSuccessMessage) {
|
|
150
151
|
// this timeout is set to make sure that the user will see success message
|
|
@@ -153,7 +154,12 @@ const useUserAuth = ({ authMethod, }) => {
|
|
|
153
154
|
if (isSignIn) {
|
|
154
155
|
setCallback('authSuccess');
|
|
155
156
|
}
|
|
156
|
-
|
|
157
|
+
const walletVersion = embeddedWalletSettingVersion();
|
|
158
|
+
if (walletVersion === sdkApiCore.EmbeddedWalletVersionEnum.V1 &&
|
|
159
|
+
shouldCreateWallet) {
|
|
160
|
+
setShowAuthFlow(true);
|
|
161
|
+
}
|
|
162
|
+
else if (!shouldCreateWallet || !shouldPromptExport) {
|
|
157
163
|
setShowAuthFlow(false);
|
|
158
164
|
}
|
|
159
165
|
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
import { __awaiter } from '../../../../../_virtual/_tslib.js';
|
|
3
3
|
import { DynamicError, MfaInvalidOtpError, MfaRateLimitedError, EmailAlreadyExistsError, CustomFieldNotUniqueError, UsernameAlreadyExistsError, TooManyEmailVerificationsError, InvalidPhoneNumberError, NoAccessError, AccountExistsError, SandboxMaximumThresholdReachedError, UserHasAccountWithEmailError, sleep } from '@dynamic-labs/utils';
|
|
4
|
-
import { MfaBackupCodeAcknowledgement } from '@dynamic-labs/sdk-api-core';
|
|
4
|
+
import { EmbeddedWalletVersionEnum, MfaBackupCodeAcknowledgement } from '@dynamic-labs/sdk-api-core';
|
|
5
5
|
import { useAccountExistsContext } from '../../../context/AccountExistsContext/AccountExistsContext.js';
|
|
6
6
|
import 'react';
|
|
7
7
|
import '../../../context/DynamicContext/DynamicContext.js';
|
|
@@ -104,7 +104,7 @@ const useUserAuth = ({ authMethod, }) => {
|
|
|
104
104
|
const { setErrorMessage, setError } = useErrorContext();
|
|
105
105
|
const { setExistentAccountData } = useAccountExistsContext();
|
|
106
106
|
const handleAuthenticatedUser = useHandleAuthenticatedUser();
|
|
107
|
-
const { shouldAutoCreateEmbeddedWallet, shouldPromptForKeyExport } = useEmbeddedWallet();
|
|
107
|
+
const { shouldAutoCreateEmbeddedWallet, shouldPromptForKeyExport, embeddedWalletSettingVersion, } = useEmbeddedWallet();
|
|
108
108
|
const isVerifyResponse = (response) => response.user;
|
|
109
109
|
const initAuth = (_a) => __awaiter(void 0, [_a], void 0, function* ({ isSignIn = true, verifyFunction, onVerifySuccess, onSettled, onError, showSuccessMessage = false, skipDefaultErrorHandling = false, }) {
|
|
110
110
|
var _b;
|
|
@@ -141,6 +141,7 @@ const useUserAuth = ({ authMethod, }) => {
|
|
|
141
141
|
// we should only close auth flow if no wallet is going to be created or there is no key export
|
|
142
142
|
// otherwise there will be a glitch with auth flow closing and then reopening for passkeys or export
|
|
143
143
|
const shouldCreateWallet = shouldAutoCreateEmbeddedWallet(verifiedUser);
|
|
144
|
+
// only support export prompt on v2 and higher
|
|
144
145
|
const shouldPromptExport = shouldPromptForKeyExport();
|
|
145
146
|
if (showSuccessMessage) {
|
|
146
147
|
// this timeout is set to make sure that the user will see success message
|
|
@@ -149,7 +150,12 @@ const useUserAuth = ({ authMethod, }) => {
|
|
|
149
150
|
if (isSignIn) {
|
|
150
151
|
setCallback('authSuccess');
|
|
151
152
|
}
|
|
152
|
-
|
|
153
|
+
const walletVersion = embeddedWalletSettingVersion();
|
|
154
|
+
if (walletVersion === EmbeddedWalletVersionEnum.V1 &&
|
|
155
|
+
shouldCreateWallet) {
|
|
156
|
+
setShowAuthFlow(true);
|
|
157
|
+
}
|
|
158
|
+
else if (!shouldCreateWallet || !shouldPromptExport) {
|
|
153
159
|
setShowAuthFlow(false);
|
|
154
160
|
}
|
|
155
161
|
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
@@ -95,14 +95,23 @@ require('../../components/IsBrowser/IsBrowser.cjs');
|
|
|
95
95
|
require('../../components/Popper/Popper/Popper.cjs');
|
|
96
96
|
require('../../components/Popper/PopperContext/PopperContext.cjs');
|
|
97
97
|
|
|
98
|
+
/**
|
|
99
|
+
* Widget for displaying iframe-based onramp providers
|
|
100
|
+
* Note: Popup-based providers (like Coinbase) are handled separately in their onClick handlers
|
|
101
|
+
*/
|
|
98
102
|
const OnrampWidget = () => {
|
|
99
103
|
const { showOnramp, selectedOnramp, onrampEnabled, setShowOnramp } = OnrampContext.useOnrampContext();
|
|
100
104
|
const [onrampRef, setOnrampRef] = React.useState(null);
|
|
101
105
|
index.useOnClickOutside(onrampRef, () => setShowOnramp(false));
|
|
102
|
-
|
|
106
|
+
const shouldRenderWidget = onrampEnabled &&
|
|
107
|
+
selectedOnramp &&
|
|
108
|
+
selectedOnramp.openMode === 'iframe' &&
|
|
109
|
+
selectedOnramp.url;
|
|
110
|
+
// If onramp is not enabled or there's no selected onramp, don't render anything
|
|
111
|
+
if (!shouldRenderWidget) {
|
|
103
112
|
return null;
|
|
104
113
|
}
|
|
105
|
-
return (jsxRuntime.jsx(ShadowDOM.ShadowDOM, { children: jsxRuntime.jsxs(OpacityTransition.OpacityTransition, { isShown: showOnramp, children: [jsxRuntime.jsx("div", { className: 'onramp-widget__backdrop', "aria-hidden": 'true', "data-testid": 'onramp-widget-backdrop' }), jsxRuntime.jsx("div", { className: 'onramp-widget__modal', children: jsxRuntime.jsx("iframe", { id: 'onramp-iframe', src: selectedOnramp.
|
|
114
|
+
return (jsxRuntime.jsx(ShadowDOM.ShadowDOM, { children: jsxRuntime.jsxs(OpacityTransition.OpacityTransition, { isShown: showOnramp, children: [jsxRuntime.jsx("div", { className: 'onramp-widget__backdrop', "aria-hidden": 'true', "data-testid": 'onramp-widget-backdrop' }), jsxRuntime.jsx("div", { className: 'onramp-widget__modal', children: jsxRuntime.jsx("iframe", { id: 'onramp-iframe', src: selectedOnramp.url, allow: 'camera *;geolocation *', title: 'Crypto Onramp', ref: setOnrampRef, "data-testid": 'onramp-widget-modal' }) })] }) }));
|
|
106
115
|
};
|
|
107
116
|
|
|
108
117
|
exports.OnrampWidget = OnrampWidget;
|
|
@@ -91,14 +91,23 @@ import '../../components/IsBrowser/IsBrowser.js';
|
|
|
91
91
|
import '../../components/Popper/Popper/Popper.js';
|
|
92
92
|
import '../../components/Popper/PopperContext/PopperContext.js';
|
|
93
93
|
|
|
94
|
+
/**
|
|
95
|
+
* Widget for displaying iframe-based onramp providers
|
|
96
|
+
* Note: Popup-based providers (like Coinbase) are handled separately in their onClick handlers
|
|
97
|
+
*/
|
|
94
98
|
const OnrampWidget = () => {
|
|
95
99
|
const { showOnramp, selectedOnramp, onrampEnabled, setShowOnramp } = useOnrampContext();
|
|
96
100
|
const [onrampRef, setOnrampRef] = useState(null);
|
|
97
101
|
useOnClickOutside(onrampRef, () => setShowOnramp(false));
|
|
98
|
-
|
|
102
|
+
const shouldRenderWidget = onrampEnabled &&
|
|
103
|
+
selectedOnramp &&
|
|
104
|
+
selectedOnramp.openMode === 'iframe' &&
|
|
105
|
+
selectedOnramp.url;
|
|
106
|
+
// If onramp is not enabled or there's no selected onramp, don't render anything
|
|
107
|
+
if (!shouldRenderWidget) {
|
|
99
108
|
return null;
|
|
100
109
|
}
|
|
101
|
-
return (jsx(ShadowDOM, { children: jsxs(OpacityTransition, { isShown: showOnramp, children: [jsx("div", { className: 'onramp-widget__backdrop', "aria-hidden": 'true', "data-testid": 'onramp-widget-backdrop' }), jsx("div", { className: 'onramp-widget__modal', children: jsx("iframe", { id: 'onramp-iframe', src: selectedOnramp.
|
|
110
|
+
return (jsx(ShadowDOM, { children: jsxs(OpacityTransition, { isShown: showOnramp, children: [jsx("div", { className: 'onramp-widget__backdrop', "aria-hidden": 'true', "data-testid": 'onramp-widget-backdrop' }), jsx("div", { className: 'onramp-widget__modal', children: jsx("iframe", { id: 'onramp-iframe', src: selectedOnramp.url, allow: 'camera *;geolocation *', title: 'Crypto Onramp', ref: setOnrampRef, "data-testid": 'onramp-widget-modal' }) })] }) }));
|
|
102
111
|
};
|
|
103
112
|
|
|
104
113
|
export { OnrampWidget };
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
-
|
|
6
|
-
const formatCoinbaseOnrampUrl = (url, wallet) => {
|
|
7
|
-
if (wallet) {
|
|
8
|
-
const networks = wallet.connector.getEnabledNetworks();
|
|
9
|
-
if (!networks || networks.length === 0) {
|
|
10
|
-
return url;
|
|
11
|
-
}
|
|
12
|
-
const filteredNetworks = networks.filter((network) => !network.isTestnet);
|
|
13
|
-
const onlyKeys = filteredNetworks
|
|
14
|
-
.filter((network) => Boolean(network.key)) // filter out networks without keys
|
|
15
|
-
.map((network) => network.key);
|
|
16
|
-
const addressesObj = {
|
|
17
|
-
[wallet.address]: onlyKeys,
|
|
18
|
-
};
|
|
19
|
-
const baseUrl = new URL(url);
|
|
20
|
-
// Construct the URL with the raw query parameters
|
|
21
|
-
const finalUrl = `${baseUrl.origin}${baseUrl.pathname}?appId=${baseUrl.searchParams.get('appId')}&addresses=${encodeURIComponent(JSON.stringify(addressesObj))}`;
|
|
22
|
-
return finalUrl;
|
|
23
|
-
}
|
|
24
|
-
return url;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
exports.formatCoinbaseOnrampUrl = formatCoinbaseOnrampUrl;
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
const formatCoinbaseOnrampUrl = (url, wallet) => {
|
|
3
|
-
if (wallet) {
|
|
4
|
-
const networks = wallet.connector.getEnabledNetworks();
|
|
5
|
-
if (!networks || networks.length === 0) {
|
|
6
|
-
return url;
|
|
7
|
-
}
|
|
8
|
-
const filteredNetworks = networks.filter((network) => !network.isTestnet);
|
|
9
|
-
const onlyKeys = filteredNetworks
|
|
10
|
-
.filter((network) => Boolean(network.key)) // filter out networks without keys
|
|
11
|
-
.map((network) => network.key);
|
|
12
|
-
const addressesObj = {
|
|
13
|
-
[wallet.address]: onlyKeys,
|
|
14
|
-
};
|
|
15
|
-
const baseUrl = new URL(url);
|
|
16
|
-
// Construct the URL with the raw query parameters
|
|
17
|
-
const finalUrl = `${baseUrl.origin}${baseUrl.pathname}?appId=${baseUrl.searchParams.get('appId')}&addresses=${encodeURIComponent(JSON.stringify(addressesObj))}`;
|
|
18
|
-
return finalUrl;
|
|
19
|
-
}
|
|
20
|
-
return url;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export { formatCoinbaseOnrampUrl };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { formatCoinbaseOnrampUrl } from './formatCoinbaseOnrampUrl';
|