@mysten/dapp-kit 0.5.0 → 0.7.0

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.
Files changed (151) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +4 -4
  3. package/dist/cjs/components/AccountDropdownMenu.js +34 -6
  4. package/dist/cjs/components/AccountDropdownMenu.js.map +2 -2
  5. package/dist/cjs/components/ConnectButton.js +56 -16
  6. package/dist/cjs/components/ConnectButton.js.map +3 -3
  7. package/dist/cjs/components/WalletProvider.js +91 -28
  8. package/dist/cjs/components/WalletProvider.js.map +3 -3
  9. package/dist/cjs/components/connect-modal/ConnectModal.js +16 -9
  10. package/dist/cjs/components/connect-modal/ConnectModal.js.map +2 -2
  11. package/dist/cjs/hooks/useResolveSuiNSNames.d.ts +2 -106
  12. package/dist/cjs/hooks/useResolveSuiNSNames.js +3 -3
  13. package/dist/cjs/hooks/useResolveSuiNSNames.js.map +2 -2
  14. package/dist/cjs/hooks/useSuiClientInfiniteQuery.d.ts +7 -8
  15. package/dist/cjs/hooks/useSuiClientInfiniteQuery.js +11 -7
  16. package/dist/cjs/hooks/useSuiClientInfiniteQuery.js.map +2 -2
  17. package/dist/cjs/hooks/useSuiClientMutation.d.ts +2 -2
  18. package/dist/cjs/hooks/useSuiClientMutation.js.map +2 -2
  19. package/dist/cjs/hooks/useSuiClientQuery.d.ts +4 -3
  20. package/dist/cjs/hooks/useSuiClientQuery.js.map +2 -2
  21. package/dist/cjs/hooks/wallet/useAccounts.d.ts +2 -1
  22. package/dist/cjs/hooks/wallet/useAccounts.js.map +2 -2
  23. package/dist/cjs/hooks/wallet/useAutoConnectWallet.js +65 -15
  24. package/dist/cjs/hooks/wallet/useAutoConnectWallet.js.map +3 -3
  25. package/dist/cjs/hooks/wallet/useAutoConnectionStatus.d.ts +4 -0
  26. package/dist/cjs/hooks/wallet/useAutoConnectionStatus.js +50 -0
  27. package/dist/cjs/hooks/wallet/useAutoConnectionStatus.js.map +7 -0
  28. package/dist/cjs/hooks/wallet/useConnectWallet.d.ts +3 -5
  29. package/dist/cjs/hooks/wallet/useConnectWallet.js +15 -8
  30. package/dist/cjs/hooks/wallet/useConnectWallet.js.map +2 -2
  31. package/dist/cjs/hooks/wallet/useCurrentAccount.d.ts +2 -1
  32. package/dist/cjs/hooks/wallet/useCurrentAccount.js.map +2 -2
  33. package/dist/cjs/hooks/wallet/useCurrentWallet.d.ts +19 -1
  34. package/dist/cjs/hooks/wallet/useCurrentWallet.js +29 -1
  35. package/dist/cjs/hooks/wallet/useCurrentWallet.js.map +2 -2
  36. package/dist/cjs/hooks/wallet/useDisconnectWallet.d.ts +2 -2
  37. package/dist/cjs/hooks/wallet/useDisconnectWallet.js +30 -2
  38. package/dist/cjs/hooks/wallet/useDisconnectWallet.js.map +2 -2
  39. package/dist/cjs/hooks/wallet/useSignAndExecuteTransactionBlock.d.ts +2 -2
  40. package/dist/cjs/hooks/wallet/useSignAndExecuteTransactionBlock.js +30 -2
  41. package/dist/cjs/hooks/wallet/useSignAndExecuteTransactionBlock.js.map +2 -2
  42. package/dist/cjs/hooks/wallet/useSignPersonalMessage.d.ts +2 -2
  43. package/dist/cjs/hooks/wallet/useSignPersonalMessage.js +30 -2
  44. package/dist/cjs/hooks/wallet/useSignPersonalMessage.js.map +2 -2
  45. package/dist/cjs/hooks/wallet/useSignTransactionBlock.d.ts +2 -2
  46. package/dist/cjs/hooks/wallet/useSignTransactionBlock.js +30 -2
  47. package/dist/cjs/hooks/wallet/useSignTransactionBlock.js.map +2 -2
  48. package/dist/cjs/hooks/wallet/useSwitchAccount.d.ts +2 -2
  49. package/dist/cjs/hooks/wallet/useSwitchAccount.js +30 -2
  50. package/dist/cjs/hooks/wallet/useSwitchAccount.js.map +2 -2
  51. package/dist/cjs/hooks/wallet/useWalletPropertiesChanged.js +30 -2
  52. package/dist/cjs/hooks/wallet/useWalletPropertiesChanged.js.map +2 -2
  53. package/dist/cjs/index.d.ts +1 -0
  54. package/dist/cjs/index.js +119 -39
  55. package/dist/cjs/index.js.map +4 -4
  56. package/dist/cjs/walletStore.d.ts +10 -2
  57. package/dist/cjs/walletStore.js +23 -4
  58. package/dist/cjs/walletStore.js.map +2 -2
  59. package/dist/esm/components/AccountDropdownMenu.d.ts +2 -2
  60. package/dist/esm/components/AccountDropdownMenu.js +34 -6
  61. package/dist/esm/components/AccountDropdownMenu.js.map +2 -2
  62. package/dist/esm/components/ConnectButton.d.ts +1 -1
  63. package/dist/esm/components/ConnectButton.js +56 -16
  64. package/dist/esm/components/ConnectButton.js.map +3 -3
  65. package/dist/esm/components/SuiClientProvider.d.ts +1 -1
  66. package/dist/esm/components/WalletProvider.d.ts +1 -1
  67. package/dist/esm/components/WalletProvider.js +91 -28
  68. package/dist/esm/components/WalletProvider.js.map +3 -3
  69. package/dist/esm/components/connect-modal/ConnectModal.d.ts +1 -1
  70. package/dist/esm/components/connect-modal/ConnectModal.js +16 -9
  71. package/dist/esm/components/connect-modal/ConnectModal.js.map +2 -2
  72. package/dist/esm/components/connect-modal/InfoSection.d.ts +1 -1
  73. package/dist/esm/components/connect-modal/views/ConnectionStatus.d.ts +1 -1
  74. package/dist/esm/components/connect-modal/views/GettingStarted.d.ts +1 -1
  75. package/dist/esm/components/connect-modal/views/WhatIsAWallet.d.ts +1 -1
  76. package/dist/esm/components/connect-modal/wallet-list/WalletList.d.ts +1 -1
  77. package/dist/esm/components/connect-modal/wallet-list/WalletListItem.d.ts +1 -1
  78. package/dist/esm/components/styling/InjectedThemeStyles.d.ts +1 -1
  79. package/dist/esm/contexts/walletContext.d.ts +2 -2
  80. package/dist/esm/hooks/useResolveSuiNSNames.d.ts +2 -106
  81. package/dist/esm/hooks/useResolveSuiNSNames.js +3 -3
  82. package/dist/esm/hooks/useResolveSuiNSNames.js.map +2 -2
  83. package/dist/esm/hooks/useSuiClientInfiniteQuery.d.ts +7 -8
  84. package/dist/esm/hooks/useSuiClientInfiniteQuery.js +11 -7
  85. package/dist/esm/hooks/useSuiClientInfiniteQuery.js.map +2 -2
  86. package/dist/esm/hooks/useSuiClientMutation.d.ts +2 -2
  87. package/dist/esm/hooks/useSuiClientMutation.js.map +2 -2
  88. package/dist/esm/hooks/useSuiClientQuery.d.ts +4 -3
  89. package/dist/esm/hooks/useSuiClientQuery.js.map +2 -2
  90. package/dist/esm/hooks/wallet/useAccounts.d.ts +2 -1
  91. package/dist/esm/hooks/wallet/useAccounts.js.map +2 -2
  92. package/dist/esm/hooks/wallet/useAutoConnectWallet.js +65 -15
  93. package/dist/esm/hooks/wallet/useAutoConnectWallet.js.map +3 -3
  94. package/dist/esm/hooks/wallet/useAutoConnectionStatus.d.ts +4 -0
  95. package/dist/esm/hooks/wallet/useAutoConnectionStatus.js +27 -0
  96. package/dist/esm/hooks/wallet/useAutoConnectionStatus.js.map +7 -0
  97. package/dist/esm/hooks/wallet/useConnectWallet.d.ts +3 -5
  98. package/dist/esm/hooks/wallet/useConnectWallet.js +15 -8
  99. package/dist/esm/hooks/wallet/useConnectWallet.js.map +2 -2
  100. package/dist/esm/hooks/wallet/useCurrentAccount.d.ts +2 -1
  101. package/dist/esm/hooks/wallet/useCurrentAccount.js.map +2 -2
  102. package/dist/esm/hooks/wallet/useCurrentWallet.d.ts +19 -1
  103. package/dist/esm/hooks/wallet/useCurrentWallet.js +29 -1
  104. package/dist/esm/hooks/wallet/useCurrentWallet.js.map +2 -2
  105. package/dist/esm/hooks/wallet/useDisconnectWallet.d.ts +2 -2
  106. package/dist/esm/hooks/wallet/useDisconnectWallet.js +30 -2
  107. package/dist/esm/hooks/wallet/useDisconnectWallet.js.map +2 -2
  108. package/dist/esm/hooks/wallet/useSignAndExecuteTransactionBlock.d.ts +2 -2
  109. package/dist/esm/hooks/wallet/useSignAndExecuteTransactionBlock.js +30 -2
  110. package/dist/esm/hooks/wallet/useSignAndExecuteTransactionBlock.js.map +2 -2
  111. package/dist/esm/hooks/wallet/useSignPersonalMessage.d.ts +2 -2
  112. package/dist/esm/hooks/wallet/useSignPersonalMessage.js +30 -2
  113. package/dist/esm/hooks/wallet/useSignPersonalMessage.js.map +2 -2
  114. package/dist/esm/hooks/wallet/useSignTransactionBlock.d.ts +2 -2
  115. package/dist/esm/hooks/wallet/useSignTransactionBlock.js +30 -2
  116. package/dist/esm/hooks/wallet/useSignTransactionBlock.js.map +2 -2
  117. package/dist/esm/hooks/wallet/useSwitchAccount.d.ts +2 -2
  118. package/dist/esm/hooks/wallet/useSwitchAccount.js +30 -2
  119. package/dist/esm/hooks/wallet/useSwitchAccount.js.map +2 -2
  120. package/dist/esm/hooks/wallet/useWalletPropertiesChanged.js +30 -2
  121. package/dist/esm/hooks/wallet/useWalletPropertiesChanged.js.map +2 -2
  122. package/dist/esm/index.d.ts +1 -0
  123. package/dist/esm/index.js +119 -39
  124. package/dist/esm/index.js.map +4 -4
  125. package/dist/esm/walletStore.d.ts +10 -2
  126. package/dist/esm/walletStore.js +23 -4
  127. package/dist/esm/walletStore.js.map +2 -2
  128. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  129. package/dist/tsconfig.tsbuildinfo +1 -1
  130. package/package.json +5 -5
  131. package/src/components/ConnectButton.tsx +8 -1
  132. package/src/components/WalletProvider.tsx +1 -0
  133. package/src/components/connect-modal/ConnectModal.tsx +1 -3
  134. package/src/hooks/useResolveSuiNSNames.ts +7 -8
  135. package/src/hooks/useSuiClientInfiniteQuery.ts +43 -25
  136. package/src/hooks/useSuiClientMutation.ts +2 -2
  137. package/src/hooks/useSuiClientQuery.ts +13 -9
  138. package/src/hooks/wallet/useAccounts.ts +3 -1
  139. package/src/hooks/wallet/useAutoConnectWallet.ts +24 -7
  140. package/src/hooks/wallet/useAutoConnectionStatus.ts +12 -0
  141. package/src/hooks/wallet/useConnectWallet.ts +24 -10
  142. package/src/hooks/wallet/useCurrentAccount.ts +3 -1
  143. package/src/hooks/wallet/useCurrentWallet.ts +30 -1
  144. package/src/hooks/wallet/useDisconnectWallet.ts +7 -3
  145. package/src/hooks/wallet/useSignAndExecuteTransactionBlock.ts +7 -3
  146. package/src/hooks/wallet/useSignPersonalMessage.ts +7 -3
  147. package/src/hooks/wallet/useSignTransactionBlock.ts +7 -3
  148. package/src/hooks/wallet/useSwitchAccount.ts +7 -3
  149. package/src/hooks/wallet/useWalletPropertiesChanged.ts +1 -1
  150. package/src/index.ts +1 -0
  151. package/src/walletStore.ts +30 -2
