@b3dotfun/sdk 0.1.69-alpha.3 → 0.1.69-alpha.5
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/dist/cjs/anyspend/react/components/checkout/CheckoutPaymentPanel.js +2 -4
- package/dist/cjs/anyspend/react/hooks/useAnyspendCreateOnrampOrder.js +4 -6
- package/dist/cjs/anyspend/react/hooks/useKycStatus.d.ts +3 -1
- package/dist/cjs/anyspend/react/hooks/useKycStatus.js +11 -7
- package/dist/cjs/global-account/react/components/SignInWithB3/components/AuthButton.js +10 -1
- package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStepCustom.js +96 -15
- package/dist/cjs/global-account/react/components/SignInWithB3/utils/signInUtils.d.ts +5 -3
- package/dist/cjs/global-account/react/components/SignInWithB3/utils/signInUtils.js +15 -2
- package/dist/cjs/global-account/react/hooks/useConnect.d.ts +2 -2
- package/dist/esm/anyspend/react/components/checkout/CheckoutPaymentPanel.js +2 -4
- package/dist/esm/anyspend/react/hooks/useAnyspendCreateOnrampOrder.js +5 -7
- package/dist/esm/anyspend/react/hooks/useKycStatus.d.ts +3 -1
- package/dist/esm/anyspend/react/hooks/useKycStatus.js +9 -5
- package/dist/esm/global-account/react/components/SignInWithB3/components/AuthButton.js +11 -2
- package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStepCustom.js +100 -19
- package/dist/esm/global-account/react/components/SignInWithB3/utils/signInUtils.d.ts +5 -3
- package/dist/esm/global-account/react/components/SignInWithB3/utils/signInUtils.js +14 -1
- package/dist/esm/global-account/react/hooks/useConnect.d.ts +2 -2
- package/dist/types/anyspend/react/hooks/useKycStatus.d.ts +3 -1
- package/dist/types/global-account/react/components/SignInWithB3/utils/signInUtils.d.ts +5 -3
- package/dist/types/global-account/react/hooks/useConnect.d.ts +2 -2
- package/package.json +1 -1
- package/src/anyspend/react/components/checkout/CheckoutPaymentPanel.tsx +2 -4
- package/src/anyspend/react/hooks/useAnyspendCreateOnrampOrder.ts +5 -7
- package/src/anyspend/react/hooks/useKycStatus.ts +8 -5
- package/src/global-account/react/components/SignInWithB3/components/AuthButton.tsx +21 -2
- package/src/global-account/react/components/SignInWithB3/steps/LoginStepCustom.tsx +207 -54
- package/src/global-account/react/components/SignInWithB3/utils/signInUtils.ts +19 -3
- package/src/global-account/react/hooks/useConnect.tsx +2 -2
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
AuthButton,
|
|
4
4
|
Button,
|
|
5
5
|
getConnectOptionsFromStrategy,
|
|
6
|
+
Input,
|
|
6
7
|
isWalletType,
|
|
7
8
|
LoginStepContainer,
|
|
8
9
|
useAuthentication,
|
|
@@ -11,12 +12,21 @@ import {
|
|
|
11
12
|
useConnect,
|
|
12
13
|
WalletRow,
|
|
13
14
|
} from "@b3dotfun/sdk/global-account/react";
|
|
15
|
+
import { ecosystemWalletId } from "@b3dotfun/sdk/shared/constants";
|
|
14
16
|
import { debugB3React } from "@b3dotfun/sdk/shared/utils/debug";
|
|
15
17
|
import { client } from "@b3dotfun/sdk/shared/utils/thirdweb";
|
|
16
18
|
import { useState } from "react";
|
|
17
19
|
import { Chain } from "thirdweb";
|
|
18
|
-
import { useConnect as useConnectTW } from "thirdweb/react";
|
|
19
|
-
import {
|
|
20
|
+
import { useConnectedWallets, useConnect as useConnectTW } from "thirdweb/react";
|
|
21
|
+
import {
|
|
22
|
+
Account,
|
|
23
|
+
createWallet,
|
|
24
|
+
MultiStepAuthArgsType,
|
|
25
|
+
preAuthenticate,
|
|
26
|
+
SingleStepAuthArgsType,
|
|
27
|
+
Wallet,
|
|
28
|
+
WalletId,
|
|
29
|
+
} from "thirdweb/wallets";
|
|
20
30
|
|
|
21
31
|
interface LoginStepCustomProps {
|
|
22
32
|
automaticallySetFirstEoa: boolean;
|
|
@@ -28,6 +38,7 @@ interface LoginStepCustomProps {
|
|
|
28
38
|
}
|
|
29
39
|
|
|
30
40
|
const debug = debugB3React("LoginStepCustom");
|
|
41
|
+
const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
31
42
|
|
|
32
43
|
export function LoginStepCustom({
|
|
33
44
|
onSuccess,
|
|
@@ -40,32 +51,49 @@ export function LoginStepCustom({
|
|
|
40
51
|
const { partnerId } = useB3Config();
|
|
41
52
|
const [isLoading, setIsLoading] = useState(false);
|
|
42
53
|
const [showAllWallets, setShowAllWallets] = useState(false);
|
|
54
|
+
const [showEmailFlow, setShowEmailFlow] = useState(false);
|
|
55
|
+
const [email, setEmail] = useState("");
|
|
56
|
+
const [verificationCode, setVerificationCode] = useState("");
|
|
57
|
+
const [emailCodeSent, setEmailCodeSent] = useState(false);
|
|
58
|
+
const [emailError, setEmailError] = useState<string | null>(null);
|
|
43
59
|
const { connect } = useConnect(partnerId, chain);
|
|
44
60
|
const setIsAuthenticating = useAuthStore(state => state.setIsAuthenticating);
|
|
45
|
-
const
|
|
46
|
-
const { logout } = useAuthentication(partnerId, { skipAutoConnect: true });
|
|
61
|
+
const { connect: onAuthConnect, logout } = useAuthentication(partnerId, { skipAutoConnect: true });
|
|
47
62
|
const { connect: connectTW } = useConnectTW();
|
|
63
|
+
const connectedWallets = useConnectedWallets();
|
|
48
64
|
|
|
49
65
|
// Split strategies into auth and wallet types
|
|
50
66
|
const authStrategies = strategies.filter(s => !isWalletType(s));
|
|
51
67
|
const walletStrategies = strategies.filter(isWalletType);
|
|
52
68
|
const initialWallets = walletStrategies.slice(0, maxInitialWallets);
|
|
53
69
|
const additionalWallets = walletStrategies.slice(maxInitialWallets);
|
|
70
|
+
const authGridColumns = Math.max(1, Math.min(authStrategies.length, 4));
|
|
54
71
|
|
|
55
|
-
const
|
|
72
|
+
const resetEmailFlow = () => {
|
|
73
|
+
setShowEmailFlow(false);
|
|
74
|
+
setEmailCodeSent(false);
|
|
75
|
+
setVerificationCode("");
|
|
76
|
+
setEmailError(null);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const connectWithOptions = async (
|
|
80
|
+
strategy: AllowedStrategy,
|
|
81
|
+
options: MultiStepAuthArgsType | SingleStepAuthArgsType,
|
|
82
|
+
) => {
|
|
56
83
|
try {
|
|
57
84
|
setIsLoading(true);
|
|
58
85
|
debug("setIsAuthenticating:true:3");
|
|
59
86
|
setIsAuthenticating(true);
|
|
60
|
-
const options = getConnectOptionsFromStrategy(strategy);
|
|
61
87
|
let connectResult: Wallet | null;
|
|
62
88
|
|
|
63
|
-
if (automaticallySetFirstEoa) {
|
|
64
|
-
|
|
89
|
+
if (automaticallySetFirstEoa && isWalletType(strategy) && options.strategy === "wallet") {
|
|
90
|
+
const walletId = options.wallet?.id as WalletId | undefined;
|
|
91
|
+
if (!walletId) {
|
|
65
92
|
throw new Error("Wallet ID is required");
|
|
66
93
|
}
|
|
94
|
+
|
|
67
95
|
connectResult = await connectTW(async () => {
|
|
68
|
-
const wallet = createWallet(
|
|
96
|
+
const wallet = createWallet(walletId);
|
|
69
97
|
await wallet.connect({
|
|
70
98
|
client,
|
|
71
99
|
});
|
|
@@ -73,19 +101,27 @@ export function LoginStepCustom({
|
|
|
73
101
|
return wallet;
|
|
74
102
|
});
|
|
75
103
|
} else {
|
|
76
|
-
// @ts-expect-error we have custom strategies too and we also get things like "apple" isn't assignable to "wallet"
|
|
77
104
|
connectResult = await connect(options);
|
|
78
105
|
}
|
|
79
106
|
|
|
80
107
|
const account = connectResult?.getAccount();
|
|
81
108
|
debug("@@connectResult", { connectResult, account, options });
|
|
82
|
-
if (!account) throw new Error("Failed to connect");
|
|
109
|
+
if (!account || !connectResult) throw new Error("Failed to connect");
|
|
110
|
+
const allConnectedWallets =
|
|
111
|
+
connectedWallets.length > 0 && connectedWallets.some(wallet => wallet.id === connectResult.id)
|
|
112
|
+
? connectedWallets
|
|
113
|
+
: [connectResult, ...connectedWallets.filter(wallet => wallet.id !== connectResult.id)];
|
|
114
|
+
await onAuthConnect(connectResult, allConnectedWallets);
|
|
83
115
|
await onSuccess(account);
|
|
84
|
-
|
|
116
|
+
if (strategy === "email") {
|
|
117
|
+
resetEmailFlow();
|
|
118
|
+
}
|
|
85
119
|
} catch (error) {
|
|
120
|
+
if (strategy === "email") {
|
|
121
|
+
setEmailError(error instanceof Error ? error.message : "Failed to sign in with email");
|
|
122
|
+
}
|
|
86
123
|
await onError?.(error as Error);
|
|
87
124
|
await logout();
|
|
88
|
-
setIsAuthenticated(false);
|
|
89
125
|
} finally {
|
|
90
126
|
setIsLoading(false);
|
|
91
127
|
debug("setIsAuthenticating:false:3");
|
|
@@ -93,60 +129,177 @@ export function LoginStepCustom({
|
|
|
93
129
|
}
|
|
94
130
|
};
|
|
95
131
|
|
|
132
|
+
const handleConnect = async (strategy: AllowedStrategy) => {
|
|
133
|
+
if (strategy === "email") {
|
|
134
|
+
setShowEmailFlow(true);
|
|
135
|
+
setEmailCodeSent(false);
|
|
136
|
+
setVerificationCode("");
|
|
137
|
+
setEmailError(null);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const options = getConnectOptionsFromStrategy(strategy);
|
|
142
|
+
await connectWithOptions(strategy, options as SingleStepAuthArgsType);
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
const handleSendEmailCode = async () => {
|
|
146
|
+
const normalizedEmail = email.trim().toLowerCase();
|
|
147
|
+
if (!normalizedEmail) {
|
|
148
|
+
setEmailError("Please enter your email address");
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (!EMAIL_REGEX.test(normalizedEmail)) {
|
|
153
|
+
setEmailError("Please enter a valid email address");
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
setIsLoading(true);
|
|
159
|
+
setEmailError(null);
|
|
160
|
+
await preAuthenticate({
|
|
161
|
+
client,
|
|
162
|
+
strategy: "email",
|
|
163
|
+
email: normalizedEmail,
|
|
164
|
+
ecosystem: {
|
|
165
|
+
id: ecosystemWalletId,
|
|
166
|
+
partnerId,
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
setEmail(normalizedEmail);
|
|
170
|
+
setEmailCodeSent(true);
|
|
171
|
+
} catch (error) {
|
|
172
|
+
setEmailError(error instanceof Error ? error.message : "Failed to send verification code");
|
|
173
|
+
await onError?.(error as Error);
|
|
174
|
+
} finally {
|
|
175
|
+
setIsLoading(false);
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const handleEmailLogin = async () => {
|
|
180
|
+
const normalizedEmail = email.trim().toLowerCase();
|
|
181
|
+
const normalizedCode = verificationCode.trim();
|
|
182
|
+
|
|
183
|
+
if (!EMAIL_REGEX.test(normalizedEmail)) {
|
|
184
|
+
setEmailError("Please enter a valid email address");
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (!normalizedCode) {
|
|
189
|
+
setEmailError("Please enter your verification code");
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
await connectWithOptions("email", {
|
|
194
|
+
strategy: "email",
|
|
195
|
+
email: normalizedEmail,
|
|
196
|
+
verificationCode: normalizedCode,
|
|
197
|
+
});
|
|
198
|
+
};
|
|
199
|
+
|
|
96
200
|
return (
|
|
97
201
|
<LoginStepContainer partnerId={partnerId}>
|
|
98
|
-
{
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
onClick={() => handleConnect(strategy)}
|
|
108
|
-
isLoading={isLoading}
|
|
109
|
-
/>
|
|
110
|
-
);
|
|
111
|
-
})}
|
|
112
|
-
</div>
|
|
113
|
-
)}
|
|
114
|
-
|
|
115
|
-
{/* Initial Wallet List */}
|
|
116
|
-
<div className="mb-4 w-full space-y-2">
|
|
117
|
-
{initialWallets.map(walletId => (
|
|
118
|
-
<WalletRow
|
|
119
|
-
key={walletId}
|
|
120
|
-
walletId={walletId as WalletId}
|
|
121
|
-
onClick={() => handleConnect(walletId)}
|
|
122
|
-
isLoading={isLoading}
|
|
202
|
+
{showEmailFlow ? (
|
|
203
|
+
<div className="mb-6 w-full space-y-3 px-3">
|
|
204
|
+
<p className="text-center text-sm font-medium text-gray-900 dark:text-gray-100">Sign in with email</p>
|
|
205
|
+
<Input
|
|
206
|
+
type="email"
|
|
207
|
+
placeholder="you@example.com"
|
|
208
|
+
value={email}
|
|
209
|
+
onChange={event => setEmail(event.target.value)}
|
|
210
|
+
disabled={isLoading || emailCodeSent}
|
|
123
211
|
/>
|
|
124
|
-
))}
|
|
125
|
-
</div>
|
|
126
212
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
213
|
+
{emailCodeSent && (
|
|
214
|
+
<Input
|
|
215
|
+
type="text"
|
|
216
|
+
placeholder="Enter verification code"
|
|
217
|
+
value={verificationCode}
|
|
218
|
+
onChange={event => setVerificationCode(event.target.value)}
|
|
219
|
+
disabled={isLoading}
|
|
220
|
+
/>
|
|
221
|
+
)}
|
|
222
|
+
|
|
223
|
+
{emailError && <p className="text-sm text-red-500">{emailError}</p>}
|
|
224
|
+
|
|
130
225
|
<Button
|
|
131
|
-
onClick={
|
|
132
|
-
|
|
226
|
+
onClick={emailCodeSent ? handleEmailLogin : handleSendEmailCode}
|
|
227
|
+
disabled={isLoading}
|
|
228
|
+
className="w-full"
|
|
133
229
|
>
|
|
134
|
-
{
|
|
230
|
+
{isLoading ? "Loading..." : emailCodeSent ? "Verify code" : "Send code"}
|
|
135
231
|
</Button>
|
|
136
232
|
|
|
137
|
-
{
|
|
138
|
-
<
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
233
|
+
{emailCodeSent && (
|
|
234
|
+
<Button variant="outline" onClick={handleSendEmailCode} disabled={isLoading} className="w-full">
|
|
235
|
+
Resend code
|
|
236
|
+
</Button>
|
|
237
|
+
)}
|
|
238
|
+
|
|
239
|
+
<Button variant="outline" onClick={resetEmailFlow} disabled={isLoading} className="w-full">
|
|
240
|
+
Back
|
|
241
|
+
</Button>
|
|
242
|
+
</div>
|
|
243
|
+
) : (
|
|
244
|
+
<>
|
|
245
|
+
{/* Auth Strategies */}
|
|
246
|
+
{authStrategies.length > 0 && (
|
|
247
|
+
<div
|
|
248
|
+
className={`mb-6 grid w-full gap-4 px-3 ${authStrategies.length > 4 ? "grid-cols-4" : ""}`}
|
|
249
|
+
style={
|
|
250
|
+
authStrategies.length <= 4
|
|
251
|
+
? { gridTemplateColumns: `repeat(${authGridColumns}, minmax(0, 1fr))` }
|
|
252
|
+
: undefined
|
|
253
|
+
}
|
|
254
|
+
>
|
|
255
|
+
{authStrategies.map(strategy => (
|
|
256
|
+
<AuthButton
|
|
257
|
+
key={strategy}
|
|
258
|
+
strategy={strategy}
|
|
259
|
+
onClick={() => handleConnect(strategy)}
|
|
144
260
|
isLoading={isLoading}
|
|
145
261
|
/>
|
|
146
262
|
))}
|
|
147
263
|
</div>
|
|
148
264
|
)}
|
|
149
|
-
|
|
265
|
+
|
|
266
|
+
{/* Initial Wallet List */}
|
|
267
|
+
<div className="mb-4 w-full space-y-2">
|
|
268
|
+
{initialWallets.map(walletId => (
|
|
269
|
+
<WalletRow
|
|
270
|
+
key={walletId}
|
|
271
|
+
walletId={walletId as WalletId}
|
|
272
|
+
onClick={() => handleConnect(walletId)}
|
|
273
|
+
isLoading={isLoading}
|
|
274
|
+
/>
|
|
275
|
+
))}
|
|
276
|
+
</div>
|
|
277
|
+
|
|
278
|
+
{/* Additional Wallets Section */}
|
|
279
|
+
{additionalWallets.length > 0 && (
|
|
280
|
+
<div className="w-full">
|
|
281
|
+
<Button
|
|
282
|
+
onClick={() => setShowAllWallets(!showAllWallets)}
|
|
283
|
+
className="mb-2 w-full bg-transparent text-gray-600 hover:bg-gray-100"
|
|
284
|
+
>
|
|
285
|
+
{showAllWallets ? "Show less" : "More options"}
|
|
286
|
+
</Button>
|
|
287
|
+
|
|
288
|
+
{showAllWallets && (
|
|
289
|
+
<div className="max-h-60 space-y-2 overflow-y-auto">
|
|
290
|
+
{additionalWallets.map(walletId => (
|
|
291
|
+
<WalletRow
|
|
292
|
+
key={walletId}
|
|
293
|
+
walletId={walletId as WalletId}
|
|
294
|
+
onClick={() => handleConnect(walletId)}
|
|
295
|
+
isLoading={isLoading}
|
|
296
|
+
/>
|
|
297
|
+
))}
|
|
298
|
+
</div>
|
|
299
|
+
)}
|
|
300
|
+
</div>
|
|
301
|
+
)}
|
|
302
|
+
</>
|
|
150
303
|
)}
|
|
151
304
|
</LoginStepContainer>
|
|
152
305
|
);
|
|
@@ -5,7 +5,8 @@ type WalletType = Wallet["id"];
|
|
|
5
5
|
type StrategyType = SingleStepAuthArgsType["strategy"];
|
|
6
6
|
type CustomStrategyType = "basement" | "privy";
|
|
7
7
|
|
|
8
|
-
type AllowedStrategies = StrategyType | WalletType | CustomStrategyType;
|
|
8
|
+
type AllowedStrategies = StrategyType | WalletType | CustomStrategyType | "email";
|
|
9
|
+
type NonWalletStrategyType = Exclude<AllowedStrategies, WalletType>;
|
|
9
10
|
const customStrategies = ["basement", "privy"] as const;
|
|
10
11
|
// type CustomStrategy = (typeof customStrategies)[number];
|
|
11
12
|
|
|
@@ -13,9 +14,10 @@ export const allowedStrategies = [
|
|
|
13
14
|
// Auth strategies
|
|
14
15
|
"apple",
|
|
15
16
|
"google",
|
|
17
|
+
"github",
|
|
16
18
|
"x",
|
|
17
19
|
"discord",
|
|
18
|
-
|
|
20
|
+
"email",
|
|
19
21
|
"guest",
|
|
20
22
|
|
|
21
23
|
// Wallet IDs
|
|
@@ -36,7 +38,7 @@ export function isWalletType(strategy: AllowedStrategies): strategy is WalletTyp
|
|
|
36
38
|
return strategy === "walletConnect" || walletIdPattern.test(strategy);
|
|
37
39
|
}
|
|
38
40
|
|
|
39
|
-
export function isStrategyType(strategy: AllowedStrategies): strategy is
|
|
41
|
+
export function isStrategyType(strategy: AllowedStrategies): strategy is NonWalletStrategyType {
|
|
40
42
|
return !isWalletType(strategy);
|
|
41
43
|
}
|
|
42
44
|
|
|
@@ -49,6 +51,10 @@ export function getConnectOptionsFromStrategy(strategy: AllowedStrategy): {
|
|
|
49
51
|
throw new Error(`Invalid strategy: ${strategy}`);
|
|
50
52
|
}
|
|
51
53
|
|
|
54
|
+
if (strategy === "email") {
|
|
55
|
+
throw new Error("Email strategy requires OTP flow and cannot be connected in a single step");
|
|
56
|
+
}
|
|
57
|
+
|
|
52
58
|
if (isWalletType(strategy)) {
|
|
53
59
|
return { strategy: "wallet" as const, wallet: createWallet(strategy) };
|
|
54
60
|
} else {
|
|
@@ -65,6 +71,16 @@ export const strategyIcons: Record<string, string> = {
|
|
|
65
71
|
guest: "https://cdn.b3.fun/incognito.svg",
|
|
66
72
|
// Add more strategies as needed
|
|
67
73
|
};
|
|
74
|
+
|
|
75
|
+
export const strategyLabels: Record<string, string> = {
|
|
76
|
+
google: "Google",
|
|
77
|
+
x: "X",
|
|
78
|
+
discord: "Discord",
|
|
79
|
+
apple: "Apple",
|
|
80
|
+
guest: "Guest",
|
|
81
|
+
github: "GitHub",
|
|
82
|
+
email: "Email",
|
|
83
|
+
};
|
|
68
84
|
// Test it
|
|
69
85
|
// console.log(getConnectOptionsFromStrategy("io.metamask"));
|
|
70
86
|
// console.log(getConnectOptionsFromStrategy("google"));
|
|
@@ -4,7 +4,7 @@ import { client } from "@b3dotfun/sdk/shared/utils/thirdweb";
|
|
|
4
4
|
import { useCallback, useState } from "react";
|
|
5
5
|
import { Chain } from "thirdweb";
|
|
6
6
|
import { useConnect as useConnectTW } from "thirdweb/react";
|
|
7
|
-
import { ecosystemWallet, SingleStepAuthArgsType } from "thirdweb/wallets";
|
|
7
|
+
import { ecosystemWallet, MultiStepAuthArgsType, SingleStepAuthArgsType } from "thirdweb/wallets";
|
|
8
8
|
const debug = debugB3React("useConnect");
|
|
9
9
|
|
|
10
10
|
/**
|
|
@@ -23,7 +23,7 @@ export function useConnect(partnerId: string, chain?: Chain) {
|
|
|
23
23
|
* It is used to connect to a wallet using the thirdweb client.
|
|
24
24
|
*/
|
|
25
25
|
const connectTw = useCallback(
|
|
26
|
-
async (strategyOptions?: SingleStepAuthArgsType) => {
|
|
26
|
+
async (strategyOptions?: MultiStepAuthArgsType | SingleStepAuthArgsType) => {
|
|
27
27
|
setIsLoading(true);
|
|
28
28
|
return await connect(async () => {
|
|
29
29
|
if (!strategyOptions) throw new Error("Strategy options are required");
|