@dynamic-labs/sdk-react-core 0.18.100-viem.4 → 0.18.100-viem.6

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 CHANGED
@@ -1,4 +1,19 @@
1
1
 
2
+ ### [0.18.100-viem.6](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.100-viem.5...v0.18.100-viem.6) (2023-08-21)
3
+
4
+
5
+ ### Bug Fixes
6
+
7
+ * detect when user closes oauth window when linking social account ([#3066](https://github.com/dynamic-labs/DynamicAuth/issues/3066)) ([428e9e8](https://github.com/dynamic-labs/DynamicAuth/commit/428e9e81d5473b2de03560f118c61baf3ee9e692))
8
+ * sync connected wallets with wagmi client ([#3073](https://github.com/dynamic-labs/DynamicAuth/issues/3073)) ([bce960d](https://github.com/dynamic-labs/DynamicAuth/commit/bce960d341ff55d3d660a8c34121c4348ca2908b))
9
+
10
+ ### [0.18.100-viem.5](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.100-viem.4...v0.18.100-viem.5) (2023-08-19)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * ensure social sign in embedded wallets sync correctly with wagmi ([5fdf11d](https://github.com/dynamic-labs/DynamicAuth/commit/5fdf11df19759b6e32b461802c0a32686365d890))
16
+
2
17
  ### [0.18.100-viem.4](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.100-viem.3...v0.18.100-viem.4) (2023-08-17)
3
18
 
4
19
 
package/package.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var version = "0.18.100-viem.4";
5
+ var version = "0.18.100-viem.6";
6
6
  var dependencies = {
7
7
  "react-focus-lock": "2.9.2",
8
8
  "@dynamic-labs/iconic": "0.1.23",
package/package.js CHANGED
@@ -1,4 +1,4 @@
1
- var version = "0.18.100-viem.4";
1
+ var version = "0.18.100-viem.6";
2
2
  var dependencies = {
3
3
  "react-focus-lock": "2.9.2",
4
4
  "@dynamic-labs/iconic": "0.1.23",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamic-labs/sdk-react-core",
3
- "version": "0.18.100-viem.4",
3
+ "version": "0.18.100-viem.6",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/dynamic-labs/DynamicAuth.git",
@@ -15,13 +15,13 @@
15
15
  "yup": "0.32.11",
16
16
  "formik": "2.2.9",
17
17
  "qrcode": "1.5.1",
18
- "@dynamic-labs/logger": "0.18.100-viem.4",
19
- "@dynamic-labs/multi-wallet": "0.18.100-viem.4",
20
- "@dynamic-labs/rpc-providers": "0.18.100-viem.4",
21
- "@dynamic-labs/types": "0.18.100-viem.4",
22
- "@dynamic-labs/utils": "0.18.100-viem.4",
23
- "@dynamic-labs/wallet-book": "0.18.100-viem.4",
24
- "@dynamic-labs/wallet-connector-core": "0.18.100-viem.4",
18
+ "@dynamic-labs/logger": "0.18.100-viem.6",
19
+ "@dynamic-labs/multi-wallet": "0.18.100-viem.6",
20
+ "@dynamic-labs/rpc-providers": "0.18.100-viem.6",
21
+ "@dynamic-labs/types": "0.18.100-viem.6",
22
+ "@dynamic-labs/utils": "0.18.100-viem.6",
23
+ "@dynamic-labs/wallet-book": "0.18.100-viem.6",
24
+ "@dynamic-labs/wallet-connector-core": "0.18.100-viem.6",
25
25
  "eventemitter3": "5.0.1"
26
26
  },
27
27
  "devDependencies": {
@@ -94,6 +94,7 @@ var useVerificationInProgress = require('./hooks/useVerificationInProgress/useVe
94
94
  var useCustomerCallbacks = require('./useCustomerCallbacks/useCustomerCallbacks.cjs');
95
95
  var useCustomerAuthFlowCallbacks = require('./useCustomerCallbacks/useCustomerAuthFlowCallbacks.cjs');
96
96
  var validators = require('./validators.cjs');
97
+ var internalEvents = require('./internalEvents/internalEvents.cjs');
97
98
 
98
99
  const PUBLIC_PROJECT_LIVE_ENVIRONMENT_ID = '2762a57b-faa4-41ce-9f16-abff9300e2c9';
99
100
  const EMPTY_INITIAL_USER = undefined;
@@ -101,6 +102,9 @@ const DynamicContext = React.createContext(undefined);
101
102
  const DynamicContextProvider = ({ children, theme, settings, }) => {
102
103
  var _a, _b, _c, _d, _e, _f, _g, _h;
103
104
  const { accessDeniedMessagePrimary, accessDeniedMessageSecondary, accessDeniedButton, apiBaseUrl, walletsByChain, cssOverrides, defaultNumberOfWalletsToShow = values.DEFAULT_NUMBER_OF_WALLETS_TO_SHOW, flowNetwork, initialAuthenticationMode = 'connect-and-sign', debugError = false, displaySiweStatement = true, newToWeb3WalletChainMap, enableVisitTrackingOnConnectOnly = true, environmentId, localStorageSuffix, eventsCallbacks, evmNetworks, walletsFilter, logLevel = 'WARN', notInTheListImageUrl, onboardingImageUrl, policiesConsentInnerComponent, customPrivacyPolicy, privacyPolicyUrl, signWithEmailWalletName, socialMediaLinkText, socialMediaIconUrl, socialMediaUrl, customTermsOfServices, termsOfServiceUrl, toolkitEnabled, siweStatement, shadowDOMEnabled = true, walletConnectors: walletConnectorsProp, socialProvidersFilter, } = settings;
105
+ // The following event related methods are temporary and should be removed after QNTM-180 is done
106
+ // ============ START REMOVE AFTER QNTM-180 ============
107
+ const internalEventsRef = React.useRef(internalEvents.getInternalEvents());
104
108
  let { walletConnectV1Bridge, appLogoUrl = 'https://demo.dynamic.xyz/assets/dynamic-logo.svg', appName = 'Dynamic Example', } = settings;
105
109
  if (!environmentId) {
106
110
  throw new utils.MissingEnvironmentIdError();
@@ -179,7 +183,7 @@ const DynamicContextProvider = ({ children, theme, settings, }) => {
179
183
  walletUiUtils,
180
184
  });
181
185
  const [authMode, setAuthMode] = useLocalStorage.useLocalStorage(localStorage$1.AUTH_MODE, initialAuthenticationMode);
182
- const { clearPrimaryWalletId, primaryWalletId, setPrimaryWalletId } = usePrimaryWalletId.usePrimaryWalletId();
186
+ const { clearPrimaryWalletId, primaryWalletId, setPrimaryWalletId } = usePrimaryWalletId.usePrimaryWalletId(internalEventsRef.current);
183
187
  const { connectWallet, removeConnectedWalletsInfo, connectedWalletsInfo, connectedWallet, getConnectedWalletById, connectedWallets, unlinkConnectedWallet, refreshConnectedWallet, } = useConnectWallet.useConnectWallet({
184
188
  authMode,
185
189
  clearPrimaryWalletId,
@@ -446,6 +450,7 @@ const DynamicContextProvider = ({ children, theme, settings, }) => {
446
450
  handleUnlinkWallet: authMode === 'connect-only'
447
451
  ? unlinkConnectedWallet
448
452
  : handleUnlinkWallet,
453
+ internalEvents: internalEventsRef,
449
454
  isAuthenticated,
450
455
  isBridgeFlow,
451
456
  isFullyConnected,
@@ -1,6 +1,6 @@
1
1
  import { __awaiter } from '../../../../_virtual/_tslib.js';
2
2
  import { jsx, jsxs } from 'react/jsx-runtime';
3
- import { createContext, useState, useEffect, useCallback, useMemo } from 'react';
3
+ import { createContext, useRef, useState, useEffect, useCallback, useMemo } from 'react';
4
4
  import { ICONIC_SPRITE_URL } from '@dynamic-labs/iconic';
5
5
  import { MissingEnvironmentIdError } from '@dynamic-labs/utils';
6
6
  import { useWalletBookCdn, getWalletBookCdnUrl, WalletBookContextProvider } from '@dynamic-labs/wallet-book';
@@ -90,6 +90,7 @@ import { useVerificationInProgress } from './hooks/useVerificationInProgress/use
90
90
  import { useCustomerCallbacks } from './useCustomerCallbacks/useCustomerCallbacks.js';
91
91
  import { useCustomerAuthFlowCallbacks } from './useCustomerCallbacks/useCustomerAuthFlowCallbacks.js';
92
92
  import { validateAuthUser } from './validators.js';
93
+ import { getInternalEvents } from './internalEvents/internalEvents.js';
93
94
 
94
95
  const PUBLIC_PROJECT_LIVE_ENVIRONMENT_ID = '2762a57b-faa4-41ce-9f16-abff9300e2c9';
95
96
  const EMPTY_INITIAL_USER = undefined;
@@ -97,6 +98,9 @@ const DynamicContext = createContext(undefined);
97
98
  const DynamicContextProvider = ({ children, theme, settings, }) => {
98
99
  var _a, _b, _c, _d, _e, _f, _g, _h;
99
100
  const { accessDeniedMessagePrimary, accessDeniedMessageSecondary, accessDeniedButton, apiBaseUrl, walletsByChain, cssOverrides, defaultNumberOfWalletsToShow = DEFAULT_NUMBER_OF_WALLETS_TO_SHOW, flowNetwork, initialAuthenticationMode = 'connect-and-sign', debugError = false, displaySiweStatement = true, newToWeb3WalletChainMap, enableVisitTrackingOnConnectOnly = true, environmentId, localStorageSuffix, eventsCallbacks, evmNetworks, walletsFilter, logLevel = 'WARN', notInTheListImageUrl, onboardingImageUrl, policiesConsentInnerComponent, customPrivacyPolicy, privacyPolicyUrl, signWithEmailWalletName, socialMediaLinkText, socialMediaIconUrl, socialMediaUrl, customTermsOfServices, termsOfServiceUrl, toolkitEnabled, siweStatement, shadowDOMEnabled = true, walletConnectors: walletConnectorsProp, socialProvidersFilter, } = settings;
101
+ // The following event related methods are temporary and should be removed after QNTM-180 is done
102
+ // ============ START REMOVE AFTER QNTM-180 ============
103
+ const internalEventsRef = useRef(getInternalEvents());
100
104
  let { walletConnectV1Bridge, appLogoUrl = 'https://demo.dynamic.xyz/assets/dynamic-logo.svg', appName = 'Dynamic Example', } = settings;
101
105
  if (!environmentId) {
102
106
  throw new MissingEnvironmentIdError();
@@ -175,7 +179,7 @@ const DynamicContextProvider = ({ children, theme, settings, }) => {
175
179
  walletUiUtils,
176
180
  });
177
181
  const [authMode, setAuthMode] = useLocalStorage(AUTH_MODE, initialAuthenticationMode);
178
- const { clearPrimaryWalletId, primaryWalletId, setPrimaryWalletId } = usePrimaryWalletId();
182
+ const { clearPrimaryWalletId, primaryWalletId, setPrimaryWalletId } = usePrimaryWalletId(internalEventsRef.current);
179
183
  const { connectWallet, removeConnectedWalletsInfo, connectedWalletsInfo, connectedWallet, getConnectedWalletById, connectedWallets, unlinkConnectedWallet, refreshConnectedWallet, } = useConnectWallet({
180
184
  authMode,
181
185
  clearPrimaryWalletId,
@@ -442,6 +446,7 @@ const DynamicContextProvider = ({ children, theme, settings, }) => {
442
446
  handleUnlinkWallet: authMode === 'connect-only'
443
447
  ? unlinkConnectedWallet
444
448
  : handleUnlinkWallet,
449
+ internalEvents: internalEventsRef,
445
450
  isAuthenticated,
446
451
  isBridgeFlow,
447
452
  isFullyConnected,
@@ -0,0 +1,2 @@
1
+ export { getInternalEvents } from './internalEvents';
2
+ export type { InternalEventEmitter } from './internalEvents';
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var EventEmitter = require('eventemitter3');
6
+
7
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
+
9
+ var EventEmitter__default = /*#__PURE__*/_interopDefaultLegacy(EventEmitter);
10
+
11
+ // This file is temporary and should be removed after QNTM-180 is done
12
+ const getInternalEvents = () => new EventEmitter__default["default"]();
13
+
14
+ exports.getInternalEvents = getInternalEvents;
@@ -0,0 +1,8 @@
1
+ import EventEmitter from 'eventemitter3';
2
+ /** Maps internal event names to their listeners */
3
+ export type InternalEventMap = {
4
+ emailVerificationResult: (param: boolean) => void;
5
+ clearPrimaryWallet: () => void;
6
+ };
7
+ export type InternalEventEmitter = EventEmitter<InternalEventMap>;
8
+ export declare const getInternalEvents: () => InternalEventEmitter;
@@ -0,0 +1,6 @@
1
+ import EventEmitter from 'eventemitter3';
2
+
3
+ // This file is temporary and should be removed after QNTM-180 is done
4
+ const getInternalEvents = () => new EventEmitter();
5
+
6
+ export { getInternalEvents };
@@ -1,4 +1,4 @@
1
- import { Dispatch, ReactNode, SetStateAction } from 'react';
1
+ import { Dispatch, MutableRefObject, ReactNode, SetStateAction } from 'react';
2
2
  import { DynamicJwt, NameServiceData, ProjectSettings } from '@dynamic-labs/sdk-api';
3
3
  import { NetworkConfigurationMap, SocialProviderFilter, WalletUiUtils } from '@dynamic-labs/types';
4
4
  import { Chain, FetchPublicAddressOpts, WalletConnector } from '@dynamic-labs/wallet-connector-core';
@@ -8,6 +8,7 @@ import { MultiWalletWidgetStateSetter } from '../../../utils/hooks/multiWallet';
8
8
  import { ThemeData, ThemeSetting } from '../../ThemeContext';
9
9
  import { DisplayOrder, SetDisplayOrderPriority } from '../hooks';
10
10
  import { Callback } from '../useCustomerCallbacks';
11
+ import { InternalEventEmitter } from '../internalEvents';
11
12
  export type ChainsToConnect = {
12
13
  chain: Chain;
13
14
  numberOfWallets: number;
@@ -143,4 +144,6 @@ export interface IDynamicContext {
143
144
  legacyIsVerifying: boolean;
144
145
  /** Legacy setter for legacyIsVerifying */
145
146
  setLegacyIsVerifying: Dispatch<SetStateAction<boolean>>;
147
+ /** Temporary workaround, until QNTM-180 is complete */
148
+ internalEvents: MutableRefObject<InternalEventEmitter>;
146
149
  }
@@ -11,7 +11,7 @@ const useDynamicContext = () => {
11
11
  if (context === undefined) {
12
12
  throw new Error('useDynamicContext must be used within a DynamicContextProvider');
13
13
  }
14
- const { accountSwitchState, authMode, authToken, awaitingSignatureState, connectedWallets, getNameService, handleLogOut, handleUnlinkWallet, isAuthenticated, isFullyConnected, isVerificationInProgress, linkedWallets, loadingNetwork, loginWithEmail, multiWalletWidgetState, network, networkConfigurations, qrcodeUri, rpcProviders, sdkHasLoaded, secondaryWallets, setLogInWithEmail, setMultiWalletWidgetState, setNetwork, setPrimaryWallet, setShowAuthFlow, setShowDynamicUserProfile, setShowQrcodeModal, shadowDOMEnabled, showAuthFlow, showQrcodeModal, user, walletConnector, wallets, walletsByChain, walletsToConnectByChain, primaryWallet, setShowBridgeWidget, sendWagmiSettings, } = context;
14
+ const { accountSwitchState, authMode, authToken, awaitingSignatureState, connectedWallets, getNameService, handleLogOut, handleUnlinkWallet, isAuthenticated, isFullyConnected, isVerificationInProgress, linkedWallets, loadingNetwork, loginWithEmail, multiWalletWidgetState, network, networkConfigurations, qrcodeUri, rpcProviders, sdkHasLoaded, secondaryWallets, setLogInWithEmail, setMultiWalletWidgetState, setNetwork, setPrimaryWallet, setShowAuthFlow, setShowDynamicUserProfile, setShowQrcodeModal, shadowDOMEnabled, showAuthFlow, showQrcodeModal, user, walletConnector, wallets, walletsByChain, walletsToConnectByChain, primaryWallet, setShowBridgeWidget, sendWagmiSettings, internalEvents, } = context;
15
15
  return {
16
16
  accountSwitchState,
17
17
  authMode,
@@ -21,6 +21,7 @@ const useDynamicContext = () => {
21
21
  getNameService,
22
22
  handleLogOut,
23
23
  handleUnlinkWallet,
24
+ internalEvents,
24
25
  isAuthenticated,
25
26
  isFullyConnected,
26
27
  isVerificationInProgress,
@@ -1,3 +1,3 @@
1
1
  import { IDynamicContext } from './types';
2
- export type UseDynamicContext = Pick<IDynamicContext, 'accountSwitchState' | 'authMode' | 'authToken' | 'awaitingSignatureState' | 'connectedWallets' | 'getNameService' | 'handleLogOut' | 'handleUnlinkWallet' | 'isAuthenticated' | 'isFullyConnected' | 'isVerificationInProgress' | 'linkedWallets' | 'loadingNetwork' | 'loginWithEmail' | 'multiWalletWidgetState' | 'network' | 'networkConfigurations' | 'primaryWallet' | 'qrcodeUri' | 'rpcProviders' | 'sdkHasLoaded' | 'secondaryWallets' | 'setLogInWithEmail' | 'setMultiWalletWidgetState' | 'setNetwork' | 'setPrimaryWallet' | 'setShowAuthFlow' | 'setShowDynamicUserProfile' | 'setShowQrcodeModal' | 'shadowDOMEnabled' | 'showAuthFlow' | 'showQrcodeModal' | 'user' | 'walletConnector' | 'wallets' | 'walletsByChain' | 'walletsToConnectByChain' | 'setShowBridgeWidget' | 'sendWagmiSettings'>;
2
+ export type UseDynamicContext = Pick<IDynamicContext, 'accountSwitchState' | 'authMode' | 'authToken' | 'awaitingSignatureState' | 'connectedWallets' | 'getNameService' | 'handleLogOut' | 'handleUnlinkWallet' | 'isAuthenticated' | 'isFullyConnected' | 'isVerificationInProgress' | 'linkedWallets' | 'loadingNetwork' | 'loginWithEmail' | 'multiWalletWidgetState' | 'network' | 'networkConfigurations' | 'primaryWallet' | 'qrcodeUri' | 'rpcProviders' | 'sdkHasLoaded' | 'secondaryWallets' | 'setLogInWithEmail' | 'setMultiWalletWidgetState' | 'setNetwork' | 'setPrimaryWallet' | 'setShowAuthFlow' | 'setShowDynamicUserProfile' | 'setShowQrcodeModal' | 'shadowDOMEnabled' | 'showAuthFlow' | 'showQrcodeModal' | 'user' | 'walletConnector' | 'wallets' | 'walletsByChain' | 'walletsToConnectByChain' | 'setShowBridgeWidget' | 'sendWagmiSettings' | 'internalEvents'>;
3
3
  export declare const useDynamicContext: () => UseDynamicContext;
@@ -7,7 +7,7 @@ const useDynamicContext = () => {
7
7
  if (context === undefined) {
8
8
  throw new Error('useDynamicContext must be used within a DynamicContextProvider');
9
9
  }
10
- const { accountSwitchState, authMode, authToken, awaitingSignatureState, connectedWallets, getNameService, handleLogOut, handleUnlinkWallet, isAuthenticated, isFullyConnected, isVerificationInProgress, linkedWallets, loadingNetwork, loginWithEmail, multiWalletWidgetState, network, networkConfigurations, qrcodeUri, rpcProviders, sdkHasLoaded, secondaryWallets, setLogInWithEmail, setMultiWalletWidgetState, setNetwork, setPrimaryWallet, setShowAuthFlow, setShowDynamicUserProfile, setShowQrcodeModal, shadowDOMEnabled, showAuthFlow, showQrcodeModal, user, walletConnector, wallets, walletsByChain, walletsToConnectByChain, primaryWallet, setShowBridgeWidget, sendWagmiSettings, } = context;
10
+ const { accountSwitchState, authMode, authToken, awaitingSignatureState, connectedWallets, getNameService, handleLogOut, handleUnlinkWallet, isAuthenticated, isFullyConnected, isVerificationInProgress, linkedWallets, loadingNetwork, loginWithEmail, multiWalletWidgetState, network, networkConfigurations, qrcodeUri, rpcProviders, sdkHasLoaded, secondaryWallets, setLogInWithEmail, setMultiWalletWidgetState, setNetwork, setPrimaryWallet, setShowAuthFlow, setShowDynamicUserProfile, setShowQrcodeModal, shadowDOMEnabled, showAuthFlow, showQrcodeModal, user, walletConnector, wallets, walletsByChain, walletsToConnectByChain, primaryWallet, setShowBridgeWidget, sendWagmiSettings, internalEvents, } = context;
11
11
  return {
12
12
  accountSwitchState,
13
13
  authMode,
@@ -17,6 +17,7 @@ const useDynamicContext = () => {
17
17
  getNameService,
18
18
  handleLogOut,
19
19
  handleUnlinkWallet,
20
+ internalEvents,
20
21
  isAuthenticated,
21
22
  isFullyConnected,
22
23
  isVerificationInProgress,
@@ -46,7 +46,7 @@ require('../../utils/hooks/useUserUpdateRequest/useUserUpdateRequest.cjs');
46
46
  const SocialRedirectContext = React.createContext(undefined);
47
47
  const SocialRedirectContextProvider = ({ children, }) => {
48
48
  var _a, _b;
49
- const { setShowAuthFlow, wallets, setSelectedWalletConnector, walletUiUtils, consumeNonce, displaySiweStatement, environmentId, projectSettings, setIsSingleWalletAccount, setShowDynamicUserProfile, isAuthenticated, setPrimaryWalletId, secondaryWallets, sdkHasLoaded, authToken, } = useInternalDynamicContext.useInternalDynamicContext();
49
+ const { setShowAuthFlow, wallets, setSelectedWalletConnector, walletUiUtils, consumeNonce, displaySiweStatement, environmentId, projectSettings, setIsSingleWalletAccount, setShowDynamicUserProfile, isAuthenticated, setPrimaryWalletId, secondaryWallets, sdkHasLoaded, authToken, connectWallet, } = useInternalDynamicContext.useInternalDynamicContext();
50
50
  const { setErrorMessage } = ErrorContext.useErrorContext();
51
51
  const { setView } = ViewContext.useViewContext();
52
52
  const verifyWallet = useVerifyWallet.useVerifyWallet({
@@ -139,6 +139,7 @@ const SocialRedirectContextProvider = ({ children, }) => {
139
139
  }
140
140
  }
141
141
  else {
142
+ yield connectWallet(socialWalletConnector);
142
143
  const address = yield socialWalletConnector.fetchPublicAddress();
143
144
  walletUiUtils.disabledConfirmationOnce();
144
145
  yield verifyWallet({
@@ -42,7 +42,7 @@ import '../../utils/hooks/useUserUpdateRequest/useUserUpdateRequest.js';
42
42
  const SocialRedirectContext = createContext(undefined);
43
43
  const SocialRedirectContextProvider = ({ children, }) => {
44
44
  var _a, _b;
45
- const { setShowAuthFlow, wallets, setSelectedWalletConnector, walletUiUtils, consumeNonce, displaySiweStatement, environmentId, projectSettings, setIsSingleWalletAccount, setShowDynamicUserProfile, isAuthenticated, setPrimaryWalletId, secondaryWallets, sdkHasLoaded, authToken, } = useInternalDynamicContext();
45
+ const { setShowAuthFlow, wallets, setSelectedWalletConnector, walletUiUtils, consumeNonce, displaySiweStatement, environmentId, projectSettings, setIsSingleWalletAccount, setShowDynamicUserProfile, isAuthenticated, setPrimaryWalletId, secondaryWallets, sdkHasLoaded, authToken, connectWallet, } = useInternalDynamicContext();
46
46
  const { setErrorMessage } = useErrorContext();
47
47
  const { setView } = useViewContext();
48
48
  const verifyWallet = useVerifyWallet({
@@ -135,6 +135,7 @@ const SocialRedirectContextProvider = ({ children, }) => {
135
135
  }
136
136
  }
137
137
  else {
138
+ yield connectWallet(socialWalletConnector);
138
139
  const address = yield socialWalletConnector.fetchPublicAddress();
139
140
  walletUiUtils.disabledConfirmationOnce();
140
141
  yield verifyWallet({
@@ -20,11 +20,15 @@ require('../../../shared/consts/index.cjs');
20
20
  var primaryWalletIdValidator = require('../useWalletConnectors/utils/primaryWalletIdValidator/primaryWalletIdValidator.cjs');
21
21
  require('@dynamic-labs/multi-wallet');
22
22
 
23
- const usePrimaryWalletId = () => {
24
- const [primaryWalletId, setPrimaryWalletIdState, clearPrimaryWalletId] = useLocalStorage.useLocalStorage(localStorage.PRIMARY_WALLET_ID, undefined, primaryWalletIdValidator.primaryWalletIdValidator);
23
+ const usePrimaryWalletId = (internalEvents) => {
24
+ const [primaryWalletId, setPrimaryWalletIdState, clearPrimaryWalletIdStorage,] = useLocalStorage.useLocalStorage(localStorage.PRIMARY_WALLET_ID, undefined, primaryWalletIdValidator.primaryWalletIdValidator);
25
25
  const setPrimaryWalletId = React.useCallback((walletId) => {
26
26
  setPrimaryWalletIdState(walletId);
27
27
  }, [setPrimaryWalletIdState]);
28
+ const clearPrimaryWalletId = () => {
29
+ clearPrimaryWalletIdStorage();
30
+ internalEvents.emit('clearPrimaryWallet');
31
+ };
28
32
  return {
29
33
  clearPrimaryWalletId,
30
34
  primaryWalletId,
@@ -1,4 +1,5 @@
1
- export declare const usePrimaryWalletId: () => {
1
+ import { InternalEventEmitter } from '../../../context/DynamicContext/internalEvents';
2
+ export declare const usePrimaryWalletId: (internalEvents: InternalEventEmitter) => {
2
3
  clearPrimaryWalletId: () => void;
3
4
  primaryWalletId: string | undefined;
4
5
  setPrimaryWalletId: (walletId: string) => void;
@@ -16,11 +16,15 @@ import '../../../shared/consts/index.js';
16
16
  import { primaryWalletIdValidator } from '../useWalletConnectors/utils/primaryWalletIdValidator/primaryWalletIdValidator.js';
17
17
  import '@dynamic-labs/multi-wallet';
18
18
 
19
- const usePrimaryWalletId = () => {
20
- const [primaryWalletId, setPrimaryWalletIdState, clearPrimaryWalletId] = useLocalStorage(PRIMARY_WALLET_ID, undefined, primaryWalletIdValidator);
19
+ const usePrimaryWalletId = (internalEvents) => {
20
+ const [primaryWalletId, setPrimaryWalletIdState, clearPrimaryWalletIdStorage,] = useLocalStorage(PRIMARY_WALLET_ID, undefined, primaryWalletIdValidator);
21
21
  const setPrimaryWalletId = useCallback((walletId) => {
22
22
  setPrimaryWalletIdState(walletId);
23
23
  }, [setPrimaryWalletIdState]);
24
+ const clearPrimaryWalletId = () => {
25
+ clearPrimaryWalletIdStorage();
26
+ internalEvents.emit('clearPrimaryWallet');
27
+ };
24
28
  return {
25
29
  clearPrimaryWalletId,
26
30
  primaryWalletId,
@@ -41,13 +41,17 @@ const socialProviders = [
41
41
  // pkce params are only required for twitter and break if added for other providers, like google
42
42
  // so we should only add provider that support pkce to this list
43
43
  const providersRequiringPkce = ['twitter', 'github'];
44
- const useSocialAccounts = () => {
44
+ const providersWithoutWindowOpenerRefence = ['twitter'];
45
+ const useSocialAccounts = ({ sessionTimeout } = {
46
+ sessionTimeout: 10000,
47
+ }) => {
45
48
  var _a;
46
49
  const { environmentId, user, projectSettings, onboardingOnlyJwt } = useInternalDynamicContext.useInternalDynamicContext();
47
50
  const { updateUserProfileByJWT } = useUpdateUserProfileByJWTCallback.useUpdateUserProfileByJWTCallback();
48
51
  const [isProcessing, setIsProcessing] = React.useState(false);
49
52
  const [error, setError] = React.useState();
50
53
  const providersWaitingOauthMessages = React.useRef({});
54
+ const authWindowInterval = React.useRef();
51
55
  const userJwt = (_a = getAuthToken.getAuthToken()) !== null && _a !== void 0 ? _a : onboardingOnlyJwt;
52
56
  const oauthProviders = index.getEnabledOAuthProviders(projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers);
53
57
  const verifiedOAuthCredentialsMap = React.useMemo(() => {
@@ -116,6 +120,7 @@ const useSocialAccounts = () => {
116
120
  };
117
121
  const linkSocialAccount = (provider) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
118
122
  var _b;
123
+ clearInterval(authWindowInterval.current);
119
124
  setError(undefined);
120
125
  setIsProcessing(true);
121
126
  // invalid linking request
@@ -124,7 +129,13 @@ const useSocialAccounts = () => {
124
129
  }
125
130
  const state = randomString.randomString(8);
126
131
  const verifier = randomString.randomString(43);
132
+ const clearListeners = () => {
133
+ removeOAuthIFrame();
134
+ window.removeEventListener('message', handleAuthWindowMessage);
135
+ providersWaitingOauthMessages.current = Object.assign(Object.assign({}, providersWaitingOauthMessages.current), { [provider]: false });
136
+ };
127
137
  const handleAuthWindowMessage = (event) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
138
+ var _c;
128
139
  const message = event.data;
129
140
  const isAuthorizationMessage = (message === null || message === void 0 ? void 0 : message.type) === 'authorization_response';
130
141
  if (isAuthorizationMessage) {
@@ -135,9 +146,11 @@ const useSocialAccounts = () => {
135
146
  if (!isValidMessage) {
136
147
  return;
137
148
  }
138
- removeOAuthIFrame();
139
- window.removeEventListener('message', handleAuthWindowMessage);
140
- providersWaitingOauthMessages.current = Object.assign(Object.assign({}, providersWaitingOauthMessages.current), { [provider]: false });
149
+ if (!((_c = providersWaitingOauthMessages.current) === null || _c === void 0 ? void 0 : _c[provider])) {
150
+ handleError(`Linking ${provider} account session timeout.`);
151
+ return;
152
+ }
153
+ clearListeners();
141
154
  const { code, error } = message;
142
155
  if (error && error !== 'undefined') {
143
156
  handleError(`Failed to link ${provider} social account: ${error}`);
@@ -183,10 +196,40 @@ const useSocialAccounts = () => {
183
196
  window.addEventListener('message', handleAuthWindowMessage);
184
197
  providersWaitingOauthMessages.current = Object.assign(Object.assign({}, providersWaitingOauthMessages.current), { [provider]: true });
185
198
  }
186
- window.open(oauthLoginUrl, '_blank', 'width=500,height=600');
199
+ const authWindow = window.open(oauthLoginUrl, '_blank', 'width=500,height=600');
200
+ if (!providersWithoutWindowOpenerRefence.includes(provider)) {
201
+ // For provider that support window.opener, we need to clear all states/listeners when the window is closed
202
+ authWindowInterval.current = setInterval(() => {
203
+ var _a;
204
+ if (!(authWindow === null || authWindow === void 0 ? void 0 : authWindow.closed)) {
205
+ return;
206
+ }
207
+ // window was closed by user, before completing oauth
208
+ if ((_a = providersWaitingOauthMessages.current) === null || _a === void 0 ? void 0 : _a[provider]) {
209
+ clearListeners();
210
+ handleError(`Linking ${provider} account window closed.`);
211
+ }
212
+ clearInterval(authWindowInterval.current);
213
+ setIsProcessing(false);
214
+ });
215
+ }
216
+ else {
217
+ // For provider that don't support window.opener, we need to use a timeout to try to detect when the
218
+ // window is closed
219
+ authWindowInterval.current = setInterval(() => {
220
+ var _a;
221
+ // user didn't complete oauth
222
+ if ((_a = providersWaitingOauthMessages.current) === null || _a === void 0 ? void 0 : _a[provider]) {
223
+ clearListeners();
224
+ handleError(`Linking ${provider} account window timeout.`);
225
+ }
226
+ setIsProcessing(false);
227
+ clearInterval(authWindowInterval.current);
228
+ }, sessionTimeout);
229
+ }
187
230
  });
188
231
  const unlinkSocialAccount = (provider) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
189
- var _c;
232
+ var _d;
190
233
  setError(undefined);
191
234
  setIsProcessing(true);
192
235
  if (!checkValidProvider(provider)) {
@@ -200,7 +243,7 @@ const useSocialAccounts = () => {
200
243
  try {
201
244
  const jwt = yield api.unlinkOAuth({
202
245
  environmentId,
203
- verifiedCrentialId: (_c = verifiedCredential.id) !== null && _c !== void 0 ? _c : '',
246
+ verifiedCrentialId: (_d = verifiedCredential.id) !== null && _d !== void 0 ? _d : '',
204
247
  }, String(userJwt));
205
248
  if (!jwt) {
206
249
  handleError(`Failed to unlink social account: ${provider} | ${verifiedCredential.id}`);
@@ -1,6 +1,9 @@
1
1
  import { ProviderEnum } from '@dynamic-labs/sdk-api';
2
2
  import { SocialAccountInformation } from '@dynamic-labs/types';
3
- export declare const useSocialAccounts: () => {
3
+ type UseSocialAccountsProps = {
4
+ sessionTimeout: number;
5
+ };
6
+ export declare const useSocialAccounts: ({ sessionTimeout }?: UseSocialAccountsProps) => {
4
7
  readonly error: string | undefined;
5
8
  readonly getLinkedAccountInformation: (provider: ProviderEnum) => SocialAccountInformation | undefined;
6
9
  readonly isLinked: (provider: ProviderEnum) => boolean;
@@ -8,3 +11,4 @@ export declare const useSocialAccounts: () => {
8
11
  readonly linkSocialAccount: (provider: ProviderEnum) => Promise<void>;
9
12
  readonly unlinkSocialAccount: (provider: ProviderEnum) => Promise<void>;
10
13
  };
14
+ export {};
@@ -37,13 +37,17 @@ const socialProviders = [
37
37
  // pkce params are only required for twitter and break if added for other providers, like google
38
38
  // so we should only add provider that support pkce to this list
39
39
  const providersRequiringPkce = ['twitter', 'github'];
40
- const useSocialAccounts = () => {
40
+ const providersWithoutWindowOpenerRefence = ['twitter'];
41
+ const useSocialAccounts = ({ sessionTimeout } = {
42
+ sessionTimeout: 10000,
43
+ }) => {
41
44
  var _a;
42
45
  const { environmentId, user, projectSettings, onboardingOnlyJwt } = useInternalDynamicContext();
43
46
  const { updateUserProfileByJWT } = useUpdateUserProfileByJWTCallback();
44
47
  const [isProcessing, setIsProcessing] = useState(false);
45
48
  const [error, setError] = useState();
46
49
  const providersWaitingOauthMessages = useRef({});
50
+ const authWindowInterval = useRef();
47
51
  const userJwt = (_a = getAuthToken()) !== null && _a !== void 0 ? _a : onboardingOnlyJwt;
48
52
  const oauthProviders = getEnabledOAuthProviders(projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers);
49
53
  const verifiedOAuthCredentialsMap = useMemo(() => {
@@ -112,6 +116,7 @@ const useSocialAccounts = () => {
112
116
  };
113
117
  const linkSocialAccount = (provider) => __awaiter(void 0, void 0, void 0, function* () {
114
118
  var _b;
119
+ clearInterval(authWindowInterval.current);
115
120
  setError(undefined);
116
121
  setIsProcessing(true);
117
122
  // invalid linking request
@@ -120,7 +125,13 @@ const useSocialAccounts = () => {
120
125
  }
121
126
  const state = randomString(8);
122
127
  const verifier = randomString(43);
128
+ const clearListeners = () => {
129
+ removeOAuthIFrame();
130
+ window.removeEventListener('message', handleAuthWindowMessage);
131
+ providersWaitingOauthMessages.current = Object.assign(Object.assign({}, providersWaitingOauthMessages.current), { [provider]: false });
132
+ };
123
133
  const handleAuthWindowMessage = (event) => __awaiter(void 0, void 0, void 0, function* () {
134
+ var _c;
124
135
  const message = event.data;
125
136
  const isAuthorizationMessage = (message === null || message === void 0 ? void 0 : message.type) === 'authorization_response';
126
137
  if (isAuthorizationMessage) {
@@ -131,9 +142,11 @@ const useSocialAccounts = () => {
131
142
  if (!isValidMessage) {
132
143
  return;
133
144
  }
134
- removeOAuthIFrame();
135
- window.removeEventListener('message', handleAuthWindowMessage);
136
- providersWaitingOauthMessages.current = Object.assign(Object.assign({}, providersWaitingOauthMessages.current), { [provider]: false });
145
+ if (!((_c = providersWaitingOauthMessages.current) === null || _c === void 0 ? void 0 : _c[provider])) {
146
+ handleError(`Linking ${provider} account session timeout.`);
147
+ return;
148
+ }
149
+ clearListeners();
137
150
  const { code, error } = message;
138
151
  if (error && error !== 'undefined') {
139
152
  handleError(`Failed to link ${provider} social account: ${error}`);
@@ -179,10 +192,40 @@ const useSocialAccounts = () => {
179
192
  window.addEventListener('message', handleAuthWindowMessage);
180
193
  providersWaitingOauthMessages.current = Object.assign(Object.assign({}, providersWaitingOauthMessages.current), { [provider]: true });
181
194
  }
182
- window.open(oauthLoginUrl, '_blank', 'width=500,height=600');
195
+ const authWindow = window.open(oauthLoginUrl, '_blank', 'width=500,height=600');
196
+ if (!providersWithoutWindowOpenerRefence.includes(provider)) {
197
+ // For provider that support window.opener, we need to clear all states/listeners when the window is closed
198
+ authWindowInterval.current = setInterval(() => {
199
+ var _a;
200
+ if (!(authWindow === null || authWindow === void 0 ? void 0 : authWindow.closed)) {
201
+ return;
202
+ }
203
+ // window was closed by user, before completing oauth
204
+ if ((_a = providersWaitingOauthMessages.current) === null || _a === void 0 ? void 0 : _a[provider]) {
205
+ clearListeners();
206
+ handleError(`Linking ${provider} account window closed.`);
207
+ }
208
+ clearInterval(authWindowInterval.current);
209
+ setIsProcessing(false);
210
+ });
211
+ }
212
+ else {
213
+ // For provider that don't support window.opener, we need to use a timeout to try to detect when the
214
+ // window is closed
215
+ authWindowInterval.current = setInterval(() => {
216
+ var _a;
217
+ // user didn't complete oauth
218
+ if ((_a = providersWaitingOauthMessages.current) === null || _a === void 0 ? void 0 : _a[provider]) {
219
+ clearListeners();
220
+ handleError(`Linking ${provider} account window timeout.`);
221
+ }
222
+ setIsProcessing(false);
223
+ clearInterval(authWindowInterval.current);
224
+ }, sessionTimeout);
225
+ }
183
226
  });
184
227
  const unlinkSocialAccount = (provider) => __awaiter(void 0, void 0, void 0, function* () {
185
- var _c;
228
+ var _d;
186
229
  setError(undefined);
187
230
  setIsProcessing(true);
188
231
  if (!checkValidProvider(provider)) {
@@ -196,7 +239,7 @@ const useSocialAccounts = () => {
196
239
  try {
197
240
  const jwt = yield unlinkOAuth({
198
241
  environmentId,
199
- verifiedCrentialId: (_c = verifiedCredential.id) !== null && _c !== void 0 ? _c : '',
242
+ verifiedCrentialId: (_d = verifiedCredential.id) !== null && _d !== void 0 ? _d : '',
200
243
  }, String(userJwt));
201
244
  if (!jwt) {
202
245
  handleError(`Failed to unlink social account: ${provider} | ${verifiedCredential.id}`);