@mysten/dapp-kit 0.4.0 → 0.6.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 (150) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +6 -6
  3. package/dist/cjs/components/AccountDropdownMenu.d.ts +4 -0
  4. package/dist/cjs/components/AccountDropdownMenu.js +61 -18
  5. package/dist/cjs/components/AccountDropdownMenu.js.map +2 -2
  6. package/dist/cjs/components/ConnectButton.js +74 -25
  7. package/dist/cjs/components/ConnectButton.js.map +3 -3
  8. package/dist/cjs/components/SuiClientProvider.d.ts +4 -4
  9. package/dist/cjs/components/SuiClientProvider.js +1 -0
  10. package/dist/cjs/components/SuiClientProvider.js.map +2 -2
  11. package/dist/cjs/components/WalletProvider.js +91 -28
  12. package/dist/cjs/components/WalletProvider.js.map +3 -3
  13. package/dist/cjs/components/connect-modal/ConnectModal.js +15 -8
  14. package/dist/cjs/components/connect-modal/ConnectModal.js.map +2 -2
  15. package/dist/cjs/hooks/networkConfig.d.ts +10 -0
  16. package/dist/cjs/hooks/networkConfig.js +74 -0
  17. package/dist/cjs/hooks/networkConfig.js.map +7 -0
  18. package/dist/cjs/hooks/useResolveSuiNSNames.d.ts +3 -105
  19. package/dist/cjs/hooks/useResolveSuiNSNames.js +6 -5
  20. package/dist/cjs/hooks/useResolveSuiNSNames.js.map +2 -2
  21. package/dist/cjs/hooks/useSuiClient.js.map +2 -2
  22. package/dist/cjs/hooks/useSuiClientInfiniteQuery.d.ts +7 -8
  23. package/dist/cjs/hooks/useSuiClientInfiniteQuery.js +11 -7
  24. package/dist/cjs/hooks/useSuiClientInfiniteQuery.js.map +2 -2
  25. package/dist/cjs/hooks/useSuiClientMutation.d.ts +1 -1
  26. package/dist/cjs/hooks/useSuiClientMutation.js.map +2 -2
  27. package/dist/cjs/hooks/useSuiClientQuery.d.ts +3 -2
  28. package/dist/cjs/hooks/useSuiClientQuery.js.map +2 -2
  29. package/dist/cjs/hooks/wallet/useAutoConnectWallet.js +65 -15
  30. package/dist/cjs/hooks/wallet/useAutoConnectWallet.js.map +3 -3
  31. package/dist/cjs/hooks/wallet/useAutoConnectionStatus.d.ts +4 -0
  32. package/dist/cjs/hooks/wallet/useAutoConnectionStatus.js +50 -0
  33. package/dist/cjs/hooks/wallet/useAutoConnectionStatus.js.map +7 -0
  34. package/dist/cjs/hooks/wallet/useConnectWallet.d.ts +1 -1
  35. package/dist/cjs/hooks/wallet/useConnectWallet.js +15 -8
  36. package/dist/cjs/hooks/wallet/useConnectWallet.js.map +2 -2
  37. package/dist/cjs/hooks/wallet/useCurrentWallet.d.ts +19 -1
  38. package/dist/cjs/hooks/wallet/useCurrentWallet.js +29 -1
  39. package/dist/cjs/hooks/wallet/useCurrentWallet.js.map +2 -2
  40. package/dist/cjs/hooks/wallet/useDisconnectWallet.d.ts +1 -1
  41. package/dist/cjs/hooks/wallet/useDisconnectWallet.js +30 -2
  42. package/dist/cjs/hooks/wallet/useDisconnectWallet.js.map +2 -2
  43. package/dist/cjs/hooks/wallet/useSignAndExecuteTransactionBlock.d.ts +1 -1
  44. package/dist/cjs/hooks/wallet/useSignAndExecuteTransactionBlock.js +30 -2
  45. package/dist/cjs/hooks/wallet/useSignAndExecuteTransactionBlock.js.map +2 -2
  46. package/dist/cjs/hooks/wallet/useSignPersonalMessage.d.ts +1 -1
  47. package/dist/cjs/hooks/wallet/useSignPersonalMessage.js +30 -2
  48. package/dist/cjs/hooks/wallet/useSignPersonalMessage.js.map +2 -2
  49. package/dist/cjs/hooks/wallet/useSignTransactionBlock.d.ts +1 -1
  50. package/dist/cjs/hooks/wallet/useSignTransactionBlock.js +30 -2
  51. package/dist/cjs/hooks/wallet/useSignTransactionBlock.js.map +2 -2
  52. package/dist/cjs/hooks/wallet/useSwitchAccount.d.ts +1 -1
  53. package/dist/cjs/hooks/wallet/useSwitchAccount.js +30 -2
  54. package/dist/cjs/hooks/wallet/useSwitchAccount.js.map +2 -2
  55. package/dist/cjs/hooks/wallet/useUnsafeBurnerWallet.js.map +2 -2
  56. package/dist/cjs/hooks/wallet/useWalletPropertiesChanged.js +30 -2
  57. package/dist/cjs/hooks/wallet/useWalletPropertiesChanged.js.map +2 -2
  58. package/dist/cjs/index.css +127 -127
  59. package/dist/cjs/index.css.map +3 -3
  60. package/dist/cjs/index.d.ts +14 -10
  61. package/dist/cjs/index.js +698 -577
  62. package/dist/cjs/index.js.map +4 -4
  63. package/dist/cjs/walletStore.d.ts +10 -2
  64. package/dist/cjs/walletStore.js +23 -4
  65. package/dist/cjs/walletStore.js.map +2 -2
  66. package/dist/esm/components/AccountDropdownMenu.d.ts +4 -0
  67. package/dist/esm/components/AccountDropdownMenu.js +61 -18
  68. package/dist/esm/components/AccountDropdownMenu.js.map +2 -2
  69. package/dist/esm/components/ConnectButton.js +74 -25
  70. package/dist/esm/components/ConnectButton.js.map +3 -3
  71. package/dist/esm/components/SuiClientProvider.d.ts +4 -4
  72. package/dist/esm/components/SuiClientProvider.js +1 -0
  73. package/dist/esm/components/SuiClientProvider.js.map +2 -2
  74. package/dist/esm/components/WalletProvider.js +91 -28
  75. package/dist/esm/components/WalletProvider.js.map +3 -3
  76. package/dist/esm/components/connect-modal/ConnectModal.js +15 -8
  77. package/dist/esm/components/connect-modal/ConnectModal.js.map +2 -2
  78. package/dist/esm/hooks/networkConfig.d.ts +10 -0
  79. package/dist/esm/hooks/networkConfig.js +51 -0
  80. package/dist/esm/hooks/networkConfig.js.map +7 -0
  81. package/dist/esm/hooks/useResolveSuiNSNames.d.ts +3 -105
  82. package/dist/esm/hooks/useResolveSuiNSNames.js +6 -5
  83. package/dist/esm/hooks/useResolveSuiNSNames.js.map +2 -2
  84. package/dist/esm/hooks/useSuiClient.js.map +2 -2
  85. package/dist/esm/hooks/useSuiClientInfiniteQuery.d.ts +7 -8
  86. package/dist/esm/hooks/useSuiClientInfiniteQuery.js +11 -7
  87. package/dist/esm/hooks/useSuiClientInfiniteQuery.js.map +2 -2
  88. package/dist/esm/hooks/useSuiClientMutation.d.ts +1 -1
  89. package/dist/esm/hooks/useSuiClientMutation.js.map +2 -2
  90. package/dist/esm/hooks/useSuiClientQuery.d.ts +3 -2
  91. package/dist/esm/hooks/useSuiClientQuery.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 +1 -1
  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/useCurrentWallet.d.ts +19 -1
  101. package/dist/esm/hooks/wallet/useCurrentWallet.js +29 -1
  102. package/dist/esm/hooks/wallet/useCurrentWallet.js.map +2 -2
  103. package/dist/esm/hooks/wallet/useDisconnectWallet.d.ts +1 -1
  104. package/dist/esm/hooks/wallet/useDisconnectWallet.js +30 -2
  105. package/dist/esm/hooks/wallet/useDisconnectWallet.js.map +2 -2
  106. package/dist/esm/hooks/wallet/useSignAndExecuteTransactionBlock.d.ts +1 -1
  107. package/dist/esm/hooks/wallet/useSignAndExecuteTransactionBlock.js +30 -2
  108. package/dist/esm/hooks/wallet/useSignAndExecuteTransactionBlock.js.map +2 -2
  109. package/dist/esm/hooks/wallet/useSignPersonalMessage.d.ts +1 -1
  110. package/dist/esm/hooks/wallet/useSignPersonalMessage.js +30 -2
  111. package/dist/esm/hooks/wallet/useSignPersonalMessage.js.map +2 -2
  112. package/dist/esm/hooks/wallet/useSignTransactionBlock.d.ts +1 -1
  113. package/dist/esm/hooks/wallet/useSignTransactionBlock.js +30 -2
  114. package/dist/esm/hooks/wallet/useSignTransactionBlock.js.map +2 -2
  115. package/dist/esm/hooks/wallet/useSwitchAccount.d.ts +1 -1
  116. package/dist/esm/hooks/wallet/useSwitchAccount.js +30 -2
  117. package/dist/esm/hooks/wallet/useSwitchAccount.js.map +2 -2
  118. package/dist/esm/hooks/wallet/useUnsafeBurnerWallet.js.map +2 -2
  119. package/dist/esm/hooks/wallet/useWalletPropertiesChanged.js +30 -2
  120. package/dist/esm/hooks/wallet/useWalletPropertiesChanged.js.map +2 -2
  121. package/dist/esm/index.css +127 -127
  122. package/dist/esm/index.css.map +3 -3
  123. package/dist/esm/index.d.ts +14 -10
  124. package/dist/esm/index.js +692 -571
  125. package/dist/esm/index.js.map +4 -4
  126. package/dist/esm/walletStore.d.ts +10 -2
  127. package/dist/esm/walletStore.js +23 -4
  128. package/dist/esm/walletStore.js.map +2 -2
  129. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  130. package/dist/tsconfig.tsbuildinfo +1 -1
  131. package/package.json +5 -5
  132. package/src/components/AccountDropdownMenu.tsx +26 -8
  133. package/src/components/SuiClientProvider.tsx +11 -2
  134. package/src/components/WalletProvider.tsx +1 -0
  135. package/src/hooks/networkConfig.ts +45 -0
  136. package/src/hooks/useResolveSuiNSNames.ts +14 -5
  137. package/src/hooks/useSuiClientInfiniteQuery.ts +38 -24
  138. package/src/hooks/useSuiClientQuery.ts +11 -7
  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 +17 -8
  142. package/src/hooks/wallet/useCurrentWallet.ts +30 -1
  143. package/src/hooks/wallet/useDisconnectWallet.ts +1 -1
  144. package/src/hooks/wallet/useSignAndExecuteTransactionBlock.ts +1 -1
  145. package/src/hooks/wallet/useSignPersonalMessage.ts +1 -1
  146. package/src/hooks/wallet/useSignTransactionBlock.ts +1 -1
  147. package/src/hooks/wallet/useSwitchAccount.ts +1 -1
  148. package/src/hooks/wallet/useWalletPropertiesChanged.ts +1 -1
  149. package/src/index.ts +14 -10
  150. package/src/walletStore.ts +30 -2
