@dynamic-labs/sdk-react-core 4.0.0-alpha.2 → 4.0.0-alpha.3

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.
@@ -1,9 +1,9 @@
1
1
  'use client'
2
2
  import { __awaiter } from '../../../../../_virtual/_tslib.js';
3
- import { useMemo, useState } from 'react';
3
+ import { useMemo, useState, useCallback } from 'react';
4
4
  import { ProviderEnum } from '@dynamic-labs/sdk-api-core';
5
5
  import { SocialOAuthErrorCode } from '@dynamic-labs/types';
6
- import { isMobile, Oauth2Service, PlatformService, SocialAccountAlreadyExistsError } from '@dynamic-labs/utils';
6
+ import { SocialAccountAlreadyExistsError, PlatformService, isMobile, Oauth2Service } from '@dynamic-labs/utils';
7
7
  import '../../../context/DynamicContext/DynamicContext.js';
8
8
  import { logger } from '../../../shared/logger.js';
9
9
  import '@dynamic-labs/iconic';
@@ -28,7 +28,7 @@ import { getProviderByType } from '../../functions/getProviderByType/getProvider
28
28
  import { randomString } from '../../functions/randomString/randomString.js';
29
29
  import '../../../config/ApiEndpoint.js';
30
30
  import '../../../store/state/user/user.js';
31
- import { getOAuthResult, initAuth, telegramSignIn, signInOAuth, telegramVerify, verifyOAuth, farcasterSignIn, farcasterVerify } from '../../../data/api/oauth/oauth.js';
31
+ import { telegramSignIn, signInOAuth, telegramVerify, verifyOAuth, getOAuthResult, initAuth, farcasterSignIn, farcasterVerify } from '../../../data/api/oauth/oauth.js';
32
32
  import '../../../locale/locale.js';
33
33
  import '../../../store/state/projectSettings/projectSettings.js';
34
34
  import '../../../context/AccessDeniedContext/AccessDeniedContext.js';
@@ -130,11 +130,11 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
130
130
  });
131
131
  const [isProcessing, setIsProcessing] = useState(false);
132
132
  const [error, setError] = useState();
