@growae/reactive-react 0.0.1

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 (119) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +47 -0
  3. package/src/context.test.ts +52 -0
  4. package/src/context.ts +25 -0
  5. package/src/errors/base.ts +8 -0
  6. package/src/errors/context.ts +12 -0
  7. package/src/errors/index.ts +5 -0
  8. package/src/exports/index.ts +230 -0
  9. package/src/exports/query.ts +12 -0
  10. package/src/hooks/index.ts +69 -0
  11. package/src/hooks/useAccount.test.ts +12 -0
  12. package/src/hooks/useAccount.ts +43 -0
  13. package/src/hooks/useBalance.test.ts +72 -0
  14. package/src/hooks/useBalance.ts +42 -0
  15. package/src/hooks/useBlock.test.ts +12 -0
  16. package/src/hooks/useBlock.ts +42 -0
  17. package/src/hooks/useCallContract.test.ts +12 -0
  18. package/src/hooks/useCallContract.ts +54 -0
  19. package/src/hooks/useChannelDeposit.test.ts +12 -0
  20. package/src/hooks/useChannelDeposit.ts +53 -0
  21. package/src/hooks/useClaimName.test.ts +12 -0
  22. package/src/hooks/useClaimName.ts +53 -0
  23. package/src/hooks/useCloseChannel.test.ts +12 -0
  24. package/src/hooks/useCloseChannel.ts +53 -0
  25. package/src/hooks/useConfig.test.ts +53 -0
  26. package/src/hooks/useConfig.ts +20 -0
  27. package/src/hooks/useConnect.test.ts +67 -0
  28. package/src/hooks/useConnect.ts +69 -0
  29. package/src/hooks/useConnection.test.ts +12 -0
  30. package/src/hooks/useConnection.ts +26 -0
  31. package/src/hooks/useConnections.test.ts +12 -0
  32. package/src/hooks/useConnections.ts +26 -0
  33. package/src/hooks/useConnectorClient.test.ts +12 -0
  34. package/src/hooks/useConnectorClient.ts +44 -0
  35. package/src/hooks/useConnectors.test.ts +12 -0
  36. package/src/hooks/useConnectors.ts +26 -0
  37. package/src/hooks/useContractBytecode.test.ts +12 -0
  38. package/src/hooks/useContractBytecode.ts +41 -0
  39. package/src/hooks/useContractEvents.test.ts +12 -0
  40. package/src/hooks/useContractEvents.ts +42 -0
  41. package/src/hooks/useDeployContract.test.ts +12 -0
  42. package/src/hooks/useDeployContract.ts +54 -0
  43. package/src/hooks/useDisconnect.test.ts +12 -0
  44. package/src/hooks/useDisconnect.ts +54 -0
  45. package/src/hooks/useEstimateGas.test.ts +12 -0
  46. package/src/hooks/useEstimateGas.ts +42 -0
  47. package/src/hooks/useHeight.test.ts +12 -0
  48. package/src/hooks/useHeight.ts +39 -0
  49. package/src/hooks/useNetworkId.test.ts +54 -0
  50. package/src/hooks/useNetworkId.ts +26 -0
  51. package/src/hooks/useNetworks.test.ts +12 -0
  52. package/src/hooks/useNetworks.ts +19 -0
  53. package/src/hooks/useNodeClient.test.ts +12 -0
  54. package/src/hooks/useNodeClient.ts +30 -0
  55. package/src/hooks/useOpenChannel.test.ts +12 -0
  56. package/src/hooks/useOpenChannel.ts +53 -0
  57. package/src/hooks/useOracleQueries.test.ts +12 -0
  58. package/src/hooks/useOracleQueries.ts +40 -0
  59. package/src/hooks/useOracleState.test.ts +12 -0
  60. package/src/hooks/useOracleState.ts +40 -0
  61. package/src/hooks/usePayForTransaction.test.ts +12 -0
  62. package/src/hooks/usePayForTransaction.ts +54 -0
  63. package/src/hooks/usePreclaimName.test.ts +12 -0
  64. package/src/hooks/usePreclaimName.ts +53 -0
  65. package/src/hooks/useQueryOracle.test.ts +12 -0
  66. package/src/hooks/useQueryOracle.ts +53 -0
  67. package/src/hooks/useReadContract.test.ts +12 -0
  68. package/src/hooks/useReadContract.ts +43 -0
  69. package/src/hooks/useReadContracts.test.ts +12 -0
  70. package/src/hooks/useReadContracts.ts +38 -0
  71. package/src/hooks/useReconnect.test.ts +12 -0
  72. package/src/hooks/useReconnect.ts +54 -0
  73. package/src/hooks/useRegisterOracle.test.ts +12 -0
  74. package/src/hooks/useRegisterOracle.ts +53 -0
  75. package/src/hooks/useResolveName.test.ts +12 -0
  76. package/src/hooks/useResolveName.ts +41 -0
  77. package/src/hooks/useRespondToQuery.test.ts +12 -0
  78. package/src/hooks/useRespondToQuery.ts +53 -0
  79. package/src/hooks/useRevokeName.test.ts +12 -0
  80. package/src/hooks/useRevokeName.ts +53 -0
  81. package/src/hooks/useSendTransaction.test.ts +12 -0
  82. package/src/hooks/useSendTransaction.ts +54 -0
  83. package/src/hooks/useSignMessage.test.ts +12 -0
  84. package/src/hooks/useSignMessage.ts +54 -0
  85. package/src/hooks/useSignTransaction.test.ts +12 -0
  86. package/src/hooks/useSignTransaction.ts +54 -0
  87. package/src/hooks/useSignTypedData.test.ts +12 -0
  88. package/src/hooks/useSignTypedData.ts +54 -0
  89. package/src/hooks/useSimulateContract.test.ts +12 -0
  90. package/src/hooks/useSimulateContract.ts +43 -0
  91. package/src/hooks/useSpend.test.ts +12 -0
  92. package/src/hooks/useSpend.ts +53 -0
  93. package/src/hooks/useSwitchNetwork.test.ts +12 -0
  94. package/src/hooks/useSwitchNetwork.ts +57 -0
  95. package/src/hooks/useTransaction.test.ts +12 -0
  96. package/src/hooks/useTransaction.ts +41 -0
  97. package/src/hooks/useTransactionCount.test.ts +12 -0
  98. package/src/hooks/useTransactionCount.ts +41 -0
  99. package/src/hooks/useTransferName.test.ts +12 -0
  100. package/src/hooks/useTransferName.ts +53 -0
  101. package/src/hooks/useUpdateName.test.ts +12 -0
  102. package/src/hooks/useUpdateName.ts +53 -0
  103. package/src/hooks/useVerifyMessage.test.ts +12 -0
  104. package/src/hooks/useVerifyMessage.ts +39 -0
  105. package/src/hooks/useVerifyTypedData.test.ts +12 -0
  106. package/src/hooks/useVerifyTypedData.ts +39 -0
  107. package/src/hooks/useWaitForTransaction.test.ts +12 -0
  108. package/src/hooks/useWaitForTransaction.ts +41 -0
  109. package/src/hooks/useWatchConnection.test.ts +12 -0
  110. package/src/hooks/useWatchConnection.ts +34 -0
  111. package/src/hooks/useWatchConnectors.test.ts +12 -0
  112. package/src/hooks/useWatchConnectors.ts +34 -0
  113. package/src/hooks/useWatchHeight.test.ts +12 -0
  114. package/src/hooks/useWatchHeight.ts +45 -0
  115. package/src/hydrate.ts +34 -0
  116. package/src/types/properties.ts +9 -0
  117. package/src/utils/query.ts +80 -0
  118. package/tsconfig.build.json +13 -0
  119. package/tsconfig.json +7 -0