@@ -1,21 +1,30 @@
1
1
  // Copyright (c) Mysten Labs, Inc.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
+ import type { ResolvedNameServiceNames } from '@mysten/sui.js/client';
5
+ import type { UseQueryOptions } from '@tanstack/react-query';
6
+
4
7
  import { useSuiClientQuery } from './useSuiClientQuery.js';
5
8
 
6
- export function useResolveSuiNSName(address?: string | null) {
7
- const { data, ...rest } = useSuiClientQuery(
9
+ export function useResolveSuiNSName(
10
+ address?: string | null,
11
+ options?: Omit<
12
+ UseQueryOptions<ResolvedNameServiceNames, Error, string | null, unknown[]>,
13
+ 'queryFn' | 'queryKey'
14
+ >,
15
+ ) {
16
+ return useSuiClientQuery(
8
17
  'resolveNameServiceNames',
9
18
  {
10
19
  address: address!,
11
20
  limit: 1,
12
21
  },
13
22
  {
14
- enabled: !!address,
23
+ ...options,
15
24
  refetchOnWindowFocus: false,
16
25
  retry: false,
26
+ select: (data) => (data.data.length > 0 ? data.data[0] : null),
27
+ enabled: !!address && options?.enabled !== false,
17
28
  },
18
29
  );
19
-
20
- return { data: data?.data?.[0] ?? null, ...rest };
21
30
  }
@@ -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 { UseInfiniteQueryOptions } from '@tanstack/react-query';
5
+ import type { InfiniteData, UseInfiniteQueryOptions } from '@tanstack/react-query';
6
6
  import { useInfiniteQuery } 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
  interface PaginatedResult {
@@ -12,52 +13,65 @@ interface PaginatedResult {
12
13
  nextCursor?: unknown;
13
14
  hasNextPage: boolean;
14
15
  }
16
+
15
17
  export type SuiRpcPaginatedMethodName = {
16
18
  [K in keyof SuiClient]: SuiClient[K] extends (input: any) => Promise<PaginatedResult> ? K : never;
17
19
  }[keyof SuiClient];
18
20
 
19
21
  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
- }>
22
+ [K in SuiRpcPaginatedMethodName]: SuiClient[K] extends (
23
+ input: infer Params,
24
+ ) => Promise<infer Result extends { nextCursor?: infer Cursor | null }>
25
25
  ? {
26
26
  name: K;
27
- result: R;
28
- params: P;
27
+ result: Result;
28
+ params: Params;
29
29
  cursor: Cursor;
30
30
  }
31
31
  : never;
32
32
  };
33
33
 
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[]
34
+ export type UseSuiClientInfiniteQueryOptions<
35
+ T extends keyof SuiRpcPaginatedMethods,
36
+ TData,
37
+ > = PartialBy<
38
+ Omit<
39
+ UseInfiniteQueryOptions<
40
+ SuiRpcPaginatedMethods[T]['result'],
41
+ Error,
42
+ TData,
43
+ SuiRpcPaginatedMethods[T]['result'],
44
+ unknown[]
45
+ >,
46
+ 'queryFn' | 'initialPageParam' | 'getNextPageParam'
41
47
  >,
42
- 'queryFn'
48
+ 'queryKey'
43
49
  >;
44
50
 
45
- export function useSuiClientInfiniteQuery<T extends keyof SuiRpcPaginatedMethods>(
51
+ export function useSuiClientInfiniteQuery<
52
+ T extends keyof SuiRpcPaginatedMethods,
53
+ TData = InfiniteData<SuiRpcPaginatedMethods[T]['result']>,
54
+ >(
46
55
  method: T,
47
56
  params: SuiRpcPaginatedMethods[T]['params'],
48
- { queryKey = [], enabled = !!params, ...options }: UseSuiClientInfiniteQueryOptions<T> = {},
57
+ {
58
+ queryKey = [],
59
+ enabled = !!params,
60
+ ...options
61
+ }: UseSuiClientInfiniteQueryOptions<T, TData> = {},
49
62
  ) {
50
63
  const suiContext = useSuiClientContext();
51
64
 
52
65
  return useInfiniteQuery({
53
66
  ...options,
67
+ initialPageParam: null,
54
68
  queryKey: [suiContext.network, method, params, ...queryKey],
55
69
  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
- },
70
+ queryFn: ({ pageParam }) =>
71
+ suiContext.client[method]({
72
+ ...(params ?? {}),
73
+ cursor: pageParam,
74
+ } as never),
75
+ getNextPageParam: ({ nextCursor }) => nextCursor ?? null,
62
76
  });
63
77
  }
@@ -5,6 +5,7 @@ import type { SuiClient } from '@mysten/sui.js/client';
5
5
  import type { UseQueryOptions } 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>]