133
- const clearError = () => {
133
+ const clearError = useCallback(() => {
134
134
  setError(undefined);
135
135
  setContextError(undefined);
136
- };
137
- const onFailed = (provider, reason, options) => {
136
+ }, [setContextError]);
137
+ const onFailed = useCallback((provider, reason, options) => {
138
138
  setIsProcessing(false);
139
139
  onError === null || onError === void 0 ? void 0 : onError();
140
140
  onSettled === null || onSettled === void 0 ? void 0 : onSettled();
@@ -144,15 +144,15 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
144
144
  provider,
145
145
  type: 'social',
146
146
  }, reason);
147
- };
148
- const handleError = (provider, code, message, options) => {
147
+ }, [onError, onSettled]);
148
+ const handleError = useCallback((provider, code, message, options) => {
149
149
  const error = { code, message };
150
150
  logger.error(message);
151
151
  setError(error);
152
152
  setErrorMessage(code);
153
153
  onFailed(provider, { error }, options);
154
- };
155
- const checkValidProvider = (provider, authMode) => {
154
+ }, [onFailed, setErrorMessage]);
155
+ const checkValidProvider = useCallback((provider, authMode) => {
156
156
  if (!provider) {
157
157
  handleError(provider, SocialOAuthErrorCode.NO_PROVIDER, 'Provider is required', { raiseAuthFailure: authMode === 'signin' });
158
158
  return false;
@@ -162,8 +162,8 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
162
162
  return false;
163
163
  }
164
164
  return true;
165
- };
166
- const linkAccount = (provider, apiCall) => __awaiter(void 0, void 0, void 0, function* () {
165
+ }, [handleError]);
166
+ const linkAccount = useCallback((provider, apiCall) => __awaiter(void 0, void 0, void 0, function* () {
167
167
  try {
168
168
  const response = yield apiCall();
169
169
  if (!response) {
@@ -177,112 +177,16 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
177
177
  handleError(provider, SocialOAuthErrorCode.ACCOUNT_ALREADY_LINKED_TO_DIFFERENT_PROFILE, `Social account already linked to a different profile: ${provider}`, { raiseAuthFailure: false });
178
178
  }
179
179
  }
180
- });
181
- const signInAccount = (provider, apiCall) => __awaiter(void 0, void 0, void 0, function* () {
180
+ }), [handleError, onSettled]);
181
+ const signInAccount = useCallback((provider, apiCall) => __awaiter(void 0, void 0, void 0, function* () {
182
182
  yield initAuth$1({
183
183
  onError: () => handleError(provider, SocialOAuthErrorCode.SIGNIN_ERROR, `Failed to sign-in with social account: ${provider}`, { raiseAuthFailure: true }),
184
184
  onSettled,
185
185
  options: { provider },
186
186
  verifyFunction: () => apiCall(),
187
187
  });
188
- });
189
- const connectSocialAccount = (_a) => __awaiter(void 0, [_a], void 0, function* ({ authMode, provider, validator, captchaToken, redirectUrl, telegramAuthToken, }) {
190
- var _b, _c;
191
- clearError();
192
- setIsProcessing(true);
193
- if (!authMode) {
194
- logger.error('Auth mode is required. Please use either "link" or "signin"');
195
- return;
196
- }
197
- if (!checkValidProvider(provider, authMode)) {
198
- return;
199
- }
200
- // invalid connect request
201
- if (validator && !validator(provider)) {
202
- return;
203
- }
204
- dynamicEvents.emit('authInit', {
205
- option: provider,
206
- provider,
207
- type: 'social',
208
- });
209
- if (provider === ProviderEnum.Farcaster) {
210
- return connectWithFarcaster(authMode, {
211
- captchaToken,
212
- redirectUrl,
213
- });
214
- }
215
- const state = randomString(32);
216
- const verifier = randomString(43);
217
- // Whether we will use PKCE (code verifier/challenge) for this provider
218
- const usingPkce = providersRequiringPkce.includes(provider);
219
- setSocialStorageFor(provider, {
220
- captchaToken,
221
- codeVerifier: usingPkce ? verifier : undefined,
222
- state,
223
- });
224
- const loginUrlString = getOauthLoginUrl((_b = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) !== null && _b !== void 0 ? _b : [], provider);
225
- if (!loginUrlString) {
226
- handleError(provider, SocialOAuthErrorCode.NO_OAUTH_URL, `Failed to get login url to connect social account: ${provider}`, { raiseAuthFailure: authMode === 'signin' });
227
- return;
228
- }
229
- const oauthLoginUrl = new URL(loginUrlString);
230
- oauthLoginUrl.searchParams.set('state', state);
231
- // only add pkce params for providers that support/require it
232
- if (usingPkce) {
233
- const digest = yield digestSHA256(verifier);
234
- oauthLoginUrl.searchParams.set('code_challenge', encodeBase64URL(digest));
235
- oauthLoginUrl.searchParams.set('code_challenge_method', 'S256');
236
- }
237
- const isMobile$1 = isMobile();
238
- try {
239
- const authCode = yield Oauth2Service.getOauthCode({
240
- apiProvider: getProviderByType((_c = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) !== null && _c !== void 0 ? _c : [], provider),
241
- getOAuthResultFromApi: () => getOAuthResult(environmentId, provider, {
242
- state,
243
- }),
244
- initWebAuth: ({ redirectUrl } = {}) => initAuth(environmentId, provider, {
245
- redirectUrl: redirectUrl
246
- ? removeDynamicOauthParamsFromUrl(redirectUrl)
247
- : undefined,
248
- state,
249
- }),
250
- isMobile: isMobile$1,
251
- oauthLoginUrl,
252
- onSettled,
253
- provider,
254
- redirectUrl: redirectUrl !== null && redirectUrl !== void 0 ? redirectUrl : defaultRedirectUrl,
255
- sessionTimeout,
256
- setIsProcessing,
257
- state,
258
- strategy,
259
- });
260
- yield completeConnection({
261
- authCode,
262
- authMode,
263
- captchaToken,
264
- provider,
265
- state,
266
- telegramAuthToken,
267
- verifier,
268
- });
269
- }
270
- catch (error) {
271
- if (!Oauth2Service.isGetOauthCodeError(error)) {
272
- logger.error('Social connection failed with unexpected error:', error);
273
- onFailed(provider, { error }, { raiseAuthFailure: authMode === 'signin' });
274
- return;
275
- }
276
- if (error === 'user-cancelled')
277
- onFailed(provider, 'user-cancelled');
278
- else {
279
- handleError(provider, error.code, error.message, {
280
- raiseAuthFailure: authMode === 'signin',
281
- });
282
- }
283
- }
284
- });
285
- const completeConnection = (_d) => __awaiter(void 0, [_d], void 0, function* ({ authMode, provider, state, authCode, captchaToken, verifier, telegramAuthToken, forceCreateUser = false, }) {
188
+ }), [handleError, initAuth$1, onSettled]);
189
+ const completeConnection = useCallback((_a) => __awaiter(void 0, [_a], void 0, function* ({ authMode, provider, state, authCode, captchaToken, verifier, telegramAuthToken, forceCreateUser = false, }) {
286
190
  try {
287
191
  let sessionPublicKey = undefined;
288
192
  if (shouldRegisterSessionKeysOnSignin()) {
@@ -339,8 +243,15 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
339
243
  logger.error('Social connection failed with unexpected error:', error);
340
244
  onFailed(provider, { error }, { raiseAuthFailure: authMode === 'signin' });
341
245
  }
342
- });
343
- const connectWithFarcaster = (authMode_1, _e) => __awaiter(void 0, [authMode_1, _e], void 0, function* (authMode, { captchaToken, redirectUrl }) {
246
+ }), [
247
+ environmentId,
248
+ generateSessionKey,
249
+ linkAccount,
250
+ onFailed,
251
+ shouldRegisterSessionKeysOnSignin,
252
+ signInAccount,
253
+ ]);
254
+ const connectWithFarcaster = useCallback((authMode_1, _b) => __awaiter(void 0, [authMode_1, _b], void 0, function* (authMode, { captchaToken, redirectUrl }) {
344
255
  const dynamicNonce = consumeNonce();
345
256
  const domain = PlatformService.getHost();
346
257
  const data = yield connect({
@@ -412,8 +323,124 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
412
323
  setShowAuthFlow(false, { clearErrors: false });
413
324
  }
414
325
  setIsProcessing(false);
415
- });
416
- return {
326
+ }), [
327
+ consumeNonce,
328
+ defaultRedirectUrl,
329
+ environmentId,
330
+ generateSessionKey,
331
+ handleError,
332
+ linkAccount,
333
+ onFarcasterUrl,
334
+ setShowAuthFlow,
335
+ shouldRegisterSessionKeysOnSignin,
336
+ signInAccount,
337
+ ]);
338
+ const connectSocialAccount = useCallback((_c) => __awaiter(void 0, [_c], void 0, function* ({ authMode, provider, validator, captchaToken, redirectUrl, telegramAuthToken, }) {
339
+ var _d, _e;
340
+ clearError();
341
+ setIsProcessing(true);
342
+ if (!authMode) {
343
+ logger.error('Auth mode is required. Please use either "link" or "signin"');
344
+ return;
345
+ }
346
+ if (!checkValidProvider(provider, authMode)) {
347
+ return;
348
+ }
349
+ // invalid connect request
350
+ if (validator && !validator(provider)) {
351
+ return;
352
+ }
353
+ dynamicEvents.emit('authInit', {
354
+ option: provider,
355
+ provider,
356
+ type: 'social',
357
+ });
358
+ if (provider === ProviderEnum.Farcaster) {
359
+ return connectWithFarcaster(authMode, {
360
+ captchaToken,
361
+ redirectUrl,
362
+ });
363
+ }
364
+ const state = randomString(32);
365
+ const verifier = randomString(43);
366
+ // Whether we will use PKCE (code verifier/challenge) for this provider
367
+ const usingPkce = providersRequiringPkce.includes(provider);
368
+ setSocialStorageFor(provider, {
369
+ captchaToken,
370
+ codeVerifier: usingPkce ? verifier : undefined,
371
+ state,
372
+ });
373
+ const loginUrlString = getOauthLoginUrl((_d = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) !== null && _d !== void 0 ? _d : [], provider);
374
+ if (!loginUrlString) {
375
+ handleError(provider, SocialOAuthErrorCode.NO_OAUTH_URL, `Failed to get login url to connect social account: ${provider}`, { raiseAuthFailure: authMode === 'signin' });
376
+ return;
377
+ }
378
+ const oauthLoginUrl = new URL(loginUrlString);
379
+ oauthLoginUrl.searchParams.set('state', state);
380
+ // only add pkce params for providers that support/require it
381
+ if (usingPkce) {
382
+ const digest = yield digestSHA256(verifier);
383
+ oauthLoginUrl.searchParams.set('code_challenge', encodeBase64URL(digest));
384
+ oauthLoginUrl.searchParams.set('code_challenge_method', 'S256');
385
+ }
386
+ const isMobile$1 = isMobile();
387
+ try {
388
+ const authCode = yield Oauth2Service.getOauthCode({
389
+ apiProvider: getProviderByType((_e = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) !== null && _e !== void 0 ? _e : [], provider),
390
+ getOAuthResultFromApi: () => getOAuthResult(environmentId, provider, {
391
+ state,
392
+ }),
393
+ initWebAuth: ({ redirectUrl } = {}) => initAuth(environmentId, provider, {
394
+ redirectUrl: redirectUrl
395
+ ? removeDynamicOauthParamsFromUrl(redirectUrl)
396
+ : undefined,
397
+ state,
398
+ }),
399
+ isMobile: isMobile$1,
400
+ oauthLoginUrl,
401
+ onSettled,
402
+ provider,
403
+ redirectUrl: redirectUrl !== null && redirectUrl !== void 0 ? redirectUrl : defaultRedirectUrl,
404
+ sessionTimeout,
405
+ setIsProcessing,
406
+ state,
407
+ strategy,
408
+ });
409
+ yield completeConnection({
410
+ authCode,
411
+ authMode,
412
+ captchaToken,
413
+ provider,
414
+ state,
415
+ telegramAuthToken,
416
+ verifier,
417
+ });
418
+ }
419
+ catch (error) {
420
+ if (Oauth2Service.isGetOauthCodeError(error)) {
421
+ handleError(provider, error.code, error.message, {
422
+ raiseAuthFailure: authMode === 'signin',
423
+ });
424
+ return;
425
+ }
426
+ logger.error('Social connection failed with unexpected error:', error);
427
+ onFailed(provider, { error }, { raiseAuthFailure: authMode === 'signin' });
428
+ }
429
+ }), [
430
+ checkValidProvider,
431
+ clearError,
432
+ completeConnection,
433
+ connectWithFarcaster,
434
+ defaultRedirectUrl,
435
+ environmentId,
436
+ handleError,
437
+ onFailed,
438
+ onSettled,
439
+ projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers,
440
+ sessionTimeout,
441
+ strategy,
442
+ ]);
443
+ return useMemo(() => ({
417
444
  checkValidProvider,
418
445
  completeConnection,
419
446
  connectSocialAccount,
@@ -422,7 +449,14 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
422
449
  isProcessing,
423
450
  setError,
424
451
  setIsProcessing,
425
- };
452
+ }), [
453
+ checkValidProvider,
454
+ completeConnection,
455
+ connectSocialAccount,
456
+ error,
457
+ handleError,
458
+ isProcessing,
459
+ ]);
426
460
  };
