@dynamic-labs/sdk-react-core 2.1.0-alpha.17 → 2.1.0-alpha.18
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 +2 -0
- package/package.cjs +1 -1
- package/package.js +1 -1
- package/package.json +12 -12
- package/src/lib/components/SyncEmbeddedWalletAuthFlow/SyncEmbeddedWalletAuthFlow.cjs +16 -28
- package/src/lib/components/SyncEmbeddedWalletAuthFlow/SyncEmbeddedWalletAuthFlow.js +16 -28
- package/src/lib/shared/utils/functions/wallet/createWallet.d.ts +4 -0
- package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.cjs +21 -1
- package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.d.ts +1 -0
- package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.js +21 -1
- package/src/lib/utils/hooks/useUserAuth/useUserAuth.cjs +35 -35
- package/src/lib/utils/hooks/useUserAuth/useUserAuth.js +35 -35
package/CHANGELOG.md
CHANGED
package/package.cjs
CHANGED
package/package.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-labs/sdk-react-core",
|
|
3
|
-
"version": "2.1.0-alpha.
|
|
3
|
+
"version": "2.1.0-alpha.18",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/dynamic-labs/DynamicAuth.git",
|
|
@@ -18,17 +18,17 @@
|
|
|
18
18
|
"yup": "0.32.11",
|
|
19
19
|
"react-international-phone": "4.2.5",
|
|
20
20
|
"zustand": "4.5.2",
|
|
21
|
-
"@dynamic-labs/iconic": "2.1.0-alpha.
|
|
22
|
-
"@dynamic-labs/logger": "2.1.0-alpha.
|
|
23
|
-
"@dynamic-labs/multi-wallet": "2.1.0-alpha.
|
|
24
|
-
"@dynamic-labs/rpc-provider-ethereum": "2.1.0-alpha.
|
|
25
|
-
"@dynamic-labs/rpc-provider-solana": "2.1.0-alpha.
|
|
26
|
-
"@dynamic-labs/rpc-providers": "2.1.0-alpha.
|
|
27
|
-
"@dynamic-labs/types": "2.1.0-alpha.
|
|
28
|
-
"@dynamic-labs/utils": "2.1.0-alpha.
|
|
29
|
-
"@dynamic-labs/viem-utils": "2.1.0-alpha.
|
|
30
|
-
"@dynamic-labs/wallet-book": "2.1.0-alpha.
|
|
31
|
-
"@dynamic-labs/wallet-connector-core": "2.1.0-alpha.
|
|
21
|
+
"@dynamic-labs/iconic": "2.1.0-alpha.18",
|
|
22
|
+
"@dynamic-labs/logger": "2.1.0-alpha.18",
|
|
23
|
+
"@dynamic-labs/multi-wallet": "2.1.0-alpha.18",
|
|
24
|
+
"@dynamic-labs/rpc-provider-ethereum": "2.1.0-alpha.18",
|
|
25
|
+
"@dynamic-labs/rpc-provider-solana": "2.1.0-alpha.18",
|
|
26
|
+
"@dynamic-labs/rpc-providers": "2.1.0-alpha.18",
|
|
27
|
+
"@dynamic-labs/types": "2.1.0-alpha.18",
|
|
28
|
+
"@dynamic-labs/utils": "2.1.0-alpha.18",
|
|
29
|
+
"@dynamic-labs/viem-utils": "2.1.0-alpha.18",
|
|
30
|
+
"@dynamic-labs/wallet-book": "2.1.0-alpha.18",
|
|
31
|
+
"@dynamic-labs/wallet-connector-core": "2.1.0-alpha.18",
|
|
32
32
|
"eventemitter3": "5.0.1"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
@@ -13,21 +13,18 @@ require('@dynamic-labs/wallet-connector-core');
|
|
|
13
13
|
require('react/jsx-runtime');
|
|
14
14
|
require('../../context/ViewContext/ViewContext.cjs');
|
|
15
15
|
require('@dynamic-labs/wallet-book');
|
|
16
|
-
var localStorage$1 = require('../../utils/constants/localStorage.cjs');
|
|
17
16
|
require('../../utils/constants/colors.cjs');
|
|
18
17
|
require('../../utils/constants/values.cjs');
|
|
19
|
-
|
|
18
|
+
require('../../shared/utils/classes/storage/localStorage.cjs');
|
|
20
19
|
require('@dynamic-labs/utils');
|
|
21
20
|
require('../../shared/consts/index.cjs');
|
|
22
|
-
require('../../events/
|
|
21
|
+
var useDynamicEvents = require('../../utils/hooks/events/useDynamicEvents/useDynamicEvents.cjs');
|
|
23
22
|
require('../../context/CaptchaContext/CaptchaContext.cjs');
|
|
24
23
|
require('../../context/ErrorContext/ErrorContext.cjs');
|
|
25
24
|
require('@dynamic-labs/multi-wallet');
|
|
26
25
|
require('react-international-phone');
|
|
27
|
-
var isTurnkeyEnabled = require('../../utils/functions/isTurnkeyEnabled/isTurnkeyEnabled.cjs');
|
|
28
26
|
require('viem');
|
|
29
27
|
require('viem/chains');
|
|
30
|
-
var isCoinbaseWaasEnabled = require('../../utils/functions/isCoinbaseWaasEnabled/isCoinbaseWaasEnabled.cjs');
|
|
31
28
|
require('../../config/ApiEndpoint.cjs');
|
|
32
29
|
require('../../locale/locale.cjs');
|
|
33
30
|
require('../../context/AccessDeniedContext/AccessDeniedContext.cjs');
|
|
@@ -35,11 +32,12 @@ require('../../context/AccountExistsContext/AccountExistsContext.cjs');
|
|
|
35
32
|
require('../../context/UserWalletsContext/UserWalletsContext.cjs');
|
|
36
33
|
require('../../context/VerificationContext/VerificationContext.cjs');
|
|
37
34
|
require('react-dom');
|
|
35
|
+
require('../../events/dynamicEvents.cjs');
|
|
38
36
|
var useEmbeddedWallet = require('../../utils/hooks/useEmbeddedWallet/useEmbeddedWallet.cjs');
|
|
39
37
|
var WalletContext = require('../../context/WalletContext/WalletContext.cjs');
|
|
40
38
|
require('../../context/ThemeContext/ThemeContext.cjs');
|
|
41
39
|
require('@dynamic-labs/types');
|
|
42
|
-
require('../../context/LoadingContext/LoadingContext.cjs');
|
|
40
|
+
var LoadingContext = require('../../context/LoadingContext/LoadingContext.cjs');
|
|
43
41
|
require('yup');
|
|
44
42
|
require('../../context/MockContext/MockContext.cjs');
|
|
45
43
|
require('react-i18next');
|
|
@@ -81,15 +79,17 @@ var useInternalDynamicContext = require('../../context/DynamicContext/useDynamic
|
|
|
81
79
|
const SyncEmbeddedWalletAuthFlow = () => {
|
|
82
80
|
const { projectSettings, isProjectSettingsLoading, user, primaryWalletId, walletConnectorOptions, } = useInternalDynamicContext.useInternalDynamicContext();
|
|
83
81
|
const { isLoadingEmbeddedWallet } = WalletContext.useWalletContext();
|
|
84
|
-
const
|
|
85
|
-
const { createEmbeddedWallet } = useEmbeddedWallet.useEmbeddedWallet();
|
|
82
|
+
const { loading: globalLoading } = LoadingContext.useLoadingContext();
|
|
83
|
+
const { createEmbeddedWallet, shouldAutoCreateEmbeddedWallet } = useEmbeddedWallet.useEmbeddedWallet();
|
|
86
84
|
const triggeredCreate = React.useRef(false);
|
|
85
|
+
useDynamicEvents.useInternalDynamicEvents('logout', () => {
|
|
86
|
+
triggeredCreate.current = false;
|
|
87
|
+
});
|
|
87
88
|
// this is used to trigger createEmbeddedWallet
|
|
88
|
-
// when user didn't create a passkey after login
|
|
89
|
+
// when user didn't create a passkey after login,
|
|
89
90
|
// we force them to created it before they can use the app
|
|
90
91
|
// ** It must be an useEffect because some of the dependencies are async
|
|
91
92
|
React.useEffect(() => {
|
|
92
|
-
var _a, _b, _c, _d, _e, _f;
|
|
93
93
|
const createWallet = () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
94
94
|
triggeredCreate.current = true;
|
|
95
95
|
try {
|
|
@@ -99,41 +99,29 @@ const SyncEmbeddedWalletAuthFlow = () => {
|
|
|
99
99
|
return;
|
|
100
100
|
}
|
|
101
101
|
});
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
102
|
+
const shouldCreateWallet = shouldAutoCreateEmbeddedWallet();
|
|
103
|
+
if (!shouldCreateWallet ||
|
|
104
|
+
!user ||
|
|
105
105
|
isProjectSettingsLoading ||
|
|
106
106
|
!projectSettings ||
|
|
107
|
-
!hasEmbeddedWalletProviderEnabled ||
|
|
108
107
|
!walletConnectorOptions.length || // no connectors to use for the embedded wallet
|
|
109
|
-
primaryWalletId || //should not override primary wallet
|
|
110
108
|
isLoadingEmbeddedWallet || // already has a wallet
|
|
111
|
-
|
|
109
|
+
globalLoading || // this will be true if auth is in progress
|
|
112
110
|
triggeredCreate.current // already triggered
|
|
113
111
|
) {
|
|
114
112
|
return;
|
|
115
113
|
}
|
|
116
|
-
// Turnkey specific rules
|
|
117
|
-
if (
|
|
118
|
-
// if coinbase is enabled it should still call createWallet, despite the turnkey rules
|
|
119
|
-
!isCoinbaseWaasEnabled.isCoinbaseWaasEnabled(projectSettings) &&
|
|
120
|
-
isTurnkeyEnabled.isTurnkeyEnabled(projectSettings) &&
|
|
121
|
-
// If customer allows user to skip passkey creation, don't trigger createEmbeddedWallet on refresh
|
|
122
|
-
(!((_b = (_a = projectSettings.sdk) === null || _a === void 0 ? void 0 : _a.embeddedWallets) === null || _b === void 0 ? void 0 : _b.automaticEmbeddedWalletCreation) ||
|
|
123
|
-
((_d = (_c = projectSettings.sdk) === null || _c === void 0 ? void 0 : _c.embeddedWallets) === null || _d === void 0 ? void 0 : _d.allowSkippingAuthenticatorAtSignup) ||
|
|
124
|
-
!((_f = (_e = projectSettings.sdk) === null || _e === void 0 ? void 0 : _e.embeddedWallets) === null || _f === void 0 ? void 0 : _f.forceAuthenticatorAtSignup))) {
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
114
|
createWallet();
|
|
128
115
|
}, [
|
|
129
116
|
user,
|
|
130
117
|
isProjectSettingsLoading,
|
|
131
118
|
projectSettings,
|
|
132
119
|
primaryWalletId,
|
|
133
|
-
lastUsedWallet,
|
|
134
120
|
createEmbeddedWallet,
|
|
135
121
|
isLoadingEmbeddedWallet,
|
|
136
122
|
walletConnectorOptions,
|
|
123
|
+
globalLoading,
|
|
124
|
+
shouldAutoCreateEmbeddedWallet,
|
|
137
125
|
]);
|
|
138
126
|
return null;
|
|
139
127
|
};
|
|
@@ -9,21 +9,18 @@ import '@dynamic-labs/wallet-connector-core';
|
|
|
9
9
|
import 'react/jsx-runtime';
|
|
10
10
|
import '../../context/ViewContext/ViewContext.js';
|
|
11
11
|
import '@dynamic-labs/wallet-book';
|
|
12
|
-
import { LAST_USED_WALLET } from '../../utils/constants/localStorage.js';
|
|
13
12
|
import '../../utils/constants/colors.js';
|
|
14
13
|
import '../../utils/constants/values.js';
|
|
15
|
-
import
|
|
14
|
+
import '../../shared/utils/classes/storage/localStorage.js';
|
|
16
15
|
import '@dynamic-labs/utils';
|
|
17
16
|
import '../../shared/consts/index.js';
|
|
18
|
-
import '../../events/
|
|
17
|
+
import { useInternalDynamicEvents } from '../../utils/hooks/events/useDynamicEvents/useDynamicEvents.js';
|
|
19
18
|
import '../../context/CaptchaContext/CaptchaContext.js';
|
|
20
19
|
import '../../context/ErrorContext/ErrorContext.js';
|
|
21
20
|
import '@dynamic-labs/multi-wallet';
|
|
22
21
|
import 'react-international-phone';
|
|
23
|
-
import { isTurnkeyEnabled } from '../../utils/functions/isTurnkeyEnabled/isTurnkeyEnabled.js';
|
|
24
22
|
import 'viem';
|
|
25
23
|
import 'viem/chains';
|
|
26
|
-
import { isCoinbaseWaasEnabled } from '../../utils/functions/isCoinbaseWaasEnabled/isCoinbaseWaasEnabled.js';
|
|
27
24
|
import '../../config/ApiEndpoint.js';
|
|
28
25
|
import '../../locale/locale.js';
|
|
29
26
|
import '../../context/AccessDeniedContext/AccessDeniedContext.js';
|
|
@@ -31,11 +28,12 @@ import '../../context/AccountExistsContext/AccountExistsContext.js';
|
|
|
31
28
|
import '../../context/UserWalletsContext/UserWalletsContext.js';
|
|
32
29
|
import '../../context/VerificationContext/VerificationContext.js';
|
|
33
30
|
import 'react-dom';
|
|
31
|
+
import '../../events/dynamicEvents.js';
|
|
34
32
|
import { useEmbeddedWallet } from '../../utils/hooks/useEmbeddedWallet/useEmbeddedWallet.js';
|
|
35
33
|
import { useWalletContext } from '../../context/WalletContext/WalletContext.js';
|
|
36
34
|
import '../../context/ThemeContext/ThemeContext.js';
|
|
37
35
|
import '@dynamic-labs/types';
|
|
38
|
-
import '../../context/LoadingContext/LoadingContext.js';
|
|
36
|
+
import { useLoadingContext } from '../../context/LoadingContext/LoadingContext.js';
|
|
39
37
|
import 'yup';
|
|
40
38
|
import '../../context/MockContext/MockContext.js';
|
|
41
39
|
import 'react-i18next';
|
|
@@ -77,15 +75,17 @@ import { useInternalDynamicContext } from '../../context/DynamicContext/useDynam
|
|
|
77
75
|
const SyncEmbeddedWalletAuthFlow = () => {
|
|
78
76
|
const { projectSettings, isProjectSettingsLoading, user, primaryWalletId, walletConnectorOptions, } = useInternalDynamicContext();
|
|
79
77
|
const { isLoadingEmbeddedWallet } = useWalletContext();
|
|
80
|
-
const
|
|
81
|
-
const { createEmbeddedWallet } = useEmbeddedWallet();
|
|
78
|
+
const { loading: globalLoading } = useLoadingContext();
|
|
79
|
+
const { createEmbeddedWallet, shouldAutoCreateEmbeddedWallet } = useEmbeddedWallet();
|
|
82
80
|
const triggeredCreate = useRef(false);
|
|
81
|
+
useInternalDynamicEvents('logout', () => {
|
|
82
|
+
triggeredCreate.current = false;
|
|
83
|
+
});
|
|
83
84
|
// this is used to trigger createEmbeddedWallet
|
|
84
|
-
// when user didn't create a passkey after login
|
|
85
|
+
// when user didn't create a passkey after login,
|
|
85
86
|
// we force them to created it before they can use the app
|
|
86
87
|
// ** It must be an useEffect because some of the dependencies are async
|
|
87
88
|
useEffect(() => {
|
|
88
|
-
var _a, _b, _c, _d, _e, _f;
|
|
89
89
|
const createWallet = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
90
90
|
triggeredCreate.current = true;
|
|
91
91
|
try {
|
|
@@ -95,41 +95,29 @@ const SyncEmbeddedWalletAuthFlow = () => {
|
|
|
95
95
|
return;
|
|
96
96
|
}
|
|
97
97
|
});
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
const shouldCreateWallet = shouldAutoCreateEmbeddedWallet();
|
|
99
|
+
if (!shouldCreateWallet ||
|
|
100
|
+
!user ||
|
|
101
101
|
isProjectSettingsLoading ||
|
|
102
102
|
!projectSettings ||
|
|
103
|
-
!hasEmbeddedWalletProviderEnabled ||
|
|
104
103
|
!walletConnectorOptions.length || // no connectors to use for the embedded wallet
|
|
105
|
-
primaryWalletId || //should not override primary wallet
|
|
106
104
|
isLoadingEmbeddedWallet || // already has a wallet
|
|
107
|
-
|
|
105
|
+
globalLoading || // this will be true if auth is in progress
|
|
108
106
|
triggeredCreate.current // already triggered
|
|
109
107
|
) {
|
|
110
108
|
return;
|
|
111
109
|
}
|
|
112
|
-
// Turnkey specific rules
|
|
113
|
-
if (
|
|
114
|
-
// if coinbase is enabled it should still call createWallet, despite the turnkey rules
|
|
115
|
-
!isCoinbaseWaasEnabled(projectSettings) &&
|
|
116
|
-
isTurnkeyEnabled(projectSettings) &&
|
|
117
|
-
// If customer allows user to skip passkey creation, don't trigger createEmbeddedWallet on refresh
|
|
118
|
-
(!((_b = (_a = projectSettings.sdk) === null || _a === void 0 ? void 0 : _a.embeddedWallets) === null || _b === void 0 ? void 0 : _b.automaticEmbeddedWalletCreation) ||
|
|
119
|
-
((_d = (_c = projectSettings.sdk) === null || _c === void 0 ? void 0 : _c.embeddedWallets) === null || _d === void 0 ? void 0 : _d.allowSkippingAuthenticatorAtSignup) ||
|
|
120
|
-
!((_f = (_e = projectSettings.sdk) === null || _e === void 0 ? void 0 : _e.embeddedWallets) === null || _f === void 0 ? void 0 : _f.forceAuthenticatorAtSignup))) {
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
110
|
createWallet();
|
|
124
111
|
}, [
|
|
125
112
|
user,
|
|
126
113
|
isProjectSettingsLoading,
|
|
127
114
|
projectSettings,
|
|
128
115
|
primaryWalletId,
|
|
129
|
-
lastUsedWallet,
|
|
130
116
|
createEmbeddedWallet,
|
|
131
117
|
isLoadingEmbeddedWallet,
|
|
132
118
|
walletConnectorOptions,
|
|
119
|
+
globalLoading,
|
|
120
|
+
shouldAutoCreateEmbeddedWallet,
|
|
133
121
|
]);
|
|
134
122
|
return null;
|
|
135
123
|
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { WalletBookSchema } from '@dynamic-labs/wallet-book';
|
|
2
|
+
import type { WalletConnector } from '@dynamic-labs/wallet-connector-core';
|
|
3
|
+
import { WalletOption } from '../../../types';
|
|
4
|
+
export declare const createWallet: (walletBook: WalletBookSchema, wallet: WalletConnector) => WalletOption;
|
|
@@ -24,8 +24,10 @@ require('../../../context/ErrorContext/ErrorContext.cjs');
|
|
|
24
24
|
require('@dynamic-labs/multi-wallet');
|
|
25
25
|
var getAuthToken = require('../../functions/getAuthToken/getAuthToken.cjs');
|
|
26
26
|
require('react-international-phone');
|
|
27
|
+
var isTurnkeyEnabled = require('../../functions/isTurnkeyEnabled/isTurnkeyEnabled.cjs');
|
|
27
28
|
require('viem');
|
|
28
29
|
require('viem/chains');
|
|
30
|
+
var isCoinbaseWaasEnabled = require('../../functions/isCoinbaseWaasEnabled/isCoinbaseWaasEnabled.cjs');
|
|
29
31
|
require('../../../config/ApiEndpoint.cjs');
|
|
30
32
|
require('../../../locale/locale.cjs');
|
|
31
33
|
var hasEmbeddedWallet = require('../../functions/hasEmbeddedWallet/hasEmbeddedWallet.cjs');
|
|
@@ -95,7 +97,7 @@ var useInternalDynamicContext = require('../../../context/DynamicContext/useDyna
|
|
|
95
97
|
* }
|
|
96
98
|
*/
|
|
97
99
|
const useEmbeddedWallet = () => {
|
|
98
|
-
const { onboardingOnlyJwt, user } = useInternalDynamicContext.useInternalDynamicContext();
|
|
100
|
+
const { onboardingOnlyJwt, user, projectSettings, primaryWalletId } = useInternalDynamicContext.useInternalDynamicContext();
|
|
99
101
|
const { isTurnkeyWallet } = useIsTurnkeyWallet.useIsTurnkeyWallet();
|
|
100
102
|
const { createEmbeddedWallet: createCoinbaseMPCWallet, canCreateMPCWallet, createPassword, revealEmbeddedWalletKey: reveaCoinbaseMPCEmbeddedWalletKey, } = useMPCEmbeddedWallet.useMPCEmbeddedWallet();
|
|
101
103
|
const { createEmbeddedWallet: createTurnkeyEmbeddedWallet, createOrRestoreSession, createPasskey, revealEmbeddedWalletKey: revealTurnkeyEmbeddedWalletKey, getPasskeys, isSessionActive, sendOneTimeCode, } = useSecureEnclaveEmbeddedWallet.useSecureEnclaveEmbeddedWallet();
|
|
@@ -136,6 +138,23 @@ const useEmbeddedWallet = () => {
|
|
|
136
138
|
}
|
|
137
139
|
return reveaCoinbaseMPCEmbeddedWalletKey();
|
|
138
140
|
});
|
|
141
|
+
const shouldAutoCreateEmbeddedWallet = React.useCallback(() => {
|
|
142
|
+
var _a, _b;
|
|
143
|
+
const hasEmbeddedWalletProviderEnabled = isTurnkeyEnabled.isTurnkeyEnabled(projectSettings) ||
|
|
144
|
+
isCoinbaseWaasEnabled.isCoinbaseWaasEnabled(projectSettings);
|
|
145
|
+
if (!hasEmbeddedWalletProviderEnabled || primaryWalletId) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
// Turnkey specific rules
|
|
149
|
+
if (
|
|
150
|
+
// if coinbase is enabled it should still call createWallet, despite the turnkey rules
|
|
151
|
+
!isCoinbaseWaasEnabled.isCoinbaseWaasEnabled(projectSettings) &&
|
|
152
|
+
isTurnkeyEnabled.isTurnkeyEnabled(projectSettings) &&
|
|
153
|
+
!((_b = (_a = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk) === null || _a === void 0 ? void 0 : _a.embeddedWallets) === null || _b === void 0 ? void 0 : _b.automaticEmbeddedWalletCreation)) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
return true;
|
|
157
|
+
}, [primaryWalletId, projectSettings]);
|
|
139
158
|
return {
|
|
140
159
|
createEmbeddedWallet,
|
|
141
160
|
createOrRestoreSession,
|
|
@@ -146,6 +165,7 @@ const useEmbeddedWallet = () => {
|
|
|
146
165
|
isSessionActive,
|
|
147
166
|
revealWalletKey,
|
|
148
167
|
sendOneTimeCode,
|
|
168
|
+
shouldAutoCreateEmbeddedWallet,
|
|
149
169
|
userHasEmbeddedWallet,
|
|
150
170
|
};
|
|
151
171
|
};
|
|
@@ -33,5 +33,6 @@ export declare const useEmbeddedWallet: () => {
|
|
|
33
33
|
htmlContainerId?: string | undefined;
|
|
34
34
|
} | undefined) => Promise<boolean>;
|
|
35
35
|
readonly sendOneTimeCode: () => Promise<string>;
|
|
36
|
+
readonly shouldAutoCreateEmbeddedWallet: () => boolean;
|
|
36
37
|
readonly userHasEmbeddedWallet: () => boolean;
|
|
37
38
|
};
|
|
@@ -20,8 +20,10 @@ import '../../../context/ErrorContext/ErrorContext.js';
|
|
|
20
20
|
import '@dynamic-labs/multi-wallet';
|
|
21
21
|
import { getAuthToken } from '../../functions/getAuthToken/getAuthToken.js';
|
|
22
22
|
import 'react-international-phone';
|
|
23
|
+
import { isTurnkeyEnabled } from '../../functions/isTurnkeyEnabled/isTurnkeyEnabled.js';
|
|
23
24
|
import 'viem';
|
|
24
25
|
import 'viem/chains';
|
|
26
|
+
import { isCoinbaseWaasEnabled } from '../../functions/isCoinbaseWaasEnabled/isCoinbaseWaasEnabled.js';
|
|
25
27
|
import '../../../config/ApiEndpoint.js';
|
|
26
28
|
import '../../../locale/locale.js';
|
|
27
29
|
import { hasEmbeddedWallet } from '../../functions/hasEmbeddedWallet/hasEmbeddedWallet.js';
|
|
@@ -91,7 +93,7 @@ import { useInternalDynamicContext } from '../../../context/DynamicContext/useDy
|
|
|
91
93
|
* }
|
|
92
94
|
*/
|
|
93
95
|
const useEmbeddedWallet = () => {
|
|
94
|
-
const { onboardingOnlyJwt, user } = useInternalDynamicContext();
|
|
96
|
+
const { onboardingOnlyJwt, user, projectSettings, primaryWalletId } = useInternalDynamicContext();
|
|
95
97
|
const { isTurnkeyWallet } = useIsTurnkeyWallet();
|
|
96
98
|
const { createEmbeddedWallet: createCoinbaseMPCWallet, canCreateMPCWallet, createPassword, revealEmbeddedWalletKey: reveaCoinbaseMPCEmbeddedWalletKey, } = useMPCEmbeddedWallet();
|
|
97
99
|
const { createEmbeddedWallet: createTurnkeyEmbeddedWallet, createOrRestoreSession, createPasskey, revealEmbeddedWalletKey: revealTurnkeyEmbeddedWalletKey, getPasskeys, isSessionActive, sendOneTimeCode, } = useSecureEnclaveEmbeddedWallet();
|
|
@@ -132,6 +134,23 @@ const useEmbeddedWallet = () => {
|
|
|
132
134
|
}
|
|
133
135
|
return reveaCoinbaseMPCEmbeddedWalletKey();
|
|
134
136
|
});
|
|
137
|
+
const shouldAutoCreateEmbeddedWallet = useCallback(() => {
|
|
138
|
+
var _a, _b;
|
|
139
|
+
const hasEmbeddedWalletProviderEnabled = isTurnkeyEnabled(projectSettings) ||
|
|
140
|
+
isCoinbaseWaasEnabled(projectSettings);
|
|
141
|
+
if (!hasEmbeddedWalletProviderEnabled || primaryWalletId) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
// Turnkey specific rules
|
|
145
|
+
if (
|
|
146
|
+
// if coinbase is enabled it should still call createWallet, despite the turnkey rules
|
|
147
|
+
!isCoinbaseWaasEnabled(projectSettings) &&
|
|
148
|
+
isTurnkeyEnabled(projectSettings) &&
|
|
149
|
+
!((_b = (_a = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk) === null || _a === void 0 ? void 0 : _a.embeddedWallets) === null || _b === void 0 ? void 0 : _b.automaticEmbeddedWalletCreation)) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
return true;
|
|
153
|
+
}, [primaryWalletId, projectSettings]);
|
|
135
154
|
return {
|
|
136
155
|
createEmbeddedWallet,
|
|
137
156
|
createOrRestoreSession,
|
|
@@ -142,6 +161,7 @@ const useEmbeddedWallet = () => {
|
|
|
142
161
|
isSessionActive,
|
|
143
162
|
revealWalletKey,
|
|
144
163
|
sendOneTimeCode,
|
|
164
|
+
shouldAutoCreateEmbeddedWallet,
|
|
145
165
|
userHasEmbeddedWallet,
|
|
146
166
|
};
|
|
147
167
|
};
|
|
@@ -81,15 +81,15 @@ var useInternalDynamicContext = require('../../../context/DynamicContext/useDyna
|
|
|
81
81
|
|
|
82
82
|
const sleepToShowSuccessMessage = () => utils.sleep(1500);
|
|
83
83
|
const useUserAuth = ({ authMethod, }) => {
|
|
84
|
-
const { handleLogOut, setOnboardingOnlyJwt, setShowAuthFlow, setCallback, onboardingOnlyJwt, setMultiWalletWidgetState,
|
|
84
|
+
const { handleLogOut, setOnboardingOnlyJwt, setShowAuthFlow, setCallback, onboardingOnlyJwt, setMultiWalletWidgetState, } = useInternalDynamicContext.useInternalDynamicContext();
|
|
85
85
|
const { view, setView, goToInitialView } = ViewContext.useViewContext();
|
|
86
86
|
const { setLoading } = LoadingContext.useLoadingContext();
|
|
87
87
|
const { setErrorMessage, setError } = ErrorContext.useErrorContext();
|
|
88
88
|
const { setExistentAccountData } = AccountExistsContext.useAccountExistsContext();
|
|
89
|
-
const { createEmbeddedWallet } = useEmbeddedWallet.useEmbeddedWallet();
|
|
90
89
|
const { handleVerifiedUserWithJWT } = useHandleVerifiedUser.useHandleVerifiedUser();
|
|
91
90
|
const { createUserProfileByJWT } = useCreateUserProfileByJWTCallback.useCreateUserProfileByJWTCallback();
|
|
92
91
|
const { displayedDestination: formattedPhone } = VerificationContext.useVerification();
|
|
92
|
+
const { shouldAutoCreateEmbeddedWallet } = useEmbeddedWallet.useEmbeddedWallet();
|
|
93
93
|
const initAuth = (_a) => _tslib.__awaiter(void 0, [_a], void 0, function* ({ isSignIn = true, verifyFunction, onVerifySuccess, onSettled, onError, showSuccessMessage = false, skipDefaultErrorHandling = false, }) {
|
|
94
94
|
logger.logger.debug('initAuth', { authMethod, isSignIn });
|
|
95
95
|
try {
|
|
@@ -115,9 +115,13 @@ const useUserAuth = ({ authMethod, }) => {
|
|
|
115
115
|
yield createUserProfileByJWT(jwt, minifiedJwt);
|
|
116
116
|
if (isSignIn) {
|
|
117
117
|
setCallback('authSuccess');
|
|
118
|
-
yield createEmbeddedWalletIfEnabled();
|
|
119
118
|
}
|
|
120
|
-
|
|
119
|
+
// we should only close auth flow if no wallet is going to be created,
|
|
120
|
+
// otherwise there will be a glitch with auth flow closing and then reopening for passkeys
|
|
121
|
+
const shouldCreateWallet = shouldAutoCreateEmbeddedWallet();
|
|
122
|
+
if (!shouldCreateWallet) {
|
|
123
|
+
setShowAuthFlow(false);
|
|
124
|
+
}
|
|
121
125
|
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
122
126
|
}
|
|
123
127
|
catch (error) {
|
|
@@ -156,21 +160,6 @@ const useUserAuth = ({ authMethod, }) => {
|
|
|
156
160
|
}
|
|
157
161
|
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
158
162
|
});
|
|
159
|
-
const createEmbeddedWalletIfEnabled = () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
160
|
-
var _b, _c;
|
|
161
|
-
if (!((_c = (_b = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk) === null || _b === void 0 ? void 0 : _b.embeddedWallets) === null || _c === void 0 ? void 0 : _c.automaticEmbeddedWalletCreation)) {
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
try {
|
|
165
|
-
// this function will check if embedded wallet is enabled and create wallet if needed
|
|
166
|
-
// if not enabled, it will throw an error.
|
|
167
|
-
yield createEmbeddedWallet();
|
|
168
|
-
}
|
|
169
|
-
catch (e) {
|
|
170
|
-
logger.logger.debug('createEmbeddedWallet', e);
|
|
171
|
-
setShowAuthFlow(false);
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
163
|
const handleError = (error, { options = {}, onError, }) => {
|
|
175
164
|
if (error instanceof utils.NoAccessError) {
|
|
176
165
|
setView('no-access');
|
|
@@ -201,29 +190,35 @@ const useUserAuth = ({ authMethod, }) => {
|
|
|
201
190
|
setError(error.message);
|
|
202
191
|
}
|
|
203
192
|
};
|
|
204
|
-
const
|
|
193
|
+
const handleVerifyMissingFields = (_b) => _tslib.__awaiter(void 0, [_b], void 0, function* ({ missingFields, isEmailVerificationRequired, isSmsVerificationRequired, }) {
|
|
194
|
+
if (isEmailVerificationRequired &&
|
|
195
|
+
missingFields.map((field) => field.name).toString() === 'email') {
|
|
196
|
+
setView('verify-email');
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
if (isSmsVerificationRequired &&
|
|
200
|
+
missingFields.map((field) => field.name).toString() === 'phoneNumber') {
|
|
201
|
+
setView('verify-sms');
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
setView(view.type);
|
|
205
|
+
});
|
|
206
|
+
const completeAuth = (_c) => _tslib.__awaiter(void 0, [_c], void 0, function* ({ completeSignInFlow, updateJwtFunction, onValidUpdatedJwt, options = {}, }) {
|
|
205
207
|
logger.logger.debug('completeAuth', { authMethod });
|
|
206
208
|
try {
|
|
207
209
|
const { updateUserProfileResponse, isSmsVerificationRequired, isEmailVerificationRequired, missingFields, } = yield updateJwtFunction();
|
|
208
210
|
onValidUpdatedJwt === null || onValidUpdatedJwt === void 0 ? void 0 : onValidUpdatedJwt();
|
|
209
211
|
setOnboardingOnlyJwt(updateUserProfileResponse.jwt);
|
|
210
212
|
localStorage.LocalStorage.setToLS(localStorage$1.AUTH_ONBOARDING_TOKEN, updateUserProfileResponse.minifiedJwt, true);
|
|
211
|
-
if (
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
missingFields.map((field) => field.name).toString() === 'phoneNumber') {
|
|
218
|
-
setView('verify-sms');
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
else if (missingFields.length > 0) {
|
|
222
|
-
// make sure we capture the fields that are required and still missing!
|
|
223
|
-
// do not change the view, just use the current one
|
|
224
|
-
setView(view.type);
|
|
213
|
+
if (missingFields.length > 0) {
|
|
214
|
+
yield handleVerifyMissingFields({
|
|
215
|
+
isEmailVerificationRequired,
|
|
216
|
+
isSmsVerificationRequired,
|
|
217
|
+
missingFields,
|
|
218
|
+
});
|
|
225
219
|
return;
|
|
226
220
|
}
|
|
221
|
+
// no more onboarding needed, clean up onboarding jwt
|
|
227
222
|
if (onboardingOnlyJwt) {
|
|
228
223
|
yield handleVerifiedUserWithJWT(updateUserProfileResponse.jwt);
|
|
229
224
|
setOnboardingOnlyJwt(undefined);
|
|
@@ -236,7 +231,12 @@ const useUserAuth = ({ authMethod, }) => {
|
|
|
236
231
|
return;
|
|
237
232
|
}
|
|
238
233
|
}
|
|
239
|
-
|
|
234
|
+
// we should only close auth flow if no wallet is going to be created,
|
|
235
|
+
// otherwise there will be a glitch with auth flow closing and then reopening for passkeys
|
|
236
|
+
const shouldCreateWallet = shouldAutoCreateEmbeddedWallet();
|
|
237
|
+
if (!shouldCreateWallet) {
|
|
238
|
+
setShowAuthFlow(false);
|
|
239
|
+
}
|
|
240
240
|
}
|
|
241
241
|
catch (error) {
|
|
242
242
|
logger.logger.debug(error);
|
|
@@ -77,15 +77,15 @@ import { useInternalDynamicContext } from '../../../context/DynamicContext/useDy
|
|
|
77
77
|
|
|
78
78
|
const sleepToShowSuccessMessage = () => sleep(1500);
|
|
79
79
|
const useUserAuth = ({ authMethod, }) => {
|
|
80
|
-
const { handleLogOut, setOnboardingOnlyJwt, setShowAuthFlow, setCallback, onboardingOnlyJwt, setMultiWalletWidgetState,
|
|
80
|
+
const { handleLogOut, setOnboardingOnlyJwt, setShowAuthFlow, setCallback, onboardingOnlyJwt, setMultiWalletWidgetState, } = useInternalDynamicContext();
|
|
81
81
|
const { view, setView, goToInitialView } = useViewContext();
|
|
82
82
|
const { setLoading } = useLoadingContext();
|
|
83
83
|
const { setErrorMessage, setError } = useErrorContext();
|
|
84
84
|
const { setExistentAccountData } = useAccountExistsContext();
|
|
85
|
-
const { createEmbeddedWallet } = useEmbeddedWallet();
|
|
86
85
|
const { handleVerifiedUserWithJWT } = useHandleVerifiedUser();
|
|
87
86
|
const { createUserProfileByJWT } = useCreateUserProfileByJWTCallback();
|
|
88
87
|
const { displayedDestination: formattedPhone } = useVerification();
|
|
88
|
+
const { shouldAutoCreateEmbeddedWallet } = useEmbeddedWallet();
|
|
89
89
|
const initAuth = (_a) => __awaiter(void 0, [_a], void 0, function* ({ isSignIn = true, verifyFunction, onVerifySuccess, onSettled, onError, showSuccessMessage = false, skipDefaultErrorHandling = false, }) {
|
|
90
90
|
logger.debug('initAuth', { authMethod, isSignIn });
|
|
91
91
|
try {
|
|
@@ -111,9 +111,13 @@ const useUserAuth = ({ authMethod, }) => {
|
|
|
111
111
|
yield createUserProfileByJWT(jwt, minifiedJwt);
|
|
112
112
|
if (isSignIn) {
|
|
113
113
|
setCallback('authSuccess');
|
|
114
|
-
yield createEmbeddedWalletIfEnabled();
|
|
115
114
|
}
|
|
116
|
-
|
|
115
|
+
// we should only close auth flow if no wallet is going to be created,
|
|
116
|
+
// otherwise there will be a glitch with auth flow closing and then reopening for passkeys
|
|
117
|
+
const shouldCreateWallet = shouldAutoCreateEmbeddedWallet();
|
|
118
|
+
if (!shouldCreateWallet) {
|
|
119
|
+
setShowAuthFlow(false);
|
|
120
|
+
}
|
|
117
121
|
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
118
122
|
}
|
|
119
123
|
catch (error) {
|
|
@@ -152,21 +156,6 @@ const useUserAuth = ({ authMethod, }) => {
|
|
|
152
156
|
}
|
|
153
157
|
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
154
158
|
});
|
|
155
|
-
const createEmbeddedWalletIfEnabled = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
156
|
-
var _b, _c;
|
|
157
|
-
if (!((_c = (_b = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk) === null || _b === void 0 ? void 0 : _b.embeddedWallets) === null || _c === void 0 ? void 0 : _c.automaticEmbeddedWalletCreation)) {
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
try {
|
|
161
|
-
// this function will check if embedded wallet is enabled and create wallet if needed
|
|
162
|
-
// if not enabled, it will throw an error.
|
|
163
|
-
yield createEmbeddedWallet();
|
|
164
|
-
}
|
|
165
|
-
catch (e) {
|
|
166
|
-
logger.debug('createEmbeddedWallet', e);
|
|
167
|
-
setShowAuthFlow(false);
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
159
|
const handleError = (error, { options = {}, onError, }) => {
|
|
171
160
|
if (error instanceof NoAccessError) {
|
|
172
161
|
setView('no-access');
|
|
@@ -197,29 +186,35 @@ const useUserAuth = ({ authMethod, }) => {
|
|
|
197
186
|
setError(error.message);
|
|
198
187
|
}
|
|
199
188
|
};
|
|
200
|
-
const
|
|
189
|
+
const handleVerifyMissingFields = (_b) => __awaiter(void 0, [_b], void 0, function* ({ missingFields, isEmailVerificationRequired, isSmsVerificationRequired, }) {
|
|
190
|
+
if (isEmailVerificationRequired &&
|
|
191
|
+
missingFields.map((field) => field.name).toString() === 'email') {
|
|
192
|
+
setView('verify-email');
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (isSmsVerificationRequired &&
|
|
196
|
+
missingFields.map((field) => field.name).toString() === 'phoneNumber') {
|
|
197
|
+
setView('verify-sms');
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
setView(view.type);
|
|
201
|
+
});
|
|
202
|
+
const completeAuth = (_c) => __awaiter(void 0, [_c], void 0, function* ({ completeSignInFlow, updateJwtFunction, onValidUpdatedJwt, options = {}, }) {
|
|
201
203
|
logger.debug('completeAuth', { authMethod });
|
|
202
204
|
try {
|
|
203
205
|
const { updateUserProfileResponse, isSmsVerificationRequired, isEmailVerificationRequired, missingFields, } = yield updateJwtFunction();
|
|
204
206
|
onValidUpdatedJwt === null || onValidUpdatedJwt === void 0 ? void 0 : onValidUpdatedJwt();
|
|
205
207
|
setOnboardingOnlyJwt(updateUserProfileResponse.jwt);
|
|
206
208
|
LocalStorage.setToLS(AUTH_ONBOARDING_TOKEN, updateUserProfileResponse.minifiedJwt, true);
|
|
207
|
-
if (
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
missingFields.map((field) => field.name).toString() === 'phoneNumber') {
|
|
214
|
-
setView('verify-sms');
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
else if (missingFields.length > 0) {
|
|
218
|
-
// make sure we capture the fields that are required and still missing!
|
|
219
|
-
// do not change the view, just use the current one
|
|
220
|
-
setView(view.type);
|
|
209
|
+
if (missingFields.length > 0) {
|
|
210
|
+
yield handleVerifyMissingFields({
|
|
211
|
+
isEmailVerificationRequired,
|
|
212
|
+
isSmsVerificationRequired,
|
|
213
|
+
missingFields,
|
|
214
|
+
});
|
|
221
215
|
return;
|
|
222
216
|
}
|
|
217
|
+
// no more onboarding needed, clean up onboarding jwt
|
|
223
218
|
if (onboardingOnlyJwt) {
|
|
224
219
|
yield handleVerifiedUserWithJWT(updateUserProfileResponse.jwt);
|
|
225
220
|
setOnboardingOnlyJwt(undefined);
|
|
@@ -232,7 +227,12 @@ const useUserAuth = ({ authMethod, }) => {
|
|
|
232
227
|
return;
|
|
233
228
|
}
|
|
234
229
|
}
|
|
235
|
-
|
|
230
|
+
// we should only close auth flow if no wallet is going to be created,
|
|
231
|
+
// otherwise there will be a glitch with auth flow closing and then reopening for passkeys
|
|
232
|
+
const shouldCreateWallet = shouldAutoCreateEmbeddedWallet();
|
|
233
|
+
if (!shouldCreateWallet) {
|
|
234
|
+
setShowAuthFlow(false);
|
|
235
|
+
}
|
|
236
236
|
}
|
|
237
237
|
catch (error) {
|
|
238
238
|
logger.debug(error);
|