43
+ ? [method: T, params?: SuiRpcMethods[T]['params'], options?: UseSuiClientQueryOptions<T, TData>]
44
+ : [method: T, params: SuiRpcMethods[T]['params'], options?: UseSuiClientQueryOptions<T, TData>]
41
45
  ) {
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();
@@ -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
+ }
@@ -36,18 +36,27 @@ export function useConnectWallet({
36
36
  ...mutationOptions
37
37
  }: UseConnectWalletMutationOptions = {}) {
38
38
  const setWalletConnected = useWalletStore((state) => state.setWalletConnected);
39
+ const setConnectionStatus = useWalletStore((state) => state.setConnectionStatus);
39
40
 
40
41
  return useMutation({
41
42
  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);
43
+ mutationFn: async ({ wallet, accountAddress, ...connectArgs }) => {
44
+ try {
45
+ setConnectionStatus('connecting');
48
46
 
49
- setWalletConnected(wallet, connectedSuiAccounts, selectedAccount);
50
- return { accounts: connectedSuiAccounts };
47
+ const connectResult = await wallet.features['standard:connect'].connect(connectArgs);
48
+ const connectedSuiAccounts = connectResult.accounts.filter((account) =>
49
+ account.chains.some((chain) => chain.split(':')[0] === 'sui'),
50
+ );
51
+ const selectedAccount = getSelectedAccount(connectedSuiAccounts, accountAddress);
52
+
53
+ setWalletConnected(wallet, connectedSuiAccounts, selectedAccount);
54
+
55
+ return { accounts: connectedSuiAccounts };
56
+ } catch (error) {
57
+ setConnectionStatus('disconnected');
58
+ throw error;
59
+ }
51
60
  },
52
61
  ...mutationOptions,
53
62
  });