427
461
  const removeDynamicOauthParamsFromUrl = (url) => {
428
462
  const urlObject = new URL(url);
@@ -126,7 +126,7 @@ const MfaChooseDeviceView = ({ isInitialSetup = true, }) => {
126
126
  ? t('dyn_mfa.choose_device_view.title')
127
127
  : t('dyn_mfa.choose_device_view.choose_another_method') }) }) }), jsxRuntime.jsxs("div", { className: 'mfa-choose-device-view__body', "data-testid": 'mfa-choose-device-view', children: [jsxRuntime.jsx(secureAccount.ReactComponent, {}), jsxRuntime.jsx(Typography.Typography, { className: 'mfa-choose-device-view__copy', variant: 'body_normal', weight: 'regular', color: 'secondary', children: isInitialSetup
128
128
  ? t('dyn_mfa.choose_device_view.select_options')
129
- : t('dyn_mfa.choose_device_view.choose_another_method_description') }), mfaOptions.map((option) => (jsxRuntime.jsxs(Button.Button, { buttonClassName: 'mfa-choose-device-view__button', expanded: true, onClick: () => handleClick(option), children: [jsxRuntime.jsxs("div", { className: 'mfa-choose-device-view__button__header', children: [jsxRuntime.jsx(Typography.Typography, { copykey: option.labelKey, children: t(option.labelKey) }), jsxRuntime.jsx(chevronLeft.ReactComponent, { className: 'mfa-choose-device-view__icon--rotate' })] }), jsxRuntime.jsx(Typography.Typography, { className: 'mfa-choose-device-view__button__description', color: 'secondary', copykey: option.descriptionKey, children: t(option.descriptionKey) })] }, option.type))), jsxRuntime.jsx(TextButton.TextButton, { className: 'mfa-choose-device-view__logout', onClick: handleLogOut, copykey: 'dyn_mfa.choose_device_view.logout', children: t('dyn_mfa.choose_device_view.logout') })] })] }));
129
+ : t('dyn_mfa.choose_device_view.choose_another_method_description') }), mfaOptions.map((option) => (jsxRuntime.jsxs(Button.Button, { buttonClassName: 'mfa-choose-device-view__button', expanded: true, onClick: () => handleClick(option), children: [jsxRuntime.jsxs("div", { className: 'mfa-choose-device-view__button__header', children: [jsxRuntime.jsx(Typography.Typography, { copykey: option.labelKey, color: 'primary', children: t(option.labelKey) }), jsxRuntime.jsx(chevronLeft.ReactComponent, { className: 'mfa-choose-device-view__icon--rotate' })] }), jsxRuntime.jsx(Typography.Typography, { className: 'mfa-choose-device-view__button__description', color: 'secondary', copykey: option.descriptionKey, children: t(option.descriptionKey) })] }, option.type))), jsxRuntime.jsx(TextButton.TextButton, { className: 'mfa-choose-device-view__logout', onClick: handleLogOut, copykey: 'dyn_mfa.choose_device_view.logout', children: t('dyn_mfa.choose_device_view.logout') })] })] }));
130
130
  };
