@dynamic-labs/sdk-react-core 0.18.0-RC.25 → 0.18.0-RC.27
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 +28 -3
- package/package.cjs +1 -1
- package/package.js +1 -1
- package/package.json +8 -8
- package/src/lib/components/NetworkPicker/NetworkPicker.cjs +1 -1
- package/src/lib/components/NetworkPicker/NetworkPicker.js +1 -1
- package/src/lib/components/UserAddress/UserAddress.cjs +1 -1
- package/src/lib/components/UserAddress/UserAddress.js +1 -1
- package/src/lib/context/DynamicContext/DynamicContext.cjs +6 -0
- package/src/lib/context/DynamicContext/DynamicContext.js +7 -1
- package/src/lib/context/DynamicContext/types/index.d.ts +3 -0
- package/src/lib/context/DynamicContext/useDynamicContext.cjs +3 -1
- package/src/lib/context/DynamicContext/useDynamicContext.d.ts +1 -1
- package/src/lib/context/DynamicContext/useDynamicContext.js +3 -1
- package/src/lib/data/api.cjs +9 -7
- package/src/lib/data/api.js +9 -7
- package/src/lib/utils/hooks/useConnectedAccountWallet/useConnectedAccountWallet.cjs +12 -15
- package/src/lib/utils/hooks/useConnectedAccountWallet/useConnectedAccountWallet.d.ts +1 -1
- package/src/lib/utils/hooks/useConnectedAccountWallet/useConnectedAccountWallet.js +12 -15
- package/src/lib/utils/hooks/usePromise/usePromise.cjs +70 -63
- package/src/lib/utils/hooks/usePromise/usePromise.d.ts +27 -14
- package/src/lib/utils/hooks/usePromise/usePromise.js +71 -64
- package/src/lib/utils/hooks/usePromise/usePromise.types.d.ts +9 -0
- package/src/lib/utils/hooks/usePromise/utils/createReducer/createReducer.cjs +18 -0
- package/src/lib/utils/hooks/usePromise/utils/createReducer/createReducer.d.ts +13 -0
- package/src/lib/utils/hooks/usePromise/utils/createReducer/createReducer.js +14 -0
- package/src/lib/utils/hooks/usePromise/utils/createReducer/index.d.ts +1 -0
- package/src/lib/utils/hooks/usePromise/utils/index.d.ts +2 -0
- package/src/lib/utils/hooks/usePromise/utils/resolveFetcher/index.d.ts +1 -0
- package/src/lib/utils/hooks/usePromise/utils/resolveFetcher/resolveFetcher.cjs +32 -0
- package/src/lib/utils/hooks/usePromise/utils/resolveFetcher/resolveFetcher.d.ts +5 -0
- package/src/lib/utils/hooks/usePromise/utils/resolveFetcher/resolveFetcher.js +28 -0
- package/src/lib/views/NetworkNotSupported/NetworkNotSupported.cjs +1 -1
- package/src/lib/views/NetworkNotSupported/NetworkNotSupported.js +1 -1
- package/src/lib/views/NetworkNotSupportedSwitchManual/NetworkNotSupportedSwitchManual.cjs +3 -1
- package/src/lib/views/NetworkNotSupportedSwitchManual/NetworkNotSupportedSwitchManual.js +3 -1
- package/src/lib/views/SendBalanceView/SendBalanceView.cjs +2 -2
- package/src/lib/views/SendBalanceView/SendBalanceView.js +2 -2
- package/src/lib/views/TransactionConfirmationView/hooks/useTransactionData/useTransactionData.cjs +1 -1
- package/src/lib/views/TransactionConfirmationView/hooks/useTransactionData/useTransactionData.js +1 -1
- package/src/lib/widgets/DynamicWidget/prompts/PendingAccountSwitchModal/PendingAccountSwitchModal.cjs +1 -1
- package/src/lib/widgets/DynamicWidget/prompts/PendingAccountSwitchModal/PendingAccountSwitchModal.js +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,15 +1,40 @@
|
|
|
1
1
|
|
|
2
|
+
## [0.18.0-RC.27](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.0-RC.26...v0.18.0-RC.27) (2023-08-03)
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* fixes circular dependency issues on usePromise
|
|
7
|
+
|
|
8
|
+
## [0.18.0-RC.26](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.0-RC.24...v0.18.0-RC.26) (2023-08-02)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### ⚠ BREAKING CHANGES
|
|
12
|
+
|
|
13
|
+
* displayTermsOfService prop set to false breaks message verfication (#2751)
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
* send wagmi settings from wagmi connector ([#2791](https://github.com/dynamic-labs/DynamicAuth/issues/2791)) ([#2800](https://github.com/dynamic-labs/DynamicAuth/issues/2800)) ([5b65605](https://github.com/dynamic-labs/DynamicAuth/commit/5b656059361a48de57e01ad2dd81de0bc9b2c7e8))
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
* always call onBeforeConnectSuccess callback when wallet state changes ([#2786](https://github.com/dynamic-labs/DynamicAuth/issues/2786)) ([e2eaef3](https://github.com/dynamic-labs/DynamicAuth/commit/e2eaef3da1f80cdc7dc21e902e9c033e581242d2))
|
|
23
|
+
* displayTermsOfService prop set to false breaks message verfication ([#2751](https://github.com/dynamic-labs/DynamicAuth/issues/2751)) ([6433732](https://github.com/dynamic-labs/DynamicAuth/commit/6433732fac87d641f2475d19ef743ac31130274f))
|
|
24
|
+
* ensure auto-redirect back to dapp after message signing ([#2783](https://github.com/dynamic-labs/DynamicAuth/issues/2783)) ([dba4664](https://github.com/dynamic-labs/DynamicAuth/commit/dba466473ecc2afd808cdae0fd9023d38676b01f))
|
|
25
|
+
* use css.supports only when available ([#2802](https://github.com/dynamic-labs/DynamicAuth/issues/2802)) ([7651898](https://github.com/dynamic-labs/DynamicAuth/commit/76518982a97e728ab65549f37f55b537eed4e890))
|
|
26
|
+
|
|
2
27
|
## [0.18.0-RC.25](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.0-RC.24...v0.18.0-RC.25) (2023-08-01)
|
|
3
28
|
|
|
4
29
|
|
|
5
30
|
### ⚠ BREAKING CHANGES
|
|
6
31
|
|
|
7
|
-
* displayTermsOfService prop set to false breaks message verfication (#
|
|
32
|
+
* displayTermsOfService prop set to false breaks message verfication (#2751)
|
|
8
33
|
|
|
9
34
|
### Bug Fixes
|
|
10
35
|
|
|
11
|
-
* always call onBeforeConnectSuccess callback when wallet state
|
|
12
|
-
* displayTermsOfService prop set to false breaks message verfication ([#
|
|
36
|
+
* always call onBeforeConnectSuccess callback when wallet state changes ([#2786](https://github.com/dynamic-labs/DynamicAuth/issues/2786)) ([e2eaef3](https://github.com/dynamic-labs/DynamicAuth/commit/e2eaef3da1f80cdc7dc21e902e9c033e581242d2))
|
|
37
|
+
* displayTermsOfService prop set to false breaks message verfication ([#2751](https://github.com/dynamic-labs/DynamicAuth/issues/2751)) ([6433732](https://github.com/dynamic-labs/DynamicAuth/commit/6433732fac87d641f2475d19ef743ac31130274f))
|
|
13
38
|
* ensure auto-redirect back to dapp after message signing ([#2783](https://github.com/dynamic-labs/DynamicAuth/issues/2783)) ([dba4664](https://github.com/dynamic-labs/DynamicAuth/commit/dba466473ecc2afd808cdae0fd9023d38676b01f))
|
|
14
39
|
|
|
15
40
|
## [0.18.0-RC.24](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.0-RC.23...v0.18.0-RC.24) (2023-08-01)
|
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.0-RC.
|
|
3
|
+
"version": "0.18.0-RC.27",
|
|
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.0-RC.
|
|
20
|
-
"@dynamic-labs/multi-wallet": "0.18.0-RC.
|
|
21
|
-
"@dynamic-labs/rpc-providers": "0.18.0-RC.
|
|
22
|
-
"@dynamic-labs/types": "0.18.0-RC.
|
|
23
|
-
"@dynamic-labs/utils": "0.18.0-RC.
|
|
24
|
-
"@dynamic-labs/wallet-book": "0.18.0-RC.
|
|
25
|
-
"@dynamic-labs/wallet-connector-core": "0.18.0-RC.
|
|
19
|
+
"@dynamic-labs/logger": "0.18.0-RC.27",
|
|
20
|
+
"@dynamic-labs/multi-wallet": "0.18.0-RC.27",
|
|
21
|
+
"@dynamic-labs/rpc-providers": "0.18.0-RC.27",
|
|
22
|
+
"@dynamic-labs/types": "0.18.0-RC.27",
|
|
23
|
+
"@dynamic-labs/utils": "0.18.0-RC.27",
|
|
24
|
+
"@dynamic-labs/wallet-book": "0.18.0-RC.27",
|
|
25
|
+
"@dynamic-labs/wallet-connector-core": "0.18.0-RC.27"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"semver": "7.3.8"
|
|
@@ -53,7 +53,7 @@ const NetworkPicker = ({ activeClassName = '', buttonClassName = '', checkboxCla
|
|
|
53
53
|
const pickerRef = React.useRef(null);
|
|
54
54
|
const [newNetworkId, setNewNetworkId] = React.useState(undefined);
|
|
55
55
|
const { loadingNetwork, network, setNetwork } = useInternalDynamicContext.useInternalDynamicContext();
|
|
56
|
-
const { data: supportedWalletNetworks } = usePromise.usePromise(() => connector === null || connector === void 0 ? void 0 : connector.getSupportedNetworks(), [network]);
|
|
56
|
+
const { data: supportedWalletNetworks } = usePromise.usePromise(() => connector === null || connector === void 0 ? void 0 : connector.getSupportedNetworks(), { deps: [network] });
|
|
57
57
|
const shouldAllowOpenDropdown = isNetworkUnsupported.isNetworkUnsupported(network, evmNetworks) || (evmNetworks === null || evmNetworks === void 0 ? void 0 : evmNetworks.length) > 1;
|
|
58
58
|
// Ref to anchor popper to
|
|
59
59
|
const anchorRef = React.useRef(null);
|
|
@@ -49,7 +49,7 @@ const NetworkPicker = ({ activeClassName = '', buttonClassName = '', checkboxCla
|
|
|
49
49
|
const pickerRef = useRef(null);
|
|
50
50
|
const [newNetworkId, setNewNetworkId] = useState(undefined);
|
|
51
51
|
const { loadingNetwork, network, setNetwork } = useInternalDynamicContext();
|
|
52
|
-
const { data: supportedWalletNetworks } = usePromise(() => connector === null || connector === void 0 ? void 0 : connector.getSupportedNetworks(), [network]);
|
|
52
|
+
const { data: supportedWalletNetworks } = usePromise(() => connector === null || connector === void 0 ? void 0 : connector.getSupportedNetworks(), { deps: [network] });
|
|
53
53
|
const shouldAllowOpenDropdown = isNetworkUnsupported(network, evmNetworks) || (evmNetworks === null || evmNetworks === void 0 ? void 0 : evmNetworks.length) > 1;
|
|
54
54
|
// Ref to anchor popper to
|
|
55
55
|
const anchorRef = useRef(null);
|
|
@@ -51,7 +51,7 @@ const UserAddress = ({ userProfile, walletConnector }) => {
|
|
|
51
51
|
var _a;
|
|
52
52
|
const walletAddress = (_a = userProfile === null || userProfile === void 0 ? void 0 : userProfile.verifiedCredentials.find((verifiedCredential) => verifiedCredential.id === userProfile.lastVerifiedCredentialId)) === null || _a === void 0 ? void 0 : _a.address;
|
|
53
53
|
const nameService = useFetchNameService.useFetchNameService(walletAddress);
|
|
54
|
-
const { data: walletConnectorAddress } = usePromise.usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.fetchPublicAddress(),
|
|
54
|
+
const { data: walletConnectorAddress } = usePromise.usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.fetchPublicAddress(), {
|
|
55
55
|
enabled: !userProfile && Boolean(walletConnector),
|
|
56
56
|
});
|
|
57
57
|
return (jsxRuntime.jsxs("div", Object.assign({ className: 'user-address__container' }, { children: [jsxRuntime.jsx(StatusDot.StatusDot, { variant: 'green', containerClassName: 'user-address__status-dot' }), (nameService === null || nameService === void 0 ? void 0 : nameService.name) ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(Typography.Typography, Object.assign({ variant: 'numbers_big', color: 'primary', className: 'user-address' }, { children: nameService.name })), jsxRuntime.jsx("div", { className: 'dynamic-widget-wallet-header__seperator' }), jsxRuntime.jsx(Typography.Typography, Object.assign({ variant: 'numbers_medium', color: 'secondary', className: 'user-address' }, { children: shortenWalletAddress.shortenWalletAddress(walletAddress, 3, 3) }))] })) : (jsxRuntime.jsx(Typography.Typography, Object.assign({ variant: 'numbers_big', color: 'primary', className: 'user-address' }, { children: shortenWalletAddress.shortenWalletAddress(walletAddress || walletConnectorAddress, 4, 4) })))] })));
|
|
@@ -47,7 +47,7 @@ const UserAddress = ({ userProfile, walletConnector }) => {
|
|
|
47
47
|
var _a;
|
|
48
48
|
const walletAddress = (_a = userProfile === null || userProfile === void 0 ? void 0 : userProfile.verifiedCredentials.find((verifiedCredential) => verifiedCredential.id === userProfile.lastVerifiedCredentialId)) === null || _a === void 0 ? void 0 : _a.address;
|
|
49
49
|
const nameService = useFetchNameService(walletAddress);
|
|
50
|
-
const { data: walletConnectorAddress } = usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.fetchPublicAddress(),
|
|
50
|
+
const { data: walletConnectorAddress } = usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.fetchPublicAddress(), {
|
|
51
51
|
enabled: !userProfile && Boolean(walletConnector),
|
|
52
52
|
});
|
|
53
53
|
return (jsxs("div", Object.assign({ className: 'user-address__container' }, { children: [jsx(StatusDot, { variant: 'green', containerClassName: 'user-address__status-dot' }), (nameService === null || nameService === void 0 ? void 0 : nameService.name) ? (jsxs(Fragment, { children: [jsx(Typography, Object.assign({ variant: 'numbers_big', color: 'primary', className: 'user-address' }, { children: nameService.name })), jsx("div", { className: 'dynamic-widget-wallet-header__seperator' }), jsx(Typography, Object.assign({ variant: 'numbers_medium', color: 'secondary', className: 'user-address' }, { children: shortenWalletAddress(walletAddress, 3, 3) }))] })) : (jsx(Typography, Object.assign({ variant: 'numbers_big', color: 'primary', className: 'user-address' }, { children: shortenWalletAddress(walletAddress || walletConnectorAddress, 4, 4) })))] })));
|
|
@@ -359,6 +359,11 @@ const DynamicContextProvider = ({ children, theme, settings, }) => {
|
|
|
359
359
|
setIsVerificationInProgress,
|
|
360
360
|
user,
|
|
361
361
|
});
|
|
362
|
+
const sendWagmiSettings = (settings) => {
|
|
363
|
+
api.sendDynamicProps(environmentId, {
|
|
364
|
+
dynamicWagmiSettings: settings.dynamicWagmiSettings,
|
|
365
|
+
});
|
|
366
|
+
};
|
|
362
367
|
const clearStatesOnBackClick = React.useCallback(() => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
363
368
|
setDesktopUri('');
|
|
364
369
|
// Clear verification flag but dont require it to be set
|
|
@@ -465,6 +470,7 @@ const DynamicContextProvider = ({ children, theme, settings, }) => {
|
|
|
465
470
|
secondaryWallets,
|
|
466
471
|
selectedWalletConnector,
|
|
467
472
|
selectedWalletWithAction,
|
|
473
|
+
sendWagmiSettings,
|
|
468
474
|
setAuthMode,
|
|
469
475
|
setAuthorizationViewDisplayOrder,
|
|
470
476
|
setBridgeChainToConnect,
|
|
@@ -27,7 +27,7 @@ import { useFetchProjectSettings } from '../../utils/hooks/useFetchProjectSettin
|
|
|
27
27
|
import { useFetchNonce } from '../../utils/hooks/useFetchNonce/useFetchNonce.js';
|
|
28
28
|
import { useWallets } from '../../utils/hooks/useWallets/useWallets.js';
|
|
29
29
|
import { useWalletConnectors } from '../../utils/hooks/useWalletConnectors/useWalletConnectors.js';
|
|
30
|
-
import { revokeSession } from '../../data/api.js';
|
|
30
|
+
import { revokeSession, sendDynamicProps } from '../../data/api.js';
|
|
31
31
|
import '@dynamic-labs/multi-wallet';
|
|
32
32
|
import { getAuthToken } from '../../utils/functions/getAuthToken/getAuthToken.js';
|
|
33
33
|
import '@dynamic-labs/sdk-api';
|
|
@@ -355,6 +355,11 @@ const DynamicContextProvider = ({ children, theme, settings, }) => {
|
|
|
355
355
|
setIsVerificationInProgress,
|
|
356
356
|
user,
|
|
357
357
|
});
|
|
358
|
+
const sendWagmiSettings = (settings) => {
|
|
359
|
+
sendDynamicProps(environmentId, {
|
|
360
|
+
dynamicWagmiSettings: settings.dynamicWagmiSettings,
|
|
361
|
+
});
|
|
362
|
+
};
|
|
358
363
|
const clearStatesOnBackClick = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
359
364
|
setDesktopUri('');
|
|
360
365
|
// Clear verification flag but dont require it to be set
|
|
@@ -461,6 +466,7 @@ const DynamicContextProvider = ({ children, theme, settings, }) => {
|
|
|
461
466
|
secondaryWallets,
|
|
462
467
|
selectedWalletConnector,
|
|
463
468
|
selectedWalletWithAction,
|
|
469
|
+
sendWagmiSettings,
|
|
464
470
|
setAuthMode,
|
|
465
471
|
setAuthorizationViewDisplayOrder,
|
|
466
472
|
setBridgeChainToConnect,
|
|
@@ -59,6 +59,9 @@ export interface IDynamicContext {
|
|
|
59
59
|
isSingleWalletAccount: boolean;
|
|
60
60
|
loadingNetwork: boolean;
|
|
61
61
|
loginWithEmail: boolean;
|
|
62
|
+
sendWagmiSettings: (settings: {
|
|
63
|
+
dynamicWagmiSettings?: object;
|
|
64
|
+
}) => void;
|
|
62
65
|
multiWallet: boolean;
|
|
63
66
|
multiWalletWidgetState: MultiWalletWidgetState;
|
|
64
67
|
network: number | string | undefined;
|
|
@@ -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, } = 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, } = context;
|
|
15
15
|
return {
|
|
16
16
|
accountSwitchState,
|
|
17
17
|
authMode,
|
|
@@ -35,11 +35,13 @@ const useDynamicContext = () => {
|
|
|
35
35
|
rpcProviders,
|
|
36
36
|
sdkHasLoaded,
|
|
37
37
|
secondaryWallets,
|
|
38
|
+
sendWagmiSettings,
|
|
38
39
|
setLogInWithEmail,
|
|
39
40
|
setMultiWalletWidgetState,
|
|
40
41
|
setNetwork,
|
|
41
42
|
setPrimaryWallet,
|
|
42
43
|
setShowAuthFlow,
|
|
44
|
+
setShowBridgeWidget,
|
|
43
45
|
setShowDynamicUserProfile,
|
|
44
46
|
setShowQrcodeModal,
|
|
45
47
|
shadowDOMEnabled,
|
|
@@ -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'>;
|
|
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'>;
|
|
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, } = 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, } = context;
|
|
11
11
|
return {
|
|
12
12
|
accountSwitchState,
|
|
13
13
|
authMode,
|
|
@@ -31,11 +31,13 @@ const useDynamicContext = () => {
|
|
|
31
31
|
rpcProviders,
|
|
32
32
|
sdkHasLoaded,
|
|
33
33
|
secondaryWallets,
|
|
34
|
+
sendWagmiSettings,
|
|
34
35
|
setLogInWithEmail,
|
|
35
36
|
setMultiWalletWidgetState,
|
|
36
37
|
setNetwork,
|
|
37
38
|
setPrimaryWallet,
|
|
38
39
|
setShowAuthFlow,
|
|
40
|
+
setShowBridgeWidget,
|
|
39
41
|
setShowDynamicUserProfile,
|
|
40
42
|
setShowQrcodeModal,
|
|
41
43
|
shadowDOMEnabled,
|
package/src/lib/data/api.cjs
CHANGED
|
@@ -383,13 +383,15 @@ const getOnrampProviders = ({ chain, environmentId, networkId, token, walletAddr
|
|
|
383
383
|
const sendDynamicProps = (environmentId, settingsToSend) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
384
384
|
try {
|
|
385
385
|
const { dynamicContextProps, dynamicWagmiSettings } = settingsToSend;
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
386
|
+
if (dynamicContextProps || dynamicWagmiSettings) {
|
|
387
|
+
yield sdkApi().logDynamicSdkSettings({
|
|
388
|
+
environmentId,
|
|
389
|
+
sdkSettingsRequest: {
|
|
390
|
+
dynamicContextProps,
|
|
391
|
+
dynamicWagmiSettings,
|
|
392
|
+
},
|
|
393
|
+
});
|
|
394
|
+
}
|
|
393
395
|
}
|
|
394
396
|
catch (e) {
|
|
395
397
|
logger.logger.error(e);
|
package/src/lib/data/api.js
CHANGED
|
@@ -379,13 +379,15 @@ const getOnrampProviders = ({ chain, environmentId, networkId, token, walletAddr
|
|
|
379
379
|
const sendDynamicProps = (environmentId, settingsToSend) => __awaiter(void 0, void 0, void 0, function* () {
|
|
380
380
|
try {
|
|
381
381
|
const { dynamicContextProps, dynamicWagmiSettings } = settingsToSend;
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
382
|
+
if (dynamicContextProps || dynamicWagmiSettings) {
|
|
383
|
+
yield sdkApi().logDynamicSdkSettings({
|
|
384
|
+
environmentId,
|
|
385
|
+
sdkSettingsRequest: {
|
|
386
|
+
dynamicContextProps,
|
|
387
|
+
dynamicWagmiSettings,
|
|
388
|
+
},
|
|
389
|
+
});
|
|
390
|
+
}
|
|
389
391
|
}
|
|
390
392
|
catch (e) {
|
|
391
393
|
logger.error(e);
|
|
@@ -4,20 +4,17 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var usePromise = require('../usePromise/usePromise.cjs');
|
|
6
6
|
|
|
7
|
-
const useConnectedAccountWallet = (connector, secondaryWallets) => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}, [connector, secondaryWallets]);
|
|
20
|
-
return wallet;
|
|
21
|
-
};
|
|
7
|
+
const useConnectedAccountWallet = (connector, secondaryWallets) => usePromise.usePromise(() => {
|
|
8
|
+
if (!connector) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
return connector
|
|
12
|
+
.getConnectedAccounts()
|
|
13
|
+
.then((connectedAccounts) => secondaryWallets.find((secondaryWallet) => {
|
|
14
|
+
var _a;
|
|
15
|
+
return secondaryWallet.address.toLowerCase() ===
|
|
16
|
+
((_a = connectedAccounts[0]) === null || _a === void 0 ? void 0 : _a.toLowerCase());
|
|
17
|
+
}));
|
|
18
|
+
}, { deps: [connector, secondaryWallets] });
|
|
22
19
|
|
|
23
20
|
exports.useConnectedAccountWallet = useConnectedAccountWallet;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { Wallet, WalletConnector } from '../../../..';
|
|
2
|
-
export declare const useConnectedAccountWallet: (connector: WalletConnector | undefined, secondaryWallets: Wallet[]) => Wallet | undefined
|
|
2
|
+
export declare const useConnectedAccountWallet: (connector: WalletConnector | undefined, secondaryWallets: Wallet[]) => import("../usePromise").PromiseState<Wallet | undefined, Error>;
|
|
@@ -1,19 +1,16 @@
|
|
|
1
1
|
import { usePromise } from '../usePromise/usePromise.js';
|
|
2
2
|
|
|
3
|
-
const useConnectedAccountWallet = (connector, secondaryWallets) => {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}, [connector, secondaryWallets]);
|
|
16
|
-
return wallet;
|
|
17
|
-
};
|
|
3
|
+
const useConnectedAccountWallet = (connector, secondaryWallets) => usePromise(() => {
|
|
4
|
+
if (!connector) {
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
return connector
|
|
8
|
+
.getConnectedAccounts()
|
|
9
|
+
.then((connectedAccounts) => secondaryWallets.find((secondaryWallet) => {
|
|
10
|
+
var _a;
|
|
11
|
+
return secondaryWallet.address.toLowerCase() ===
|
|
12
|
+
((_a = connectedAccounts[0]) === null || _a === void 0 ? void 0 : _a.toLowerCase());
|
|
13
|
+
}));
|
|
14
|
+
}, { deps: [connector, secondaryWallets] });
|
|
18
15
|
|
|
19
16
|
export { useConnectedAccountWallet };
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var _tslib = require('../../../../../_virtual/_tslib.cjs');
|
|
6
5
|
var React = require('react');
|
|
7
6
|
require('@dynamic-labs/sdk-api');
|
|
8
7
|
var logger = require('../../../shared/logger.cjs');
|
|
@@ -16,85 +15,93 @@ require('../../constants/colors.cjs');
|
|
|
16
15
|
require('../../../shared/utils/classes/storage/localStorage.cjs');
|
|
17
16
|
require('ethers');
|
|
18
17
|
require('../../../shared/consts/index.cjs');
|
|
18
|
+
var resolveFetcher = require('./utils/resolveFetcher/resolveFetcher.cjs');
|
|
19
|
+
var createReducer = require('./utils/createReducer/createReducer.cjs');
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
|
-
*
|
|
22
|
+
* Custom hook for handling promises and fetching data.
|
|
23
|
+
* @template T - The type of the data returned by the promise.
|
|
24
|
+
* @template E - The type of the error thrown by the promise.
|
|
25
|
+
* @param {() => T | Promise<T>} fetcher - A function that returns the data or a promise that resolves to the data.
|
|
26
|
+
* @param {UsePromiseOptions<T, E>} [options={}] - Options for the hook.
|
|
27
|
+
* @param {number} [options.retries] - The number of times to retry the fetch in case of failure.
|
|
28
|
+
* @param {T} [options.initialData] - The initial data the hook will use until the promise is resolved.
|
|
29
|
+
* @param {DependencyList} [options.deps=[]] - An array of dependencies for the hook.
|
|
30
|
+
* @param {boolean} [options.enabled] - Flag indicating whether the fetch should be enabled or not.
|
|
31
|
+
* @param {(data: T) => void} [options.onResolve] - Callback to be called when the fetch is resolved successfully.
|
|
32
|
+
* @param {(error: E) => void} [options.onReject] - Callback to be called when the fetch is rejected with an error.
|
|
33
|
+
* @returns {PromiseState<T, E>} - The state object containing the data, error, and loading status.
|
|
34
|
+
* @example
|
|
35
|
+
* // Example usage with a simple fetcher function
|
|
36
|
+
* const fetcher = fetch('https://api.example.com/data');
|
|
22
37
|
*
|
|
23
|
-
*
|
|
38
|
+
* const MyComponent = () => {
|
|
39
|
+
* const { data, isLoading, error } = usePromise(fetcher);
|
|
24
40
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
41
|
+
* if (isLoading) {
|
|
42
|
+
* return <div>Loading...</div>;
|
|
43
|
+
* }
|
|
27
44
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
45
|
+
* if (error) {
|
|
46
|
+
* return <div>Error: {error.message}</div>;
|
|
47
|
+
* }
|
|
31
48
|
*
|
|
32
|
-
*
|
|
49
|
+
* return <div>Data: {data}</div>;
|
|
50
|
+
* };
|
|
33
51
|
*/
|
|
34
|
-
const usePromise = (fetcher,
|
|
35
|
-
|
|
36
|
-
}) => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const [state, setState] = React.useState({
|
|
52
|
+
const usePromise = (fetcher, options) => {
|
|
53
|
+
const lastCallTimestamp = React.useRef(new Date().getTime());
|
|
54
|
+
const { deps = [], initialData = undefined, enabled = true, retries = 0, onReject = () => { }, onResolve = () => { }, } = options || {};
|
|
55
|
+
const [state, dispatch] = React.useReducer(createReducer.createReducer(), {
|
|
56
|
+
data: initialData,
|
|
40
57
|
isLoading: true,
|
|
41
58
|
});
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const fetch = ({ onData, onError, }) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
48
|
-
try {
|
|
49
|
-
let data;
|
|
50
|
-
const fetchData = fetcher();
|
|
51
|
-
if (fetchData instanceof Promise) {
|
|
52
|
-
data = yield fetchData;
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
data = fetchData;
|
|
56
|
-
}
|
|
57
|
-
onData(data);
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
logger.logger.error(error);
|
|
61
|
-
onError(error);
|
|
59
|
+
const callback = React.useCallback(() => {
|
|
60
|
+
const callTimestamp = new Date().getTime();
|
|
61
|
+
const diffFromLastCall = callTimestamp - lastCallTimestamp.current;
|
|
62
|
+
if (diffFromLastCall < 5) {
|
|
63
|
+
logger.logger.warn('usePromise: Fetcher function was called too soon. Please make sure you are not calling the fetcher function inside a loop or a synchronous function.', deps);
|
|
62
64
|
}
|
|
63
|
-
|
|
64
|
-
React.useEffect(() => {
|
|
65
|
-
if (!options.enabled)
|
|
66
|
-
return;
|
|
67
|
-
// Flag to track if the another fetch has been triggered before the current one has completed
|
|
68
|
-
let isInvalid = false;
|
|
65
|
+
lastCallTimestamp.current = callTimestamp;
|
|
69
66
|
if (!state.isLoading) {
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
dispatch({
|
|
68
|
+
payload: true,
|
|
69
|
+
type: 'SET_LOADING',
|
|
72
70
|
});
|
|
73
71
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
72
|
+
resolveFetcher.resolveFetcher(fetcher, { retries }, (error, data) => {
|
|
73
|
+
if (callTimestamp !== lastCallTimestamp.current)
|
|
74
|
+
return;
|
|
75
|
+
if (error) {
|
|
76
|
+
logger.logger.error(error);
|
|
77
|
+
dispatch({
|
|
78
|
+
payload: error,
|
|
79
|
+
type: 'SET_ERROR',
|
|
81
80
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
81
|
+
onReject === null || onReject === void 0 ? void 0 : onReject(error);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (data) {
|
|
85
|
+
dispatch({
|
|
86
|
+
payload: data,
|
|
87
|
+
type: 'SET_DATA',
|
|
89
88
|
});
|
|
90
|
-
|
|
89
|
+
onResolve === null || onResolve === void 0 ? void 0 : onResolve(data);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
dispatch({
|
|
93
|
+
payload: false,
|
|
94
|
+
type: 'SET_LOADING',
|
|
95
|
+
});
|
|
91
96
|
});
|
|
92
|
-
return () => {
|
|
93
|
-
isInvalid = true;
|
|
94
|
-
};
|
|
95
97
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
96
|
-
},
|
|
97
|
-
|
|
98
|
+
}, deps);
|
|
99
|
+
React.useEffect(() => {
|
|
100
|
+
if (enabled) {
|
|
101
|
+
callback();
|
|
102
|
+
}
|
|
103
|
+
}, [callback, enabled]);
|
|
104
|
+
return state;
|
|
98
105
|
};
|
|
99
106
|
|
|
100
107
|
exports.usePromise = usePromise;
|
|
@@ -1,20 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { PromiseState } from './usePromise.types';
|
|
3
|
-
export type UsePromiseOptions = {
|
|
4
|
-
enabled?: boolean;
|
|
5
|
-
};
|
|
1
|
+
import { UsePromiseOptions, PromiseState } from './usePromise.types';
|
|
6
2
|
/**
|
|
7
|
-
*
|
|
3
|
+
* Custom hook for handling promises and fetching data.
|
|
4
|
+
* @template T - The type of the data returned by the promise.
|
|
5
|
+
* @template E - The type of the error thrown by the promise.
|
|
6
|
+
* @param {() => T | Promise<T>} fetcher - A function that returns the data or a promise that resolves to the data.
|
|
7
|
+
* @param {UsePromiseOptions<T, E>} [options={}] - Options for the hook.
|
|
8
|
+
* @param {number} [options.retries] - The number of times to retry the fetch in case of failure.
|
|
9
|
+
* @param {T} [options.initialData] - The initial data the hook will use until the promise is resolved.
|
|
10
|
+
* @param {DependencyList} [options.deps=[]] - An array of dependencies for the hook.
|
|
11
|
+
* @param {boolean} [options.enabled] - Flag indicating whether the fetch should be enabled or not.
|
|
12
|
+
* @param {(data: T) => void} [options.onResolve] - Callback to be called when the fetch is resolved successfully.
|
|
13
|
+
* @param {(error: E) => void} [options.onReject] - Callback to be called when the fetch is rejected with an error.
|
|
14
|
+
* @returns {PromiseState<T, E>} - The state object containing the data, error, and loading status.
|
|
15
|
+
* @example
|
|
16
|
+
* // Example usage with a simple fetcher function
|
|
17
|
+
* const fetcher = fetch('https://api.example.com/data');
|
|
8
18
|
*
|
|
9
|
-
*
|
|
19
|
+
* const MyComponent = () => {
|
|
20
|
+
* const { data, isLoading, error } = usePromise(fetcher);
|
|
10
21
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
22
|
+
* if (isLoading) {
|
|
23
|
+
* return <div>Loading...</div>;
|
|
24
|
+
* }
|
|
13
25
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
26
|
+
* if (error) {
|
|
27
|
+
* return <div>Error: {error.message}</div>;
|
|
28
|
+
* }
|
|
17
29
|
*
|
|
18
|
-
*
|
|
30
|
+
* return <div>Data: {data}</div>;
|
|
31
|
+
* };
|
|
19
32
|
*/
|
|
20
|
-
export declare const usePromise: <T
|
|
33
|
+
export declare const usePromise: <T, E = Error>(fetcher: () => T | Promise<T>, options?: UsePromiseOptions<T, E> | undefined) => PromiseState<T, E>;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useState, useEffect } from 'react';
|
|
1
|
+
import { useRef, useReducer, useCallback, useEffect } from 'react';
|
|
3
2
|
import '@dynamic-labs/sdk-api';
|
|
4
3
|
import { logger } from '../../../shared/logger.js';
|
|
5
4
|
import '@dynamic-labs/iconic';
|
|
@@ -12,85 +11,93 @@ import '../../constants/colors.js';
|
|
|
12
11
|
import '../../../shared/utils/classes/storage/localStorage.js';
|
|
13
12
|
import 'ethers';
|
|
14
13
|
import '../../../shared/consts/index.js';
|
|
14
|
+
import { resolveFetcher } from './utils/resolveFetcher/resolveFetcher.js';
|
|
15
|
+
import { createReducer } from './utils/createReducer/createReducer.js';
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
|
-
*
|
|
18
|
+
* Custom hook for handling promises and fetching data.
|
|
19
|
+
* @template T - The type of the data returned by the promise.
|
|
20
|
+
* @template E - The type of the error thrown by the promise.
|
|
21
|
+
* @param {() => T | Promise<T>} fetcher - A function that returns the data or a promise that resolves to the data.
|
|
22
|
+
* @param {UsePromiseOptions<T, E>} [options={}] - Options for the hook.
|
|
23
|
+
* @param {number} [options.retries] - The number of times to retry the fetch in case of failure.
|
|
24
|
+
* @param {T} [options.initialData] - The initial data the hook will use until the promise is resolved.
|
|
25
|
+
* @param {DependencyList} [options.deps=[]] - An array of dependencies for the hook.
|
|
26
|
+
* @param {boolean} [options.enabled] - Flag indicating whether the fetch should be enabled or not.
|
|
27
|
+
* @param {(data: T) => void} [options.onResolve] - Callback to be called when the fetch is resolved successfully.
|
|
28
|
+
* @param {(error: E) => void} [options.onReject] - Callback to be called when the fetch is rejected with an error.
|
|
29
|
+
* @returns {PromiseState<T, E>} - The state object containing the data, error, and loading status.
|
|
30
|
+
* @example
|
|
31
|
+
* // Example usage with a simple fetcher function
|
|
32
|
+
* const fetcher = fetch('https://api.example.com/data');
|
|
18
33
|
*
|
|
19
|
-
*
|
|
34
|
+
* const MyComponent = () => {
|
|
35
|
+
* const { data, isLoading, error } = usePromise(fetcher);
|
|
20
36
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
37
|
+
* if (isLoading) {
|
|
38
|
+
* return <div>Loading...</div>;
|
|
39
|
+
* }
|
|
23
40
|
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
41
|
+
* if (error) {
|
|
42
|
+
* return <div>Error: {error.message}</div>;
|
|
43
|
+
* }
|
|
27
44
|
*
|
|
28
|
-
*
|
|
45
|
+
* return <div>Data: {data}</div>;
|
|
46
|
+
* };
|
|
29
47
|
*/
|
|
30
|
-
const usePromise = (fetcher,
|
|
31
|
-
|
|
32
|
-
}) => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const [state, setState] = useState({
|
|
48
|
+
const usePromise = (fetcher, options) => {
|
|
49
|
+
const lastCallTimestamp = useRef(new Date().getTime());
|
|
50
|
+
const { deps = [], initialData = undefined, enabled = true, retries = 0, onReject = () => { }, onResolve = () => { }, } = options || {};
|
|
51
|
+
const [state, dispatch] = useReducer(createReducer(), {
|
|
52
|
+
data: initialData,
|
|
36
53
|
isLoading: true,
|
|
37
54
|
});
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const fetch = ({ onData, onError, }) => __awaiter(void 0, void 0, void 0, function* () {
|
|
44
|
-
try {
|
|
45
|
-
let data;
|
|
46
|
-
const fetchData = fetcher();
|
|
47
|
-
if (fetchData instanceof Promise) {
|
|
48
|
-
data = yield fetchData;
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
data = fetchData;
|
|
52
|
-
}
|
|
53
|
-
onData(data);
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
logger.error(error);
|
|
57
|
-
onError(error);
|
|
55
|
+
const callback = useCallback(() => {
|
|
56
|
+
const callTimestamp = new Date().getTime();
|
|
57
|
+
const diffFromLastCall = callTimestamp - lastCallTimestamp.current;
|
|
58
|
+
if (diffFromLastCall < 5) {
|
|
59
|
+
logger.warn('usePromise: Fetcher function was called too soon. Please make sure you are not calling the fetcher function inside a loop or a synchronous function.', deps);
|
|
58
60
|
}
|
|
59
|
-
|
|
60
|
-
useEffect(() => {
|
|
61
|
-
if (!options.enabled)
|
|
62
|
-
return;
|
|
63
|
-
// Flag to track if the another fetch has been triggered before the current one has completed
|
|
64
|
-
let isInvalid = false;
|
|
61
|
+
lastCallTimestamp.current = callTimestamp;
|
|
65
62
|
if (!state.isLoading) {
|
|
66
|
-
|
|
67
|
-
|
|
63
|
+
dispatch({
|
|
64
|
+
payload: true,
|
|
65
|
+
type: 'SET_LOADING',
|
|
68
66
|
});
|
|
69
67
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
68
|
+
resolveFetcher(fetcher, { retries }, (error, data) => {
|
|
69
|
+
if (callTimestamp !== lastCallTimestamp.current)
|
|
70
|
+
return;
|
|
71
|
+
if (error) {
|
|
72
|
+
logger.error(error);
|
|
73
|
+
dispatch({
|
|
74
|
+
payload: error,
|
|
75
|
+
type: 'SET_ERROR',
|
|
77
76
|
});
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
77
|
+
onReject === null || onReject === void 0 ? void 0 : onReject(error);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (data) {
|
|
81
|
+
dispatch({
|
|
82
|
+
payload: data,
|
|
83
|
+
type: 'SET_DATA',
|
|
85
84
|
});
|
|
86
|
-
|
|
85
|
+
onResolve === null || onResolve === void 0 ? void 0 : onResolve(data);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
dispatch({
|
|
89
|
+
payload: false,
|
|
90
|
+
type: 'SET_LOADING',
|
|
91
|
+
});
|
|
87
92
|
});
|
|
88
|
-
return () => {
|
|
89
|
-
isInvalid = true;
|
|
90
|
-
};
|
|
91
93
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
92
|
-
},
|
|
93
|
-
|
|
94
|
+
}, deps);
|
|
95
|
+
useEffect(() => {
|
|
96
|
+
if (enabled) {
|
|
97
|
+
callback();
|
|
98
|
+
}
|
|
99
|
+
}, [callback, enabled]);
|
|
100
|
+
return state;
|
|
94
101
|
};
|
|
95
102
|
|
|
96
103
|
export { usePromise };
|
|
@@ -1,5 +1,14 @@
|
|
|
1
|
+
import { DependencyList } from 'react';
|
|
1
2
|
export type PromiseState<T, E> = {
|
|
2
3
|
data?: T;
|
|
3
4
|
error?: E;
|
|
4
5
|
isLoading: boolean;
|
|
5
6
|
};
|
|
7
|
+
export type UsePromiseOptions<T, E> = {
|
|
8
|
+
deps?: DependencyList;
|
|
9
|
+
retries?: number;
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
initialData?: T;
|
|
12
|
+
onResolve?: (data: T) => void;
|
|
13
|
+
onReject?: (error: E) => void;
|
|
14
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
const createReducer = () => (state, action) => {
|
|
6
|
+
switch (action.type) {
|
|
7
|
+
case 'SET_DATA':
|
|
8
|
+
return Object.assign(Object.assign({}, state), { data: action.payload, isLoading: false });
|
|
9
|
+
case 'SET_ERROR':
|
|
10
|
+
return Object.assign(Object.assign({}, state), { error: action.payload, isLoading: false });
|
|
11
|
+
case 'SET_LOADING':
|
|
12
|
+
return Object.assign(Object.assign({}, state), { isLoading: action.payload });
|
|
13
|
+
default:
|
|
14
|
+
return state;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
exports.createReducer = createReducer;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PromiseState } from '../../usePromise.types';
|
|
2
|
+
type ReducerAction<T = unknown, E = unknown> = {
|
|
3
|
+
type: 'SET_DATA';
|
|
4
|
+
payload: T;
|
|
5
|
+
} | {
|
|
6
|
+
type: 'SET_ERROR';
|
|
7
|
+
payload: E;
|
|
8
|
+
} | {
|
|
9
|
+
type: 'SET_LOADING';
|
|
10
|
+
payload: boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare const createReducer: <T = unknown, E = unknown>() => (state: PromiseState<T, E>, action: ReducerAction<T, E>) => PromiseState<T, E>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const createReducer = () => (state, action) => {
|
|
2
|
+
switch (action.type) {
|
|
3
|
+
case 'SET_DATA':
|
|
4
|
+
return Object.assign(Object.assign({}, state), { data: action.payload, isLoading: false });
|
|
5
|
+
case 'SET_ERROR':
|
|
6
|
+
return Object.assign(Object.assign({}, state), { error: action.payload, isLoading: false });
|
|
7
|
+
case 'SET_LOADING':
|
|
8
|
+
return Object.assign(Object.assign({}, state), { isLoading: action.payload });
|
|
9
|
+
default:
|
|
10
|
+
return state;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { createReducer };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createReducer } from './createReducer';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { resolveFetcher } from './resolveFetcher';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var _tslib = require('../../../../../../../_virtual/_tslib.cjs');
|
|
6
|
+
|
|
7
|
+
const isPromise = (value) => value instanceof Promise;
|
|
8
|
+
const resolveFetcher = (fetcher, { retries }, callback) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
9
|
+
const totalNumberOfAttempts = retries ? retries + 1 : 1;
|
|
10
|
+
let currentAttempt = 0;
|
|
11
|
+
let data;
|
|
12
|
+
let err;
|
|
13
|
+
while (currentAttempt < totalNumberOfAttempts) {
|
|
14
|
+
currentAttempt = currentAttempt + 1;
|
|
15
|
+
try {
|
|
16
|
+
const result = fetcher();
|
|
17
|
+
if (isPromise(result)) {
|
|
18
|
+
data = yield result;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
data = result;
|
|
22
|
+
}
|
|
23
|
+
err = undefined;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
err = error;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
callback(err, data);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
exports.resolveFetcher = resolveFetcher;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { __awaiter } from '../../../../../../../_virtual/_tslib.js';
|
|
2
|
+
|
|
3
|
+
const isPromise = (value) => value instanceof Promise;
|
|
4
|
+
const resolveFetcher = (fetcher, { retries }, callback) => __awaiter(void 0, void 0, void 0, function* () {
|
|
5
|
+
const totalNumberOfAttempts = retries ? retries + 1 : 1;
|
|
6
|
+
let currentAttempt = 0;
|
|
7
|
+
let data;
|
|
8
|
+
let err;
|
|
9
|
+
while (currentAttempt < totalNumberOfAttempts) {
|
|
10
|
+
currentAttempt = currentAttempt + 1;
|
|
11
|
+
try {
|
|
12
|
+
const result = fetcher();
|
|
13
|
+
if (isPromise(result)) {
|
|
14
|
+
data = yield result;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
data = result;
|
|
18
|
+
}
|
|
19
|
+
err = undefined;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
err = error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
callback(err, data);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
export { resolveFetcher };
|
|
@@ -55,7 +55,7 @@ var useApplyWalletConnectorNetwork = require('../../utils/hooks/useApplyWalletCo
|
|
|
55
55
|
const NetworkNotSupported = () => {
|
|
56
56
|
const { network, onboardingImageUrl, selectedWalletConnector: walletConnector, connectedWallets, primaryWallet, } = useInternalDynamicContext.useInternalDynamicContext();
|
|
57
57
|
// Refresh selectedWalletConnector network when primaryWallet or connectedWallets updates
|
|
58
|
-
const { data: walletConnectorNetwork } = usePromise.usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.getNetwork(), [primaryWallet, walletConnector, connectedWallets]);
|
|
58
|
+
const { data: walletConnectorNetwork } = usePromise.usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.getNetwork(), { deps: [primaryWallet, walletConnector, connectedWallets] });
|
|
59
59
|
const finishConnectAndSign = useConnectAndSign.useConnectAndSign();
|
|
60
60
|
const [isNetworkPickerOpen, setIsNetworkPickerOpen] = React.useState(false);
|
|
61
61
|
// Finishes auth flow when wallet switches to proper network
|
|
@@ -51,7 +51,7 @@ import { useApplyWalletConnectorNetwork } from '../../utils/hooks/useApplyWallet
|
|
|
51
51
|
const NetworkNotSupported = () => {
|
|
52
52
|
const { network, onboardingImageUrl, selectedWalletConnector: walletConnector, connectedWallets, primaryWallet, } = useInternalDynamicContext();
|
|
53
53
|
// Refresh selectedWalletConnector network when primaryWallet or connectedWallets updates
|
|
54
|
-
const { data: walletConnectorNetwork } = usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.getNetwork(), [primaryWallet, walletConnector, connectedWallets]);
|
|
54
|
+
const { data: walletConnectorNetwork } = usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.getNetwork(), { deps: [primaryWallet, walletConnector, connectedWallets] });
|
|
55
55
|
const finishConnectAndSign = useConnectAndSign();
|
|
56
56
|
const [isNetworkPickerOpen, setIsNetworkPickerOpen] = useState(false);
|
|
57
57
|
// Finishes auth flow when wallet switches to proper network
|
|
@@ -56,7 +56,9 @@ const NetworkNotSupportedSwitchManual = () => {
|
|
|
56
56
|
var _a, _b;
|
|
57
57
|
const { user, selectedWalletConnector: walletConnector, connectedWallets, } = useInternalDynamicContext.useInternalDynamicContext();
|
|
58
58
|
// Refresh selectedWalletConnector network when primaryWallet or connectedWallets updates
|
|
59
|
-
const { data: walletConnectorNetwork } = usePromise.usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.getNetwork(),
|
|
59
|
+
const { data: walletConnectorNetwork } = usePromise.usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.getNetwork(), {
|
|
60
|
+
deps: [walletConnector, connectedWallets],
|
|
61
|
+
});
|
|
60
62
|
const finishConnectAndSign = useConnectAndSign.useConnectAndSign();
|
|
61
63
|
// Finishes auth flow when wallet switches to proper network
|
|
62
64
|
React.useEffect(() => {
|
|
@@ -52,7 +52,9 @@ const NetworkNotSupportedSwitchManual = () => {
|
|
|
52
52
|
var _a, _b;
|
|
53
53
|
const { user, selectedWalletConnector: walletConnector, connectedWallets, } = useInternalDynamicContext();
|
|
54
54
|
// Refresh selectedWalletConnector network when primaryWallet or connectedWallets updates
|
|
55
|
-
const { data: walletConnectorNetwork } = usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.getNetwork(),
|
|
55
|
+
const { data: walletConnectorNetwork } = usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.getNetwork(), {
|
|
56
|
+
deps: [walletConnector, connectedWallets],
|
|
57
|
+
});
|
|
56
58
|
const finishConnectAndSign = useConnectAndSign();
|
|
57
59
|
// Finishes auth flow when wallet switches to proper network
|
|
58
60
|
useEffect(() => {
|
|
@@ -59,8 +59,8 @@ const SendBalanceView = ({ initialRecipientAddress = '', initialValue, onClickBa
|
|
|
59
59
|
if (!primaryWallet) {
|
|
60
60
|
throw new utils.DynamicError('Primary wallet is not available, send balance cannot be displayed');
|
|
61
61
|
}
|
|
62
|
-
const { data: balance } = usePromise.usePromise(() => primaryWallet.connector.getBalance()
|
|
63
|
-
const { data: provider } = usePromise.usePromise(() => primaryWallet.connector.getWeb3Provider()
|
|
62
|
+
const { data: balance } = usePromise.usePromise(() => primaryWallet.connector.getBalance());
|
|
63
|
+
const { data: provider } = usePromise.usePromise(() => primaryWallet.connector.getWeb3Provider());
|
|
64
64
|
const evmNetworks = ((primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector) &&
|
|
65
65
|
primaryWallet.connector.evmNetworks) ||
|
|
66
66
|
[];
|
|
@@ -55,8 +55,8 @@ const SendBalanceView = ({ initialRecipientAddress = '', initialValue, onClickBa
|
|
|
55
55
|
if (!primaryWallet) {
|
|
56
56
|
throw new DynamicError('Primary wallet is not available, send balance cannot be displayed');
|
|
57
57
|
}
|
|
58
|
-
const { data: balance } = usePromise(() => primaryWallet.connector.getBalance()
|
|
59
|
-
const { data: provider } = usePromise(() => primaryWallet.connector.getWeb3Provider()
|
|
58
|
+
const { data: balance } = usePromise(() => primaryWallet.connector.getBalance());
|
|
59
|
+
const { data: provider } = usePromise(() => primaryWallet.connector.getWeb3Provider());
|
|
60
60
|
const evmNetworks = ((primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector) &&
|
|
61
61
|
primaryWallet.connector.evmNetworks) ||
|
|
62
62
|
[];
|
package/src/lib/views/TransactionConfirmationView/hooks/useTransactionData/useTransactionData.cjs
CHANGED
|
@@ -54,7 +54,7 @@ const useTransactionData = ({ provider, transaction, }) => {
|
|
|
54
54
|
// because alchemy checks the origin address funds and can return an error if
|
|
55
55
|
// origin wallet has no funds for the transaction
|
|
56
56
|
// https://docs.alchemy.com/reference/eth-estimategas
|
|
57
|
-
const
|
|
57
|
+
const transactionWithNoOrigin = _tslib.__rest(transaction, ["from"]);
|
|
58
58
|
return provider.estimateGas(transactionWithNoOrigin);
|
|
59
59
|
});
|
|
60
60
|
const { data: gasPrice, isLoading: isFeeDataLoading } = usePromise.usePromise(() => provider.getGasPrice());
|
package/src/lib/views/TransactionConfirmationView/hooks/useTransactionData/useTransactionData.js
CHANGED
|
@@ -50,7 +50,7 @@ const useTransactionData = ({ provider, transaction, }) => {
|
|
|
50
50
|
// because alchemy checks the origin address funds and can return an error if
|
|
51
51
|
// origin wallet has no funds for the transaction
|
|
52
52
|
// https://docs.alchemy.com/reference/eth-estimategas
|
|
53
|
-
const
|
|
53
|
+
const transactionWithNoOrigin = __rest(transaction, ["from"]);
|
|
54
54
|
return provider.estimateGas(transactionWithNoOrigin);
|
|
55
55
|
});
|
|
56
56
|
const { data: gasPrice, isLoading: isFeeDataLoading } = usePromise(() => provider.getGasPrice());
|
|
@@ -17,7 +17,7 @@ const PendingAccountSwitchModal = () => {
|
|
|
17
17
|
const { selectedWalletWithAction, primaryWallet, secondaryWallets } = useInternalDynamicContext.useInternalDynamicContext();
|
|
18
18
|
const selectedConnector = (_a = selectedWalletWithAction === null || selectedWalletWithAction === void 0 ? void 0 : selectedWalletWithAction.wallet) === null || _a === void 0 ? void 0 : _a.connector;
|
|
19
19
|
const isSameWallet = (selectedConnector === null || selectedConnector === void 0 ? void 0 : selectedConnector.name) === (primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector.name);
|
|
20
|
-
const connectedWallet = useConnectedAccountWallet.useConnectedAccountWallet((_b = selectedWalletWithAction === null || selectedWalletWithAction === void 0 ? void 0 : selectedWalletWithAction.wallet) === null || _b === void 0 ? void 0 : _b.connector, secondaryWallets);
|
|
20
|
+
const { data: connectedWallet } = useConnectedAccountWallet.useConnectedAccountWallet((_b = selectedWalletWithAction === null || selectedWalletWithAction === void 0 ? void 0 : selectedWalletWithAction.wallet) === null || _b === void 0 ? void 0 : _b.connector, secondaryWallets);
|
|
21
21
|
React.useEffect(() => {
|
|
22
22
|
//flow client library only supports one connected wallet at any given time.
|
|
23
23
|
const disconnectAndConnect = () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
package/src/lib/widgets/DynamicWidget/prompts/PendingAccountSwitchModal/PendingAccountSwitchModal.js
CHANGED
|
@@ -13,7 +13,7 @@ const PendingAccountSwitchModal = () => {
|
|
|
13
13
|
const { selectedWalletWithAction, primaryWallet, secondaryWallets } = useInternalDynamicContext();
|
|
14
14
|
const selectedConnector = (_a = selectedWalletWithAction === null || selectedWalletWithAction === void 0 ? void 0 : selectedWalletWithAction.wallet) === null || _a === void 0 ? void 0 : _a.connector;
|
|
15
15
|
const isSameWallet = (selectedConnector === null || selectedConnector === void 0 ? void 0 : selectedConnector.name) === (primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector.name);
|
|
16
|
-
const connectedWallet = useConnectedAccountWallet((_b = selectedWalletWithAction === null || selectedWalletWithAction === void 0 ? void 0 : selectedWalletWithAction.wallet) === null || _b === void 0 ? void 0 : _b.connector, secondaryWallets);
|
|
16
|
+
const { data: connectedWallet } = useConnectedAccountWallet((_b = selectedWalletWithAction === null || selectedWalletWithAction === void 0 ? void 0 : selectedWalletWithAction.wallet) === null || _b === void 0 ? void 0 : _b.connector, secondaryWallets);
|
|
17
17
|
useEffect(() => {
|
|
18
18
|
//flow client library only supports one connected wallet at any given time.
|
|
19
19
|
const disconnectAndConnect = () => __awaiter(void 0, void 0, void 0, function* () {
|