1
- import { watch , toRaw } from 'vue'
1
+ import { watch , toRaw , onMounted } from 'vue'
2
2
import { OnConnectedCB , OnAccountOrChainIdChangedCB , OnWalletUpdatedCB , OnDisconnectedCB } from '../types'
3
3
import { useConnect } from './connect'
4
4
import { assertConnected } from '../utils/assert'
5
5
6
- // TODO: should return unwatch handler
7
-
8
6
export function useListeners ( pinia ?: any ) {
9
7
const { isConnected, address, chainId, wallet } = useConnect ( pinia )
10
8
11
9
function onConnected ( callback : OnConnectedCB ) {
12
- watch ( isConnected , ( val , oldVal ) => {
10
+ return watch ( isConnected , ( val , oldVal ) => {
13
11
if ( val && ! oldVal ) {
14
12
assertConnected ( wallet , 'useListeners - onConnected' )
15
13
callback && callback ( toRaw ( wallet ) )
@@ -18,29 +16,65 @@ export function useListeners(pinia?: any) {
18
16
}
19
17
20
18
function onAccountOrChainIdChanged ( callback : OnAccountOrChainIdChangedCB ) {
21
- // TODO: make sure this works
22
- watch ( address , ( val , oldVal ) => {
19
+ const unwatchAddress = watch ( address , ( val , oldVal ) => {
23
20
if ( oldVal && val ) {
24
21
assertConnected ( wallet , 'useListeners - onAccountOrChainIdChanged - address' )
25
22
callback && callback ( toRaw ( wallet ) )
26
23
}
27
24
} )
28
25
29
- watch ( chainId , ( val , oldVal ) => {
26
+ const unwatchChainId = watch ( chainId , ( val , oldVal ) => {
30
27
if ( val && oldVal ) {
31
28
assertConnected ( wallet , 'useListeners - onAccountOrChainIdChanged - chainId' )
32
29
callback && callback ( toRaw ( wallet ) )
33
30
}
34
31
} )
32
+
33
+ return ( ) => {
34
+ unwatchAddress ( )
35
+ unwatchChainId ( )
36
+ }
35
37
}
36
38
37
39
function onWalletUpdated ( callback : OnWalletUpdatedCB ) {
38
- onConnected ( callback )
39
- onAccountOrChainIdChanged ( callback )
40
+ const unwatchConnected = onConnected ( callback )
41
+ const unwatchAccountOrChainId = onAccountOrChainIdChanged ( callback )
42
+
43
+ return ( ) => {
44
+ unwatchConnected ( )
45
+ unwatchAccountOrChainId ( )
46
+ }
40
47
}
41
48
42
49
function onDisconnected ( callback : OnDisconnectedCB ) {
43
- watch ( isConnected , ( val , oldVal ) => {
50
+ return watch ( isConnected , ( val , oldVal ) => {
51
+ if ( ! val && oldVal ) {
52
+ callback && callback ( )
53
+ }
54
+ } )
55
+ }
56
+
57
+ function watchWalletUpdated ( callback : OnWalletUpdatedCB , options ?: { immediate : boolean } ) {
58
+ if ( options ?. immediate ) {
59
+ onMounted ( ( ) => {
60
+ if ( isConnected . value ) {
61
+ assertConnected ( wallet , 'useListeners - watchWalletUpdated - immediate' )
62
+ callback && callback ( toRaw ( wallet ) )
63
+ }
64
+ } )
65
+ }
66
+
67
+ const unwatchConnected = onConnected ( callback )
68
+ const unwatchAccountOrChainId = onAccountOrChainIdChanged ( callback )
69
+
70
+ return ( ) => {
71
+ unwatchConnected ( )
72
+ unwatchAccountOrChainId ( )
73
+ }
74
+ }
75
+
76
+ function watchDisconnect ( callback : OnDisconnectedCB ) {
77
+ return watch ( isConnected , ( val , oldVal ) => {
44
78
if ( ! val && oldVal ) {
45
79
callback && callback ( )
46
80
}
@@ -50,7 +84,9 @@ export function useListeners(pinia?: any) {
50
84
return {
51
85
onConnected,
52
86
onAccountOrChainIdChanged,
53
- onWalletUpdated,
54
- onDisconnected,
87
+ onWalletUpdated, // will be deprecated
88
+ onDisconnected, // will be deprecated
89
+ watchWalletUpdated,
90
+ watchDisconnect,
55
91
}
56
92
}
0 commit comments