@@ -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
  }
@@ -23,7 +23,7 @@ export function useDisconnectWallet({
23
23
  mutationKey,
24
24
  ...mutationOptions
25
25
  }: UseDisconnectWalletMutationOptions = {}) {
26
- const currentWallet = useCurrentWallet();
26
+ const { currentWallet } = useCurrentWallet();
27
27
  const setWalletDisconnected = useWalletStore((state) => state.setWalletDisconnected);
28
28
 
29
29
  return useMutation({
@@ -52,7 +52,7 @@ export function useSignAndExecuteTransactionBlock({
52
52
  executeFromWallet,
53
53
  ...mutationOptions
54
54
  }: UseSignAndExecuteTransactionBlockMutationOptions = {}) {
55
- const currentWallet = useCurrentWallet();
55
+ const { currentWallet } = useCurrentWallet();
56
56
  const currentAccount = useCurrentAccount();
57
57
  const client = useSuiClient();
58
58
 
@@ -45,7 +45,7 @@ export function useSignPersonalMessage({
45
45
  mutationKey,
46
46
  ...mutationOptions
47
47
  }: UseSignPersonalMessageMutationOptions = {}) {
48
- const currentWallet = useCurrentWallet();
48
+ const { currentWallet } = useCurrentWallet();
49
49
  const currentAccount = useCurrentAccount();
50
50
 
51
51
  return useMutation({
@@ -45,7 +45,7 @@ export function useSignTransactionBlock({
45
45
  mutationKey,
46
46
  ...mutationOptions
47
47
  }: UseSignTransactionBlockMutationOptions = {}) {
48
- const currentWallet = useCurrentWallet();
48
+ const { currentWallet } = useCurrentWallet();
49
49
  const currentAccount = useCurrentAccount();
50
50
 
51
51
  return useMutation({
@@ -30,7 +30,7 @@ export function useSwitchAccount({
30
30
  mutationKey,
31
31
  ...mutationOptions
32
32
  }: UseSwitchAccountMutationOptions = {}) {
33
- const currentWallet = useCurrentWallet();
33
+ const { currentWallet } = useCurrentWallet();
34
34
  const setAccountSwitched = useWalletStore((state) => state.setAccountSwitched);
35
35
 
36
36
  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
@@ -1,24 +1,28 @@
1
1
  // Copyright (c) Mysten Labs, Inc.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- export * from './hooks/useSuiClient.js';
5
- export * from './components/ConnectButton.js';
6
4
  export * from './components/connect-modal/ConnectModal.js';
5
+ export * from './components/ConnectButton.js';
7
6
  export * from './components/SuiClientProvider.js';
8
7
  export * from './components/WalletProvider.js';
9
- export * from './hooks/wallet/useCurrentAccount.js';
10
- export * from './hooks/wallet/useCurrentWallet.js';
11
- export * from './hooks/wallet/useWallets.js';
8
+ export * from './hooks/networkConfig.js';
9
+ export * from './hooks/useResolveSuiNSNames.js';
10
+ export * from './hooks/useSuiClient.js';
11
+ export * from './hooks/useSuiClientInfiniteQuery.js';
12
+ export * from './hooks/useSuiClientInfiniteQuery.js';
13
+ export * from './hooks/useSuiClientMutation.js';
14
+ export * from './hooks/useSuiClientQuery.js';
12
15
  export * from './hooks/wallet/useAccounts.js';
13
- export * from './hooks/wallet/useSwitchAccount.js';
16
+ export * from './hooks/wallet/useAutoConnectionStatus.js';
14
17
  export * from './hooks/wallet/useConnectWallet.js';
18
+ export * from './hooks/wallet/useCurrentAccount.js';
19
+ export * from './hooks/wallet/useCurrentWallet.js';
15
20
  export * from './hooks/wallet/useDisconnectWallet.js';
21
+ export * from './hooks/wallet/useSignAndExecuteTransactionBlock.js';
16
22
  export * from './hooks/wallet/useSignPersonalMessage.js';
17
23
  export * from './hooks/wallet/useSignTransactionBlock.js';
18
- export * from './hooks/wallet/useSignAndExecuteTransactionBlock.js';
19
- export * from './hooks/useSuiClientMutation.js';
20
- export * from './hooks/useSuiClientQuery.js';
21
- export * from './hooks/useSuiClientInfiniteQuery.js';
24
+ export * from './hooks/wallet/useSwitchAccount.js';
25
+ export * from './hooks/wallet/useWallets.js';
22
26
  export * from './themes/lightTheme.js';
23
27
  export * from './types.js';
24
28
 
@@ -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 }));