@@ -0,0 +1,12 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { useBlock } from './useBlock.js'
3
+
4
+ describe('useBlock', () => {
5
+ it('should be a function', () => {
6
+ expect(typeof useBlock).toBe('function')
7
+ })
8
+
9
+ it('should be exported', () => {
10
+ expect(useBlock).toBeDefined()
11
+ })
12
+ })
@@ -0,0 +1,42 @@
1
+ 'use client'
2
+
3
+ import {
4
+ type GetBlockParameters,
5
+ type GetBlockReturnType,
6
+ type GetBlockErrorType,
7
+ getBlock,
8
+ } from '@growae/reactive'
9
+ import type { Compute } from '@growae/reactive'
10
+ import { type UseQueryReturnType, useQuery } from '../utils/query.js'
11
+ import type { ConfigParameter } from '../types/properties.js'
12
+ import { useConfig } from './useConfig.js'
13
+ import { useNetworkId } from './useNetworkId.js'
14
+
15
+ export type UseBlockParameters = Compute<
16
+ GetBlockParameters & ConfigParameter & { enabled?: boolean }
17
+ >
18
+
19
+ export type UseBlockReturnType = UseQueryReturnType<
20
+ GetBlockReturnType,
21
+ GetBlockErrorType
22
+ >
23
+
24
+ export function useBlock(
25
+ parameters: UseBlockParameters = {},
26
+ ): UseBlockReturnType {
27
+ const config = useConfig(parameters)
28
+ const networkId = useNetworkId({ config })
29
+
30
+ return useQuery({
31
+ queryKey: ['block', {
32
+ height: parameters.height,
33
+ hash: parameters.hash,
34
+ networkId: parameters.networkId ?? networkId,
35
+ }],
36
+ queryFn: () => getBlock(config, {
37
+ ...parameters,
38
+ networkId: parameters.networkId ?? networkId,
39
+ }),
40
+ enabled: parameters.enabled ?? true,
41
+ }) as UseBlockReturnType
42
+ }
@@ -0,0 +1,12 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { useCallContract } from './useCallContract.js'
3
+
4
+ describe('useCallContract', () => {
5
+ it('should be a function', () => {
6
+ expect(typeof useCallContract).toBe('function')
7
+ })
8
+
9
+ it('should be exported', () => {
10
+ expect(useCallContract).toBeDefined()
11
+ })
12
+ })
@@ -0,0 +1,54 @@
1
+ 'use client'
2
+
3
+ import { useMutation } from '@tanstack/react-query'
4
+ import {
5
+ type CallContractParameters,
6
+ type CallContractReturnType,
7
+ type CallContractErrorType,
8
+ callContract,
9
+ } from '@growae/reactive'
10
+ import type { Compute } from '@growae/reactive'
11
+ import type { ConfigParameter } from '../types/properties.js'
12
+ import type { UseMutationReturnType } from '../utils/query.js'
13
+ import { useConfig } from './useConfig.js'
14
+
15
+ export type UseCallContractParameters<context = unknown> = Compute<
16
+ ConfigParameter & {
17
+ mutation?: {
18
+ onSuccess?: (data: CallContractReturnType, variables: CallContractParameters, context: context) => void
19
+ onError?: (error: CallContractErrorType, variables: CallContractParameters, context: context) => void
20
+ }
21
+ }
22
+ >
23
+
24
+ export type UseCallContractReturnType<context = unknown> = Compute<
25
+ UseMutationReturnType<
26
+ CallContractReturnType,
27
+ CallContractErrorType,
28
+ CallContractParameters,
29
+ context
30
+ > & {
31
+ callContract: (variables: CallContractParameters) => void
32
+ callContractAsync: (variables: CallContractParameters) => Promise<CallContractReturnType>
33
+ }
34
+ >
35
+
36
+ export function useCallContract<context = unknown>(
37
+ parameters: UseCallContractParameters<context> = {},
38
+ ): UseCallContractReturnType<context> {
39
+ const config = useConfig(parameters)
40
+
41
+ const mutation = useMutation({
42
+ mutationKey: ['callContract'],
43
+ mutationFn: (variables: CallContractParameters) =>
44
+ callContract(config, variables),
45
+ ...parameters.mutation,
46
+ })
47
+
48
+ type Return = UseCallContractReturnType<context>
49
+ return {
50
+ ...(mutation as unknown as Return),
51
+ callContract: mutation.mutate as Return['callContract'],
52
+ callContractAsync: mutation.mutateAsync as Return['callContractAsync'],
53
+ }
54
+ }
@@ -0,0 +1,12 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { useChannelDeposit } from './useChannelDeposit.js'
3
+
4
+ describe('useChannelDeposit', () => {
5
+ it('should be a function', () => {
6
+ expect(typeof useChannelDeposit).toBe('function')
7
+ })
8
+
9
+ it('should be exported', () => {
10
+ expect(useChannelDeposit).toBeDefined()
11
+ })
12
+ })
@@ -0,0 +1,53 @@
1
+ 'use client'
2
+
3
+ import { useMutation } from '@tanstack/react-query'
4
+ import {
5
+ type ChannelDepositParameters,
6
+ type ChannelDepositReturnType,
7
+ channelDeposit,
8
+ } from '@growae/reactive'
9
+ import type { Compute } from '@growae/reactive'
10
+ import type { ConfigParameter } from '../types/properties.js'
11
+ import type { UseMutationReturnType } from '../utils/query.js'
12
+ import { useConfig } from './useConfig.js'
13
+
14
+ export type UseChannelDepositParameters<context = unknown> = Compute<
15
+ ConfigParameter & {
16
+ mutation?: {
17
+ onSuccess?: (data: ChannelDepositReturnType, variables: ChannelDepositParameters, context: context) => void
18
+ onError?: (error: Error, variables: ChannelDepositParameters, context: context) => void
19
+ }
20
+ }
21
+ >
22
+
23
+ export type UseChannelDepositReturnType<context = unknown> = Compute<
24
+ UseMutationReturnType<
25
+ ChannelDepositReturnType,
26
+ Error,
27
+ ChannelDepositParameters,
28
+ context
29
+ > & {
30
+ channelDeposit: (variables: ChannelDepositParameters) => void
31
+ channelDepositAsync: (variables: ChannelDepositParameters) => Promise<ChannelDepositReturnType>
32
+ }
33
+ >
34
+
35
+ export function useChannelDeposit<context = unknown>(
36
+ parameters: UseChannelDepositParameters<context> = {},
37
+ ): UseChannelDepositReturnType<context> {
38
+ const config = useConfig(parameters)
39
+
40
+ const mutation = useMutation({
41
+ mutationKey: ['channelDeposit'],
42
+ mutationFn: (variables: ChannelDepositParameters) =>
43
+ channelDeposit(config, variables),
44
+ ...parameters.mutation,
45
+ })
46
+
47
+ type Return = UseChannelDepositReturnType<context>
48
+ return {
49
+ ...(mutation as unknown as Return),
50
+ channelDeposit: mutation.mutate as Return['channelDeposit'],
51
+ channelDepositAsync: mutation.mutateAsync as Return['channelDepositAsync'],
52
+ }
53
+ }
@@ -0,0 +1,12 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { useClaimName } from './useClaimName.js'
3
+
4
+ describe('useClaimName', () => {
5
+ it('should be a function', () => {
6
+ expect(typeof useClaimName).toBe('function')
7
+ })
8
+
9
+ it('should be exported', () => {
10
+ expect(useClaimName).toBeDefined()
11
+ })
12
+ })
@@ -0,0 +1,53 @@
1
+ 'use client'
2
+
3
+ import { useMutation } from '@tanstack/react-query'
4
+ import {
5
+ type ClaimNameParameters,
6
+ type ClaimNameReturnType,
7
+ claimName,
8
+ } from '@growae/reactive'
9
+ import type { Compute } from '@growae/reactive'
10
+ import type { ConfigParameter } from '../types/properties.js'
11
+ import type { UseMutationReturnType } from '../utils/query.js'
12
+ import { useConfig } from './useConfig.js'
13
+
14
+ export type UseClaimNameParameters<context = unknown> = Compute<
15
+ ConfigParameter & {
16
+ mutation?: {
17
+ onSuccess?: (data: ClaimNameReturnType, variables: ClaimNameParameters, context: context) => void
18
+ onError?: (error: Error, variables: ClaimNameParameters, context: context) => void
19
+ }
20
+ }
21
+ >
22
+
23
+ export type UseClaimNameReturnType<context = unknown> = Compute<
24
+ UseMutationReturnType<
25
+ ClaimNameReturnType,
26
+ Error,
27
+ ClaimNameParameters,
28
+ context
29
+ > & {
30
+ claimName: (variables: ClaimNameParameters) => void
31
+ claimNameAsync: (variables: ClaimNameParameters) => Promise<ClaimNameReturnType>
32
+ }
33
+ >
34
+
35
+ export function useClaimName<context = unknown>(
36
+ parameters: UseClaimNameParameters<context> = {},
37
+ ): UseClaimNameReturnType<context> {
38
+ const config = useConfig(parameters)
39
+
40
+ const mutation = useMutation({
41
+ mutationKey: ['claimName'],
42
+ mutationFn: (variables: ClaimNameParameters) =>
43
+ claimName(config, variables),
44
+ ...parameters.mutation,
45
+ })
46
+
47
+ type Return = UseClaimNameReturnType<context>
48
+ return {
49
+ ...(mutation as unknown as Return),
50
+ claimName: mutation.mutate as Return['claimName'],
51
+ claimNameAsync: mutation.mutateAsync as Return['claimNameAsync'],
52
+ }
53
+ }
@@ -0,0 +1,12 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { useCloseChannel } from './useCloseChannel.js'
3
+
4
+ describe('useCloseChannel', () => {
5
+ it('should be a function', () => {
6
+ expect(typeof useCloseChannel).toBe('function')
7
+ })
8
+
9
+ it('should be exported', () => {
10
+ expect(useCloseChannel).toBeDefined()
11
+ })
12
+ })
@@ -0,0 +1,53 @@
1
+ 'use client'
2
+
3
+ import { useMutation } from '@tanstack/react-query'
4
+ import {
5
+ type CloseChannelParameters,
6
+ type CloseChannelReturnType,
7
+ closeChannel,
8
+ } from '@growae/reactive'
9
+ import type { Compute } from '@growae/reactive'
10
+ import type { ConfigParameter } from '../types/properties.js'
11
+ import type { UseMutationReturnType } from '../utils/query.js'
12
+ import { useConfig } from './useConfig.js'
13
+
14
+ export type UseCloseChannelParameters<context = unknown> = Compute<
15
+ ConfigParameter & {
16
+ mutation?: {
17
+ onSuccess?: (data: CloseChannelReturnType, variables: CloseChannelParameters, context: context) => void
18
+ onError?: (error: Error, variables: CloseChannelParameters, context: context) => void
19
+ }
20
+ }
21
+ >
22
+
23
+ export type UseCloseChannelReturnType<context = unknown> = Compute<
24
+ UseMutationReturnType<
25
+ CloseChannelReturnType,
26
+ Error,
27
+ CloseChannelParameters,
28
+ context
29
+ > & {
30
+ closeChannel: (variables: CloseChannelParameters) => void
31
+ closeChannelAsync: (variables: CloseChannelParameters) => Promise<CloseChannelReturnType>
32
+ }
33
+ >
34
+
35
+ export function useCloseChannel<context = unknown>(
36
+ parameters: UseCloseChannelParameters<context> = {},
37
+ ): UseCloseChannelReturnType<context> {
38
+ const config = useConfig(parameters)
39
+
40
+ const mutation = useMutation({
41
+ mutationKey: ['closeChannel'],
42
+ mutationFn: (variables: CloseChannelParameters) =>
43
+ closeChannel(config, variables),
44
+ ...parameters.mutation,
45
+ })
46
+
47
+ type Return = UseCloseChannelReturnType<context>
48
+ return {
49
+ ...(mutation as unknown as Return),
50
+ closeChannel: mutation.mutate as Return['closeChannel'],
51
+ closeChannelAsync: mutation.mutateAsync as Return['closeChannelAsync'],
52
+ }
53
+ }
@@ -0,0 +1,53 @@
1
+ // @vitest-environment jsdom
2
+ import { describe, it, expect, vi } from 'vitest'
3
+
4
+ vi.mock('@aeternity/aepp-sdk', () => ({
5
+ Node: vi.fn().mockImplementation(() => ({})),
6
+ }))
7
+
8
+ import { createElement } from 'react'
9
+ import { renderHook } from '@testing-library/react'
10
+ import { useConfig } from './useConfig.js'
11
+ import { ReactiveProvider } from '../context.js'
12
+ import { createConfig } from '@growae/reactive'
13
+ import { testnet } from '@growae/reactive'
14
+ import { mock } from '@growae/reactive'
15
+
16
+ const TEST_ACCOUNTS = [
17
+ 'ak_2swhLkgBPeeADxVTABy7tt6d2HgBQFnGJELkBUMY4FUa8RVLM',
18
+ ] as const
19
+
20
+ function createTestConfig() {
21
+ return createConfig({
22
+ networks: [testnet],
23
+ connectors: [mock({ accounts: [...TEST_ACCOUNTS] })],
24
+ storage: null,
25
+ })
26
+ }
27
+
28
+ describe('useConfig', () => {
29
+ it('should return config when wrapped in ReactiveProvider', () => {
30
+ const config = createTestConfig()
31
+ const { result } = renderHook(() => useConfig(), {
32
+ wrapper: ({ children }) =>
33
+ createElement(
34
+ ReactiveProvider,
35
+ { config, reconnectOnMount: false },
36
+ children,
37
+ ),
38
+ })
39
+ expect(result.current).toBe(config)
40
+ })
41
+
42
+ it('should throw without ReactiveProvider', () => {
43
+ const spy = vi.spyOn(console, 'error').mockImplementation(() => {})
44
+ expect(() => renderHook(() => useConfig())).toThrow()
45
+ spy.mockRestore()
46
+ })
47
+
48
+ it('should accept config via parameter', () => {
49
+ const config = createTestConfig()
50
+ const { result } = renderHook(() => useConfig({ config }))
51
+ expect(result.current).toBe(config)
52
+ })
53
+ })
@@ -0,0 +1,20 @@
1
+ 'use client'
2
+
3
+ import type { Config } from '@growae/reactive'
4
+ import { useContext } from 'react'
5
+ import { ReactiveContext } from '../context.js'
6
+ import { ReactiveProviderNotFoundError } from '../errors/context.js'
7
+ import type { ConfigParameter } from '../types/properties.js'
8
+
9
+ export type UseConfigParameters<config extends Config = Config> =
10
+ ConfigParameter<config>
11
+
12
+ export type UseConfigReturnType<config extends Config = Config> = config
13
+
14
+ export function useConfig<config extends Config = Config>(
15
+ parameters: UseConfigParameters<config> = {},
16
+ ): UseConfigReturnType<config> {
17
+ const config = parameters.config ?? useContext(ReactiveContext)
18
+ if (!config) throw new ReactiveProviderNotFoundError()
19
+ return config as UseConfigReturnType<config>
20
+ }
@@ -0,0 +1,67 @@
1
+ // @vitest-environment jsdom
2
+ import { describe, it, expect, vi } from 'vitest'
3
+
4
+ vi.mock('@aeternity/aepp-sdk', () => ({
5
+ Node: vi.fn().mockImplementation(() => ({})),
6
+ }))
7
+
8
+ import { createElement } from 'react'
9
+ import { renderHook } from '@testing-library/react'
10
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
11
+ import { useConnect } from './useConnect.js'
12
+ import { ReactiveProvider } from '../context.js'
13
+ import { createConfig } from '@growae/reactive'
14
+ import { testnet } from '@growae/reactive'
15
+ import { mock } from '@growae/reactive'
16
+
17
+ const TEST_ACCOUNTS = [
18
+ 'ak_2swhLkgBPeeADxVTABy7tt6d2HgBQFnGJELkBUMY4FUa8RVLM',
19
+ ] as const
20
+
21
+ function createWrapper() {
22
+ const config = createConfig({
23
+ networks: [testnet],
24
+ connectors: [mock({ accounts: [...TEST_ACCOUNTS] })],
25
+ storage: null,
26
+ })
27
+ const queryClient = new QueryClient({
28
+ defaultOptions: { queries: { retry: false } },
29
+ })
30
+ return {
31
+ config,
32
+ wrapper: ({ children }: { children: React.ReactNode }) =>
33
+ createElement(
34
+ QueryClientProvider,
35
+ { client: queryClient },
36
+ createElement(
37
+ ReactiveProvider,
38
+ { config, reconnectOnMount: false },
39
+ children,
40
+ ),
41
+ ),
42
+ }
43
+ }
44
+
45
+ describe('useConnect', () => {
46
+ it('should return connect function', () => {
47
+ const { wrapper } = createWrapper()
48
+ const { result } = renderHook(() => useConnect(), { wrapper })
49
+ expect(typeof result.current.connect).toBe('function')
50
+ expect(typeof result.current.connectAsync).toBe('function')
51
+ })
52
+
53
+ it('should return connectors', () => {
54
+ const { wrapper } = createWrapper()
55
+ const { result } = renderHook(() => useConnect(), { wrapper })
56
+ expect(result.current.connectors).toBeDefined()
57
+ expect(result.current.connectors).toHaveLength(1)
58
+ })
59
+
60
+ it('should have idle status initially', () => {
61
+ const { wrapper } = createWrapper()
62
+ const { result } = renderHook(() => useConnect(), { wrapper })
63
+ expect(result.current.isPending).toBe(false)
64
+ expect(result.current.isSuccess).toBe(false)
65
+ expect(result.current.isError).toBe(false)
66
+ })
67
+ })
@@ -0,0 +1,69 @@
1
+ 'use client'
2
+
3
+ import { useMutation } from '@tanstack/react-query'
4
+ import {
5
+ type Config,
6
+ type ConnectParameters,
7
+ type ConnectReturnType,
8
+ type ConnectErrorType,
9
+ connect,
10
+ } from '@growae/reactive'
11
+ import type { Compute } from '@growae/reactive'
12
+ import { useEffect } from 'react'
13
+ import type { ConfigParameter } from '../types/properties.js'
14
+ import type { UseMutationReturnType } from '../utils/query.js'
15
+ import { useConfig } from './useConfig.js'
16
+ import { useConnectors } from './useConnectors.js'
17
+
18
+ export type UseConnectParameters<context = unknown> = Compute<
19
+ ConfigParameter & {
20
+ mutation?: {
21
+ onSuccess?: (data: ConnectReturnType, variables: ConnectParameters, context: context) => void
22
+ onError?: (error: ConnectErrorType, variables: ConnectParameters, context: context) => void
23
+ onSettled?: (data: ConnectReturnType | undefined, error: ConnectErrorType | null, variables: ConnectParameters, context: context) => void
24
+ }
25
+ }
26
+ >
27
+
28
+ export type UseConnectReturnType<context = unknown> = Compute<
29
+ UseMutationReturnType<
30
+ ConnectReturnType,
31
+ ConnectErrorType,
32
+ ConnectParameters,
33
+ context
34
+ > & {
35
+ connect: (variables: ConnectParameters) => void
36
+ connectAsync: (variables: ConnectParameters) => Promise<ConnectReturnType>
37
+ connectors: ReturnType<typeof useConnectors>
38
+ }
39
+ >
40
+
41
+ export function useConnect<context = unknown>(
42
+ parameters: UseConnectParameters<context> = {},
43
+ ): UseConnectReturnType<context> {
44
+ const config = useConfig(parameters)
45
+
46
+ const mutation = useMutation({
47
+ mutationKey: ['connect'],
48
+ mutationFn: (variables: ConnectParameters) => connect(config, variables),
49
+ ...parameters.mutation,
50
+ })
51
+
52
+ useEffect(() => {
53
+ return config.subscribe(
54
+ ({ status }) => status,
55
+ (status, previousStatus) => {
56
+ if (previousStatus === 'connected' && status === 'disconnected')
57
+ mutation.reset()
58
+ },
59
+ )
60
+ }, [config, mutation.reset])
61
+
62
+ type Return = UseConnectReturnType<context>
63
+ return {
64
+ ...(mutation as unknown as Return),
65
+ connect: mutation.mutate as Return['connect'],
66
+ connectAsync: mutation.mutateAsync as Return['connectAsync'],
67
+ connectors: useConnectors({ config }),
68
+ }
69
+ }
@@ -0,0 +1,12 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { useConnection } from './useConnection.js'
3
+
4
+ describe('useConnection', () => {
5
+ it('should be a function', () => {
6
+ expect(typeof useConnection).toBe('function')
7
+ })
8
+
9
+ it('should be exported', () => {
10
+ expect(useConnection).toBeDefined()
11
+ })
12
+ })
@@ -0,0 +1,26 @@
1
+ 'use client'
2
+
3
+ import {
4
+ type GetConnectionReturnType,
5
+ getConnection,
6
+ watchConnection,
7
+ } from '@growae/reactive'
8
+ import { useSyncExternalStore } from 'react'
9
+ import type { ConfigParameter } from '../types/properties.js'
10
+ import { useConfig } from './useConfig.js'
11
+
12
+ export type UseConnectionParameters = ConfigParameter
13
+
14
+ export type UseConnectionReturnType = GetConnectionReturnType
15
+
16
+ export function useConnection(
17
+ parameters: UseConnectionParameters = {},
18
+ ): UseConnectionReturnType {
19
+ const config = useConfig(parameters)
20
+
21
+ return useSyncExternalStore(
22
+ (onChange) => watchConnection(config, { onChange }),
23
+ () => getConnection(config),
24
+ () => getConnection(config),
25
+ )
26
+ }
@@ -0,0 +1,12 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { useConnections } from './useConnections.js'
3
+
4
+ describe('useConnections', () => {
5
+ it('should be a function', () => {
6
+ expect(typeof useConnections).toBe('function')
7
+ })
8
+
9
+ it('should be exported', () => {
10
+ expect(useConnections).toBeDefined()
11
+ })
12
+ })
@@ -0,0 +1,26 @@
1
+ 'use client'
2
+
3
+ import {
4
+ type GetConnectionsReturnType,
5
+ getConnections,
6
+ watchConnections,
7
+ } from '@growae/reactive'
8
+ import { useSyncExternalStore } from 'react'
9
+ import type { ConfigParameter } from '../types/properties.js'
10
+ import { useConfig } from './useConfig.js'
11
+
12
+ export type UseConnectionsParameters = ConfigParameter
13
+
14
+ export type UseConnectionsReturnType = GetConnectionsReturnType
15
+
16
+ export function useConnections(
17
+ parameters: UseConnectionsParameters = {},
18
+ ): UseConnectionsReturnType {
19
+ const config = useConfig(parameters)
20
+
21
+ return useSyncExternalStore(
22
+ (onChange) => watchConnections(config, { onChange }),
23
+ () => getConnections(config),
24
+ () => getConnections(config),
25
+ )
26
+ }
@@ -0,0 +1,12 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { useConnectorClient } from './useConnectorClient.js'
3
+
4
+ describe('useConnectorClient', () => {
5
+ it('should be a function', () => {
6
+ expect(typeof useConnectorClient).toBe('function')
7
+ })
8
+
9
+ it('should be exported', () => {
10
+ expect(useConnectorClient).toBeDefined()
11
+ })
12
+ })
@@ -0,0 +1,44 @@
1
+ 'use client'
2
+
3
+ import {
4
+ type GetConnectorClientParameters,
5
+ type GetConnectorClientReturnType,
6
+ getConnectorClient,
7
+ } from '@growae/reactive'
8
+ import type { Compute } from '@growae/reactive'
9
+ import { useQuery } from '../utils/query.js'
10
+ import type { UseQueryReturnType } from '../utils/query.js'
11
+ import type { ConfigParameter } from '../types/properties.js'
12
+ import { useConfig } from './useConfig.js'
13
+ import { useConnection } from './useConnection.js'
14
+ import { useNetworkId } from './useNetworkId.js'
15
+
16
+ export type UseConnectorClientParameters = Compute<
17
+ GetConnectorClientParameters & ConfigParameter
18
+ >
19
+
20
+ export type UseConnectorClientReturnType = UseQueryReturnType<
21
+ GetConnectorClientReturnType,
22
+ Error
23
+ >
24
+
25
+ export function useConnectorClient(
26
+ parameters: UseConnectorClientParameters = {},
27
+ ): UseConnectorClientReturnType {
28
+ const config = useConfig(parameters)
29
+ const networkId = useNetworkId({ config })
30
+ const connection = useConnection({ config })
31
+
32
+ return useQuery({
33
+ queryKey: ['connectorClient', {
34
+ networkId: parameters.networkId ?? networkId,
35
+ connector: connection?.connector?.uid,
36
+ }],
37
+ queryFn: () => getConnectorClient(config, {
38
+ ...parameters,
39
+ networkId: parameters.networkId ?? networkId,
40
+ connector: parameters.connector ?? connection?.connector,
41
+ }),
42
+ enabled: !!connection?.connector,
43
+ }) as UseConnectorClientReturnType
44
+ }