@dynamic-labs/sdk-react-core 0.18.5 → 0.18.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 +8 -0
- package/package.cjs +1 -1
- package/package.js +1 -1
- package/package.json +8 -8
- package/src/lib/context/DynamicContext/DynamicContext.cjs +6 -1
- package/src/lib/context/DynamicContext/DynamicContext.js +7 -2
- package/src/lib/context/DynamicContext/internalEvents/index.d.ts +2 -0
- package/src/lib/context/DynamicContext/internalEvents/internalEvents.cjs +14 -0
- package/src/lib/context/DynamicContext/internalEvents/internalEvents.d.ts +8 -0
- package/src/lib/context/DynamicContext/internalEvents/internalEvents.js +6 -0
- package/src/lib/context/DynamicContext/types/index.d.ts +4 -1
- package/src/lib/context/DynamicContext/useDynamicContext.cjs +2 -1
- package/src/lib/context/DynamicContext/useDynamicContext.d.ts +1 -1
- package/src/lib/context/DynamicContext/useDynamicContext.js +2 -1
- package/src/lib/utils/hooks/usePrimaryWalletId/usePrimaryWalletId.cjs +6 -2
- package/src/lib/utils/hooks/usePrimaryWalletId/usePrimaryWalletId.d.ts +2 -1
- package/src/lib/utils/hooks/usePrimaryWalletId/usePrimaryWalletId.js +6 -2
- package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.cjs +50 -7
- package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.d.ts +5 -1
- package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.js +50 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
|
|
2
|
+
### [0.18.6](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.5...v0.18.6) (2023-08-21)
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
* detect when user closes oauth window when linking social account ([#3063](https://github.com/dynamic-labs/DynamicAuth/issues/3063)) ([1afa8f7](https://github.com/dynamic-labs/DynamicAuth/commit/1afa8f7b1c82759c90554fd4395d11779023f1ff))
|
|
8
|
+
* sync connected wallets with wagmi client ([#3072](https://github.com/dynamic-labs/DynamicAuth/issues/3072)) ([570c83d](https://github.com/dynamic-labs/DynamicAuth/commit/570c83dd426862a2151c9858824a34d6b5133588))
|
|
9
|
+
|
|
2
10
|
### [0.18.5](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.4...v0.18.5) (2023-08-19)
|
|
3
11
|
|
|
4
12
|
|
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": "0.18.
|
|
3
|
+
"version": "0.18.6",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/dynamic-labs/DynamicAuth.git",
|
|
@@ -16,13 +16,13 @@
|
|
|
16
16
|
"formik": "2.2.9",
|
|
17
17
|
"qrcode": "1.5.1",
|
|
18
18
|
"ethers": "5.7.2",
|
|
19
|
-
"@dynamic-labs/logger": "0.18.
|
|
20
|
-
"@dynamic-labs/multi-wallet": "0.18.
|
|
21
|
-
"@dynamic-labs/rpc-providers": "0.18.
|
|
22
|
-
"@dynamic-labs/types": "0.18.
|
|
23
|
-
"@dynamic-labs/utils": "0.18.
|
|
24
|
-
"@dynamic-labs/wallet-book": "0.18.
|
|
25
|
-
"@dynamic-labs/wallet-connector-core": "0.18.
|
|
19
|
+
"@dynamic-labs/logger": "0.18.6",
|
|
20
|
+
"@dynamic-labs/multi-wallet": "0.18.6",
|
|
21
|
+
"@dynamic-labs/rpc-providers": "0.18.6",
|
|
22
|
+
"@dynamic-labs/types": "0.18.6",
|
|
23
|
+
"@dynamic-labs/utils": "0.18.6",
|
|
24
|
+
"@dynamic-labs/wallet-book": "0.18.6",
|
|
25
|
+
"@dynamic-labs/wallet-connector-core": "0.18.6",
|
|
26
26
|
"eventemitter3": "5.0.1"
|
|
27
27
|
},
|
|
28
28
|
"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,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;
|
|
@@ -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,
|
|
@@ -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,
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
|
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: (
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
|
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: (
|
|
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}`);
|