131
131
 
132
132
  exports.MfaChooseDeviceView = MfaChooseDeviceView;
@@ -122,7 +122,7 @@ const MfaChooseDeviceView = ({ isInitialSetup = true, }) => {
122
122
  ? t('dyn_mfa.choose_device_view.title')
123
123
  : t('dyn_mfa.choose_device_view.choose_another_method') }) }) }), jsxs("div", { className: 'mfa-choose-device-view__body', "data-testid": 'mfa-choose-device-view', children: [jsx(SvgSecureAccount, {}), jsx(Typography, { className: 'mfa-choose-device-view__copy', variant: 'body_normal', weight: 'regular', color: 'secondary', children: isInitialSetup
124
124
  ? t('dyn_mfa.choose_device_view.select_options')
125
- : t('dyn_mfa.choose_device_view.choose_another_method_description') }), mfaOptions.map((option) => (jsxs(Button, { buttonClassName: 'mfa-choose-device-view__button', expanded: true, onClick: () => handleClick(option), children: [jsxs("div", { className: 'mfa-choose-device-view__button__header', children: [jsx(Typography, { copykey: option.labelKey, children: t(option.labelKey) }), jsx(SvgChevronLeft, { className: 'mfa-choose-device-view__icon--rotate' })] }), jsx(Typography, { className: 'mfa-choose-device-view__button__description', color: 'secondary', copykey: option.descriptionKey, children: t(option.descriptionKey) })] }, option.type))), jsx(TextButton, { className: 'mfa-choose-device-view__logout', onClick: handleLogOut, copykey: 'dyn_mfa.choose_device_view.logout', children: t('dyn_mfa.choose_device_view.logout') })] })] }));
125
+ : t('dyn_mfa.choose_device_view.choose_another_method_description') }), mfaOptions.map((option) => (jsxs(Button, { buttonClassName: 'mfa-choose-device-view__button', expanded: true, onClick: () => handleClick(option), children: [jsxs("div", { className: 'mfa-choose-device-view__button__header', children: [jsx(Typography, { copykey: option.labelKey, color: 'primary', children: t(option.labelKey) }), jsx(SvgChevronLeft, { className: 'mfa-choose-device-view__icon--rotate' })] }), jsx(Typography, { className: 'mfa-choose-device-view__button__description', color: 'secondary', copykey: option.descriptionKey, children: t(option.descriptionKey) })] }, option.type))), jsx(TextButton, { className: 'mfa-choose-device-view__logout', onClick: handleLogOut, copykey: 'dyn_mfa.choose_device_view.logout', children: t('dyn_mfa.choose_device_view.logout') })] })] }));
126
126
  };
