@@ -59,16 +59,32 @@ export type UseIframeOptions = {
59
59
origins ?: string [ ] ;
60
60
} ;
61
61
62
+ export type UseIframeReturn = {
63
+ /**
64
+ * The main wallet, or undefined if the wallet is not connected.
65
+ */
66
+ wallet : MainWalletBase | undefined ;
67
+ /**
68
+ * A ref callback to set the iframe element.
69
+ */
70
+ iframeRef : RefCallback < HTMLIFrameElement | null > ;
71
+ /**
72
+ * The iframe element.
73
+ */
74
+ iframe : HTMLIFrameElement | null ;
75
+ /**
76
+ * A function to trigger a keystore change event on the iframe app wallet.
77
+ */
78
+ triggerKeystoreChange : ( ) => void ;
79
+ } ;
80
+
62
81
export const useIframe = ( {
63
82
walletName,
64
83
metadata,
65
84
walletClientOverrides,
66
85
signerOverrides,
67
86
origins,
68
- } : UseIframeOptions = { } ) : {
69
- wallet : MainWalletBase ;
70
- iframeRef : RefCallback < HTMLIFrameElement | null > ;
71
- } => {
87
+ } : UseIframeOptions = { } ) : UseIframeReturn => {
72
88
const wallet = useWallet ( walletName ) . mainWallet ;
73
89
const [ iframe , setIframe ] = useState < HTMLIFrameElement | null > ( null ) ;
74
90
@@ -79,54 +95,51 @@ export const useIframe = ({
79
95
const signerOverridesRef = useRef ( signerOverrides ) ;
80
96
signerOverridesRef . current = signerOverrides ;
81
97
82
- // Broadcast keystore change event to iframe wallet.
83
- useEffect ( ( ) => {
84
- const notifyIframe = ( ) => {
98
+ const triggerKeystoreChange = useCallback (
99
+ ( ) =>
85
100
iframe ?. contentWindow . postMessage (
86
101
{
87
102
event : COSMIFRAME_KEYSTORECHANGE_EVENT ,
88
103
} ,
89
104
'*'
90
- ) ;
91
- } ;
105
+ ) ,
106
+ [ iframe ]
107
+ ) ;
92
108
109
+ // Broadcast keystore change event to iframe wallet.
110
+ useEffect ( ( ) => {
93
111
// Notify inner window of keystore change on any wallet client change
94
112
// (likely either connection or disconnection).
95
- notifyIframe ( ) ;
113
+ triggerKeystoreChange ( ) ;
96
114
97
115
if ( ! wallet || typeof window === 'undefined' ) {
98
116
return ;
99
117
}
100
118
101
119
// Notify inner window of keystore change on any wallet connect event.
102
120
wallet . walletInfo . connectEventNamesOnWindow ?. forEach ( ( eventName ) => {
103
- window . addEventListener ( eventName , notifyIframe ) ;
121
+ window . addEventListener ( eventName , triggerKeystoreChange ) ;
104
122
} ) ;
105
123
wallet . walletInfo . connectEventNamesOnClient ?. forEach ( async ( eventName ) => {
106
- wallet . client ?. on ?.( eventName , notifyIframe ) ;
124
+ wallet . client ?. on ?.( eventName , triggerKeystoreChange ) ;
107
125
} ) ;
108
126
109
127
return ( ) => {
110
128
wallet . walletInfo . connectEventNamesOnWindow ?. forEach ( ( eventName ) => {
111
- window . removeEventListener ( eventName , notifyIframe ) ;
129
+ window . removeEventListener ( eventName , triggerKeystoreChange ) ;
112
130
} ) ;
113
131
wallet . walletInfo . connectEventNamesOnClient ?. forEach (
114
132
async ( eventName ) => {
115
- wallet . client ?. off ?.( eventName , notifyIframe ) ;
133
+ wallet . client ?. off ?.( eventName , triggerKeystoreChange ) ;
116
134
}
117
135
) ;
118
136
} ;
119
- } , [ wallet , iframe ] ) ;
137
+ } , [ wallet , triggerKeystoreChange ] ) ;
120
138
121
139
// Whenever wallet changes, broadcast keystore change event to iframe wallet.
122
140
useEffect ( ( ) => {
123
- iframe ?. contentWindow . postMessage (
124
- {
125
- event : COSMIFRAME_KEYSTORECHANGE_EVENT ,
126
- } ,
127
- '*'
128
- ) ;
129
- } , [ wallet , iframe ] ) ;
141
+ triggerKeystoreChange ( ) ;
142
+ } , [ wallet , triggerKeystoreChange ] ) ;
130
143
131
144
useEffect ( ( ) => {
132
145
if ( ! iframe ) {
@@ -189,5 +202,7 @@ export const useIframe = ({
189
202
return {
190
203
wallet,
191
204
iframeRef,
205
+ iframe,
206
+ triggerKeystoreChange,
192
207
} ;
193
208
} ;
0 commit comments