@@ -2,9 +2,14 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import type { SuiClient } from '@mysten/sui.js/client';
5
- import type { UseInfiniteQueryOptions } from '@tanstack/react-query';
5
+ import type {
6
+ InfiniteData,
7
+ UseInfiniteQueryOptions,
8
+ UseInfiniteQueryResult,
9
+ } from '@tanstack/react-query';
6
10
  import { useInfiniteQuery } from '@tanstack/react-query';
7
11
 
12
+ import type { PartialBy } from '../types/utilityTypes.js';
8
13
  import { useSuiClientContext } from './useSuiClient.js';
9
14
 
10
15
  interface PaginatedResult {
@@ -12,52 +17,65 @@ interface PaginatedResult {
12
17
  nextCursor?: unknown;
13
18
  hasNextPage: boolean;
14
19
  }
20
+
15
21
  export type SuiRpcPaginatedMethodName = {
16
22
  [K in keyof SuiClient]: SuiClient[K] extends (input: any) => Promise<PaginatedResult> ? K : never;
17
23
  }[keyof SuiClient];
18
24
 
19
25
  export type SuiRpcPaginatedMethods = {
20
- [K in SuiRpcPaginatedMethodName]: SuiClient[K] extends (input: infer P) => Promise<{
21
- data?: infer R;
22
- nextCursor?: infer Cursor | null;
23
- hasNextPage: boolean;
24
- }>
26
+ [K in SuiRpcPaginatedMethodName]: SuiClient[K] extends (
27
+ input: infer Params,
28
+ ) => Promise<infer Result extends { nextCursor?: infer Cursor | null }>
25
29
  ? {
26
30
  name: K;
27
- result: R;
28
- params: P;
31
+ result: Result;
32
+ params: Params;
29
33
  cursor: Cursor;
30
34
  }
31
35
  : never;
32
36
  };
33
37
 
34
- export type UseSuiClientInfiniteQueryOptions<T extends keyof SuiRpcPaginatedMethods> = Omit<
35
- UseInfiniteQueryOptions<
36
- SuiRpcPaginatedMethods[T]['result'],
37
- Error,
38
- SuiRpcPaginatedMethods[T]['result'],
39
- SuiRpcPaginatedMethods[T]['result'],
40
- unknown[]
38
+ export type UseSuiClientInfiniteQueryOptions<
39
+ T extends keyof SuiRpcPaginatedMethods,
40
+ TData,
41
+ > = PartialBy<
42
+ Omit<
43
+ UseInfiniteQueryOptions<
44
+ SuiRpcPaginatedMethods[T]['result'],
45
+ Error,
46
+ TData,
47
+ SuiRpcPaginatedMethods[T]['result'],
48
+ unknown[]
49
+ >,
50
+ 'queryFn' | 'initialPageParam' | 'getNextPageParam'
41
51
  >,
42
- 'queryFn'
52
+ 'queryKey'
43
53
  >;
44
54
 
45
- export function useSuiClientInfiniteQuery<T extends keyof SuiRpcPaginatedMethods>(
55
+ export function useSuiClientInfiniteQuery<
56
+ T extends keyof SuiRpcPaginatedMethods,
57
+ TData = InfiniteData<SuiRpcPaginatedMethods[T]['result']>,
58
+ >(
46
59
  method: T,
47
60
  params: SuiRpcPaginatedMethods[T]['params'],
48
- { queryKey = [], enabled = !!params, ...options }: UseSuiClientInfiniteQueryOptions<T> = {},
49
- ) {
61
+ {
62
+ queryKey = [],
63
+ enabled = !!params,
64
+ ...options
65
+ }: UseSuiClientInfiniteQueryOptions<T, TData> = {},
66
+ ): UseInfiniteQueryResult<TData, Error> {
50
67
  const suiContext = useSuiClientContext();
51
68
 
52
69
  return useInfiniteQuery({
53
70
  ...options,
71
+ initialPageParam: null,
54
72
  queryKey: [suiContext.network, method, params, ...queryKey],
55
73
  enabled,
56
- queryFn: async () => {
57
- return await suiContext.client[method](params as never);
58
- },
59
- getNextPageParam: (lastPage) => {
60
- return (lastPage as PaginatedResult).nextCursor ?? null;
61
- },
74
+ queryFn: ({ pageParam }) =>
75
+ suiContext.client[method]({
76
+ ...(params ?? {}),
77
+ cursor: pageParam,
78
+ } as never),
79
+ getNextPageParam: ({ nextCursor }) => nextCursor ?? null,
62
80
  });
63
81
  }
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) Mysten Labs, Inc.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import type { UseMutationOptions } from '@tanstack/react-query';
4
+ import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
5
5
  import { useMutation } from '@tanstack/react-query';
6
6
 
7
7
  import { useSuiClientContext } from './useSuiClient.js';
@@ -15,7 +15,7 @@ export type UseSuiClientMutationOptions<T extends keyof SuiRpcMethods> = Omit<
15
15
  export function useSuiClientMutation<T extends keyof SuiRpcMethods>(
16
16
  method: T,
17
17
  options: UseSuiClientMutationOptions<T> = {},
18
- ) {
18
+ ): UseMutationResult<SuiRpcMethods[T]['result'], Error, SuiRpcMethods[T]['params'], unknown[]> {
19
19
  const suiContext = useSuiClientContext();
20
20
 
21
21
  return useMutation({
@@ -2,9 +2,10 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import type { SuiClient } from '@mysten/sui.js/client';
5
- import type { UseQueryOptions } from '@tanstack/react-query';
5
+ import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';
6
6
  import { useQuery } from '@tanstack/react-query';
7
7
 
8
+ import type { PartialBy } from '../types/utilityTypes.js';
8
9
  import { useSuiClientContext } from './useSuiClient.js';
9
10
 
10
11
  export type SuiRpcMethodName = {
@@ -29,20 +30,23 @@ export type SuiRpcMethods = {
29
30
  : never;
30
31
  };
31
32
 
32
- export type UseSuiClientQueryOptions<T extends keyof SuiRpcMethods> = Omit<
33
- UseQueryOptions<SuiRpcMethods[T]['result'], Error, SuiRpcMethods[T]['result'], unknown[]>,
34
- 'queryFn'
33
+ export type UseSuiClientQueryOptions<T extends keyof SuiRpcMethods, TData> = PartialBy<
34
+ Omit<UseQueryOptions<SuiRpcMethods[T]['result'], Error, TData, unknown[]>, 'queryFn'>,
35
+ 'queryKey'
35
36
  >;
36
37
 
37
- export function useSuiClientQuery<T extends keyof SuiRpcMethods>(
38
+ export function useSuiClientQuery<
39
+ T extends keyof SuiRpcMethods,
40
+ TData = SuiRpcMethods[T]['result'],
41
+ >(
38
42
  ...args: undefined extends SuiRpcMethods[T]['params']
39
- ? [method: T, params?: SuiRpcMethods[T]['params'], options?: UseSuiClientQueryOptions<T>]
40
- : [method: T, params: SuiRpcMethods[T]['params'], options?: UseSuiClientQueryOptions<T>]
41
- ) {
43
+ ? [method: T, params?: SuiRpcMethods[T]['params'], options?: UseSuiClientQueryOptions<T, TData>]
44
+ : [method: T, params: SuiRpcMethods[T]['params'], options?: UseSuiClientQueryOptions<T, TData>]
45
+ ): UseQueryResult<TData, Error> {
42
46
  const [method, params, { queryKey = [], ...options } = {}] = args as [
43
47
  method: T,
44
48
  params?: SuiRpcMethods[T]['params'],
45
- options?: UseSuiClientQueryOptions<T>,
49
+ options?: UseSuiClientQueryOptions<T, TData>,
46
50
  ];
47
51
 
48
52
  const suiContext = useSuiClientContext();
@@ -1,11 +1,13 @@
1
1
  // Copyright (c) Mysten Labs, Inc.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
+ import type { WalletAccount } from '@mysten/wallet-standard';
5
+
4
6
  import { useWalletStore } from './useWalletStore.js';
5
7
 
6
8
  /**
7
9
  * Retrieves a list of connected accounts authorized by the dApp.
8
10
  */
9
- export function useAccounts() {
11
+ export function useAccounts(): readonly WalletAccount[] {
10
12
  return useWalletStore((state) => state.accounts);
11
13
  }
@@ -4,31 +4,48 @@
4
4
  import { useEffect } from 'react';
5
5
 
6
6
  import { useConnectWallet } from './useConnectWallet.js';
7
+ import { useCurrentWallet } from './useCurrentWallet.js';
7
8
  import { useWallets } from './useWallets.js';
8
9
  import { useWalletStore } from './useWalletStore.js';
9
10
 
10
11
  export function useAutoConnectWallet(autoConnectEnabled: boolean) {
11
12
  const { mutate: connectWallet } = useConnectWallet();
12
- const wallets = useWallets();
13
+ const setAutoConnectionStatus = useWalletStore((state) => state.setAutoConnectionStatus);
13
14
  const lastConnectedWalletName = useWalletStore((state) => state.lastConnectedWalletName);
14
15
  const lastConnectedAccountAddress = useWalletStore((state) => state.lastConnectedAccountAddress);
16
+ const wallets = useWallets();
17
+ const { isDisconnected } = useCurrentWallet();
15
18
 
16
19
  useEffect(() => {
17
- if (!autoConnectEnabled || !lastConnectedWalletName) return;
20
+ if (
21
+ !autoConnectEnabled ||
22
+ !lastConnectedWalletName ||
23
+ !lastConnectedAccountAddress ||
24
+ !isDisconnected
25
+ ) {
26
+ return;
27
+ }
18
28
 
19
29
  const wallet = wallets.find((wallet) => wallet.name === lastConnectedWalletName);
20
30
  if (wallet) {
21
- connectWallet({
22
- wallet,
23
- accountAddress: lastConnectedAccountAddress || undefined,
24
- silent: true,
25
- });
31
+ connectWallet(
32
+ {
33
+ wallet,
34
+ accountAddress: lastConnectedAccountAddress,
35
+ silent: true,
36
+ },
37
+ {
38
+ onSettled: () => setAutoConnectionStatus('settled'),
39
+ },
40
+ );
26
41
  }
27
42
  }, [
28
43
  autoConnectEnabled,
29
44
  connectWallet,
45
+ isDisconnected,
30
46
  lastConnectedAccountAddress,
31
47
  lastConnectedWalletName,
48
+ setAutoConnectionStatus,
32
49
  wallets,
33
50
  ]);
34
51
  }
@@ -0,0 +1,12 @@
1
+ // Copyright (c) Mysten Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { useWalletStore } from './useWalletStore.js';
5
+
6
+ /**
7
+ * Retrieves the status for the initial wallet auto-connection process.
8
+ */
9
+ export function useAutoConnectionStatus() {
10
+ // TODO: Replace this with shareable mutation state once we require react-query v5
11
+ return useWalletStore((state) => state.autoConnectionStatus);
12
+ }
@@ -7,7 +7,7 @@ import type {
7
7
  WalletAccount,
8
8
  WalletWithRequiredFeatures,
9
9
  } from '@mysten/wallet-standard';
10
- import type { UseMutationOptions } from '@tanstack/react-query';
10
+ import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
11
11
  import { useMutation } from '@tanstack/react-query';
12
12
 
13
13
  import { walletMutationKeys } from '../../constants/walletMutationKeys.js';
@@ -34,20 +34,34 @@ type UseConnectWalletMutationOptions = Omit<
34
34
  export function useConnectWallet({
35
35
  mutationKey,
36
36
  ...mutationOptions
37
- }: UseConnectWalletMutationOptions = {}) {
37
+ }: UseConnectWalletMutationOptions = {}): UseMutationResult<
38
+ ConnectWalletResult,
39
+ Error,
40
+ ConnectWalletArgs,
41
+ unknown
42
+ > {
38
43
  const setWalletConnected = useWalletStore((state) => state.setWalletConnected);
44
+ const setConnectionStatus = useWalletStore((state) => state.setConnectionStatus);
39
45
 
40
46
  return useMutation({
41
47
  mutationKey: walletMutationKeys.connectWallet(mutationKey),
42
- mutationFn: async ({ wallet, accountAddress, ...standardConnectInput }) => {
43
- const connectResult = await wallet.features['standard:connect'].connect(standardConnectInput);
44
- const connectedSuiAccounts = connectResult.accounts.filter((account) =>
45
- account.chains.some((chain) => chain.split(':')[0] === 'sui'),
46
- );
47
- const selectedAccount = getSelectedAccount(connectedSuiAccounts, accountAddress);
48
+ mutationFn: async ({ wallet, accountAddress, ...connectArgs }) => {
49
+ try {
50
+ setConnectionStatus('connecting');
48
51
 
49
- setWalletConnected(wallet, connectedSuiAccounts, selectedAccount);
50
- return { accounts: connectedSuiAccounts };
52
+ const connectResult = await wallet.features['standard:connect'].connect(connectArgs);
53
+ const connectedSuiAccounts = connectResult.accounts.filter((account) =>
54
+ account.chains.some((chain) => chain.split(':')[0] === 'sui'),
55
+ );
56
+ const selectedAccount = getSelectedAccount(connectedSuiAccounts, accountAddress);
57
+
58
+ setWalletConnected(wallet, connectedSuiAccounts, selectedAccount);
59
+
60
+ return { accounts: connectedSuiAccounts };
61
+ } catch (error) {
62
+ setConnectionStatus('disconnected');
63
+ throw error;
64
+ }
51
65
  },
52
66
  ...mutationOptions,
53
67
  });
@@ -1,11 +1,13 @@
1
1
  // Copyright (c) Mysten Labs, Inc.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
+ import type { WalletAccount } from '@mysten/wallet-standard';
5
+
4
6
  import { useWalletStore } from './useWalletStore.js';
5
7
 
6
8
  /**
7
9
  * Retrieves the wallet account that is currently selected, if one exists.
8
10
  */
9
- export function useCurrentAccount() {
11
+ export function useCurrentAccount(): WalletAccount | null {
10
12
  return useWalletStore((state) => state.currentAccount);
11
13
  }
@@ -7,5 +7,34 @@ import { useWalletStore } from './useWalletStore.js';
7
7
  * Retrieves the wallet that is currently connected to the dApp, if one exists.
8
8
  */
9
9
  export function useCurrentWallet() {
10
- return useWalletStore((state) => state.currentWallet);
10
+ const currentWallet = useWalletStore((state) => state.currentWallet);
11
+ const connectionStatus = useWalletStore((state) => state.connectionStatus);
12
+
13
+ switch (connectionStatus) {
14
+ case 'connecting':
15
+ return {
16
+ connectionStatus,
17
+ currentWallet: null,
18
+ isDisconnected: false,
19
+ isConnecting: true,
20
+ isConnected: false,
21
+ } as const;
22
+ case 'disconnected':
23
+ return {
24
+ connectionStatus,
25
+ currentWallet: null,
26
+ isDisconnected: true,
27
+ isConnecting: false,
28
+ isConnected: false,
29
+ } as const;
30
+ case 'connected': {
31
+ return {
32
+ connectionStatus,
33
+ currentWallet: currentWallet!,
34
+ isDisconnected: false,
35
+ isConnecting: false,
36
+ isConnected: true,
37
+ } as const;
38
+ }
39
+ }
11
40
  }
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) Mysten Labs, Inc.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import type { UseMutationOptions } from '@tanstack/react-query';
4
+ import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
5
5
  import { useMutation } from '@tanstack/react-query';
6
6
 
7
7
  import { walletMutationKeys } from '../../constants/walletMutationKeys.js';
@@ -22,8 +22,12 @@ type UseDisconnectWalletMutationOptions = Omit<
22
22
  export function useDisconnectWallet({
23
23
  mutationKey,
24
24
  ...mutationOptions
25
- }: UseDisconnectWalletMutationOptions = {}) {
26
- const currentWallet = useCurrentWallet();
25
+ }: UseDisconnectWalletMutationOptions = {}): UseMutationResult<
26
+ void,
27
+ UseDisconnectWalletError,
28
+ void
29
+ > {
30
+ const { currentWallet } = useCurrentWallet();
27
31
  const setWalletDisconnected = useWalletStore((state) => state.setWalletDisconnected);
28
32
 
29
33
  return useMutation({
@@ -5,7 +5,7 @@ import type {
5
5
  SuiSignAndExecuteTransactionBlockInput,
6
6
  SuiSignAndExecuteTransactionBlockOutput,
7
7
  } from '@mysten/wallet-standard';
8
- import type { UseMutationOptions } from '@tanstack/react-query';
8
+ import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
9
9
  import { useMutation } from '@tanstack/react-query';
10
10
 
11
11
  import { walletMutationKeys } from '../../constants/walletMutationKeys.js';
@@ -51,8 +51,12 @@ export function useSignAndExecuteTransactionBlock({
51
51
  mutationKey,
52
52
  executeFromWallet,
53
53
  ...mutationOptions
54
- }: UseSignAndExecuteTransactionBlockMutationOptions = {}) {
55
- const currentWallet = useCurrentWallet();
54
+ }: UseSignAndExecuteTransactionBlockMutationOptions = {}): UseMutationResult<
55
+ UseSignAndExecuteTransactionBlockResult,
56
+ UseSignAndExecuteTransactionBlockError,
57
+ UseSignAndExecuteTransactionBlockArgs
58
+ > {
59
+ const { currentWallet } = useCurrentWallet();
56
60
  const currentAccount = useCurrentAccount();
57
61
  const client = useSuiClient();
58
62
 
@@ -5,7 +5,7 @@ import type {
5
5
  SuiSignPersonalMessageInput,
6
6
  SuiSignPersonalMessageOutput,
7
7
  } from '@mysten/wallet-standard';
8
- import type { UseMutationOptions } from '@tanstack/react-query';
8
+ import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
9
9
  import { useMutation } from '@tanstack/react-query';
10
10
 
11
11
  import {
@@ -44,8 +44,12 @@ type UseSignPersonalMessageMutationOptions = Omit<
44
44
  export function useSignPersonalMessage({
45
45
  mutationKey,
46
46
  ...mutationOptions
47
- }: UseSignPersonalMessageMutationOptions = {}) {
48
- const currentWallet = useCurrentWallet();
47
+ }: UseSignPersonalMessageMutationOptions = {}): UseMutationResult<
48
+ UseSignPersonalMessageResult,
49
+ UseSignPersonalMessageError,
50
+ UseSignPersonalMessageArgs
51
+ > {
52
+ const { currentWallet } = useCurrentWallet();
49
53
  const currentAccount = useCurrentAccount();
50
54
 
51
55
  return useMutation({
@@ -5,7 +5,7 @@ import type {
5
5
  SuiSignTransactionBlockInput,
6
6
  SuiSignTransactionBlockOutput,
7
7
  } from '@mysten/wallet-standard';
8
- import type { UseMutationOptions } from '@tanstack/react-query';
8
+ import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
9
9
  import { useMutation } from '@tanstack/react-query';
10
10
 
11
11
  import {
@@ -44,8 +44,12 @@ type UseSignTransactionBlockMutationOptions = Omit<
44
44
  export function useSignTransactionBlock({
45
45
  mutationKey,
46
46
  ...mutationOptions
47
- }: UseSignTransactionBlockMutationOptions = {}) {
48
- const currentWallet = useCurrentWallet();
47
+ }: UseSignTransactionBlockMutationOptions = {}): UseMutationResult<
48
+ UseSignTransactionBlockResult,
49
+ UseSignTransactionBlockError,
50
+ UseSignTransactionBlockArgs
51
+ > {
52
+ const { currentWallet } = useCurrentWallet();
49
53
  const currentAccount = useCurrentAccount();
50
54
 
51
55
  return useMutation({
@@ -2,7 +2,7 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import type { WalletAccount } from '@mysten/wallet-standard';
5
- import type { UseMutationOptions } from '@tanstack/react-query';
5
+ import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
6
6
  import { useMutation } from '@tanstack/react-query';
7
7
 
8
8
  import { walletMutationKeys } from '../../constants/walletMutationKeys.js';
@@ -29,8 +29,12 @@ type UseSwitchAccountMutationOptions = Omit<
29
29
  export function useSwitchAccount({
30
30
  mutationKey,
31
31
  ...mutationOptions
32
- }: UseSwitchAccountMutationOptions = {}) {
33
- const currentWallet = useCurrentWallet();
32
+ }: UseSwitchAccountMutationOptions = {}): UseMutationResult<
33
+ SwitchAccountResult,
34
+ UseSwitchAccountError,
35
+ SwitchAccountArgs
36
+ > {
37
+ const { currentWallet } = useCurrentWallet();
34
38
  const setAccountSwitched = useWalletStore((state) => state.setAccountSwitched);
35
39
 
36
40
  return useMutation({
@@ -10,7 +10,7 @@ import { useWalletStore } from './useWalletStore.js';
10
10
  * Internal hook for easily handling various changes in properties for a wallet.
11
11
  */
12
12
  export function useWalletPropertiesChanged() {
13
- const currentWallet = useCurrentWallet();
13
+ const { currentWallet } = useCurrentWallet();
14
14
  const updateWalletAccounts = useWalletStore((state) => state.updateWalletAccounts);
15
15
 
16
16
  useEffect(() => {
package/src/index.ts CHANGED
@@ -13,6 +13,7 @@ export * from './hooks/useSuiClientInfiniteQuery.js';
13
13
  export * from './hooks/useSuiClientMutation.js';
14
14
  export * from './hooks/useSuiClientQuery.js';
15
15
  export * from './hooks/wallet/useAccounts.js';
16
+ export * from './hooks/wallet/useAutoConnectionStatus.js';
16
17
  export * from './hooks/wallet/useConnectWallet.js';
17
18
  export * from './hooks/wallet/useCurrentAccount.js';
18
19
  export * from './hooks/wallet/useCurrentWallet.js';
@@ -6,8 +6,14 @@ import { createStore } from 'zustand';
6
6
  import type { StateStorage } from 'zustand/middleware';
7
7
  import { createJSONStorage, persist } from 'zustand/middleware';
8
8
 
9
+ type WalletConnectionStatus = 'disconnected' | 'connecting' | 'connected';
10
+
11
+ type WalletAutoConnectionStatus = 'disabled' | 'idle' | 'settled';
12
+
9
13
  export type WalletActions = {
10
14
  setAccountSwitched: (selectedAccount: WalletAccount) => void;
15
+ setConnectionStatus: (connectionStatus: WalletConnectionStatus) => void;
16
+ setAutoConnectionStatus: (autoConnectionStatus: WalletAutoConnectionStatus) => void;
11
17
  setWalletConnected: (
12
18
  wallet: WalletWithRequiredFeatures,
13
19
  connectedAccounts: readonly WalletAccount[],
@@ -31,15 +37,23 @@ export type StoreState = {
31
37
  currentAccount: WalletAccount | null;
32
38
  lastConnectedAccountAddress: string | null;
33
39
  lastConnectedWalletName: string | null;
40
+ connectionStatus: WalletConnectionStatus;
41
+ autoConnectionStatus: WalletAutoConnectionStatus;
34
42
  } & WalletActions;
35
43
 
36
- export type WalletConfiguration = {
44
+ type WalletConfiguration = {
37
45
  wallets: WalletWithRequiredFeatures[];
46
+ autoConnect: boolean;
38
47
  storage: StateStorage;
39
48
  storageKey: string;
40
49
  };
41
50
 
42
- export function createWalletStore({ wallets, storage, storageKey }: WalletConfiguration) {
51
+ export function createWalletStore({
52
+ wallets,
53
+ storage,
54
+ storageKey,
55
+ autoConnect,
56
+ }: WalletConfiguration) {
43
57
  return createStore<StoreState>()(
44
58
  persist(
45
59
  (set, get) => ({
@@ -50,6 +64,17 @@ export function createWalletStore({ wallets, storage, storageKey }: WalletConfig
50
64
  lastConnectedAccountAddress: null,
51
65
  lastConnectedWalletName: null,
52
66
  connectionStatus: 'disconnected',
67
+ autoConnectionStatus: autoConnect ? 'idle' : 'disabled',
68
+ setConnectionStatus(connectionStatus) {
69
+ set(() => ({
70
+ connectionStatus,
71
+ }));
72
+ },
73
+ setAutoConnectionStatus(autoConnectionStatus) {
74
+ set(() => ({
75
+ autoConnectionStatus,
76
+ }));
77
+ },
53
78
  setWalletConnected(wallet, connectedAccounts, selectedAccount) {
54
79
  set(() => ({
55
80
  accounts: connectedAccounts,
@@ -57,6 +82,7 @@ export function createWalletStore({ wallets, storage, storageKey }: WalletConfig
57
82
  currentAccount: selectedAccount,
58
83
  lastConnectedWalletName: wallet.name,
59
84
  lastConnectedAccountAddress: selectedAccount?.address,
85
+ connectionStatus: 'connected',
60
86
  }));
61
87
  },
62
88
  setWalletDisconnected() {
@@ -66,6 +92,7 @@ export function createWalletStore({ wallets, storage, storageKey }: WalletConfig
66
92
  currentAccount: null,
67
93
  lastConnectedWalletName: null,
68
94
  lastConnectedAccountAddress: null,
95
+ connectionStatus: 'disconnected',
69
96
  }));
70
97
  },
71
98
  setAccountSwitched(selectedAccount) {
@@ -86,6 +113,7 @@ export function createWalletStore({ wallets, storage, storageKey }: WalletConfig
86
113
  currentAccount: null,
87
114
  lastConnectedWalletName: null,
88
115
  lastConnectedAccountAddress: null,
116
+ connectionStatus: 'disconnected',
89
117
  }));
90
118
  } else {
91
119
  set(() => ({ wallets: updatedWallets }));