127
127
 
128
128
  export { MfaChooseDeviceView };
@@ -37,7 +37,12 @@ const getWallets = (props) => {
37
37
  getSupportedWalletOpts: Object.assign(Object.assign({}, props.getSupportedWalletOpts), { chainRpcProviders: rpcProviders.ChainRpcProviders, walletConnectProjectId: (_a = props.getSupportedWalletOpts.settings.sdk.walletConnect) === null || _a === void 0 ? void 0 : _a.projectId }),
38
38
  }).map((wallet) => {
39
39
  var _a;
40
- (_a = props.walletConnectorExtensions) === null || _a === void 0 ? void 0 : _a.forEach((extension) => wallet.extend(extension));
40
+ (_a = props.walletConnectorExtensions) === null || _a === void 0 ? void 0 : _a.forEach((extension) => {
41
+ var _a;
42
+ return wallet.extend(extension, {
43
+ walletConnectDappProjectId: (_a = props.getSupportedWalletOpts.settings.sdk.walletConnect) === null || _a === void 0 ? void 0 : _a.walletProjectId,
44
+ });
45
+ });
41
46
  return createWallet.createWallet(props.getSupportedWalletOpts.walletBook, wallet);
42
47
  });
43
48
  };
@@ -33,7 +33,12 @@ const getWallets = (props) => {
33
33
  getSupportedWalletOpts: Object.assign(Object.assign({}, props.getSupportedWalletOpts), { chainRpcProviders: ChainRpcProviders, walletConnectProjectId: (_a = props.getSupportedWalletOpts.settings.sdk.walletConnect) === null || _a === void 0 ? void 0 : _a.projectId }),
34
34
  }).map((wallet) => {
35
35
  var _a;
36
- (_a = props.walletConnectorExtensions) === null || _a === void 0 ? void 0 : _a.forEach((extension) => wallet.extend(extension));
36
+ (_a = props.walletConnectorExtensions) === null || _a === void 0 ? void 0 : _a.forEach((extension) => {
37
+ var _a;
38
+ return wallet.extend(extension, {
39
+ walletConnectDappProjectId: (_a = props.getSupportedWalletOpts.settings.sdk.walletConnect) === null || _a === void 0 ? void 0 : _a.walletProjectId,
40
+ });
41
+ });
37
42
  return createWallet(props.getSupportedWalletOpts.walletBook, wallet);
38
43
  });
39
44
  };