Skip to content

Commit 6851c1b

Browse files
tomiirclaude
andauthored
Fix/set wcerror (#5548)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e14ce03 commit 6851c1b

3 files changed

Lines changed: 88 additions & 19 deletions

File tree

.changeset/quiet-hands-raise.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@reown/appkit-controllers': patch
3+
'@reown/appkit': patch
4+
---
5+
6+
Fixes issue where mobile connections failing would not set wcError

packages/controllers/src/controllers/ConnectionController.ts

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -230,30 +230,37 @@ const controller = {
230230
const isInTelegramOrSafariIos =
231231
CoreHelperUtil.isTelegram() || (CoreHelperUtil.isSafari() && CoreHelperUtil.isIos())
232232

233-
if (cache === 'always' || (cache === 'auto' && isInTelegramOrSafariIos)) {
234-
if (wcConnectionPromise) {
235-
await wcConnectionPromise
236-
wcConnectionPromise = undefined
233+
try {
234+
if (cache === 'always' || (cache === 'auto' && isInTelegramOrSafariIos)) {
235+
if (wcConnectionPromise) {
236+
await wcConnectionPromise
237+
wcConnectionPromise = undefined
237238

238-
return
239-
}
239+
return
240+
}
241+
242+
if (!CoreHelperUtil.isPairingExpired(state?.wcPairingExpiry)) {
243+
const link = state.wcUri
244+
state.wcUri = link
240245

241-
if (!CoreHelperUtil.isPairingExpired(state?.wcPairingExpiry)) {
242-
const link = state.wcUri
243-
state.wcUri = link
246+
return
247+
}
244248

245-
return
249+
wcConnectionPromise = ConnectionController._getClient()?.connectWalletConnect?.()
250+
ConnectionController.state.status = 'connecting'
251+
await wcConnectionPromise
252+
wcConnectionPromise = undefined
253+
state.wcPairingExpiry = undefined
254+
ConnectionController.state.status = 'connected'
255+
} else {
256+
await ConnectionController._getClient()?.connectWalletConnect?.()
246257
}
247-
wcConnectionPromise = ConnectionController._getClient()
248-
?.connectWalletConnect?.()
249-
.catch(() => undefined)
250-
ConnectionController.state.status = 'connecting'
251-
await wcConnectionPromise
258+
} catch (error) {
259+
state.wcError = true
260+
state.wcFetchingUri = false
261+
state.status = 'disconnected'
252262
wcConnectionPromise = undefined
253-
state.wcPairingExpiry = undefined
254-
ConnectionController.state.status = 'connected'
255-
} else {
256-
await ConnectionController._getClient()?.connectWalletConnect?.()
263+
throw error
257264
}
258265
},
259266

packages/controllers/tests/controllers/ConnectionController.test.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,62 @@ describe('ConnectionController', () => {
304304
expect(ConnectionController.state.status).toEqual('connected')
305305
})
306306

307+
it('should set wcError and status to disconnected when connectWalletConnect rejects in cached mode on telegram', async () => {
308+
client.connectWalletConnect = vi.fn().mockRejectedValueOnce(new Error('Connection failed'))
309+
vi.spyOn(CoreHelperUtil, 'isPairingExpired').mockReturnValue(true)
310+
vi.spyOn(CoreHelperUtil, 'isTelegram').mockReturnValue(true)
311+
312+
ConnectionController.state.wcError = false
313+
314+
await expect(ConnectionController.connectWalletConnect()).rejects.toThrow('Connection failed')
315+
316+
expect(ConnectionController.state.wcError).toEqual(true)
317+
expect(ConnectionController.state.wcFetchingUri).toEqual(false)
318+
expect(ConnectionController.state.status).toEqual('disconnected')
319+
})
320+
321+
it('should set wcError and status to disconnected when connectWalletConnect rejects with cache "always"', async () => {
322+
client.connectWalletConnect = vi.fn().mockRejectedValueOnce(new Error('Connection failed'))
323+
vi.spyOn(CoreHelperUtil, 'isPairingExpired').mockReturnValue(true)
324+
325+
ConnectionController.state.wcError = false
326+
327+
await expect(ConnectionController.connectWalletConnect({ cache: 'always' })).rejects.toThrow(
328+
'Connection failed'
329+
)
330+
331+
expect(ConnectionController.state.wcError).toEqual(true)
332+
expect(ConnectionController.state.wcFetchingUri).toEqual(false)
333+
expect(ConnectionController.state.status).toEqual('disconnected')
334+
})
335+
336+
it('should not set wcError when connectWalletConnect succeeds in cached mode', async () => {
337+
client.connectWalletConnect = vi.fn().mockResolvedValueOnce(undefined)
338+
vi.spyOn(CoreHelperUtil, 'isPairingExpired').mockReturnValue(true)
339+
vi.spyOn(CoreHelperUtil, 'isTelegram').mockReturnValue(true)
340+
341+
ConnectionController.state.wcError = false
342+
343+
await ConnectionController.connectWalletConnect()
344+
345+
expect(ConnectionController.state.wcError).toEqual(false)
346+
expect(ConnectionController.state.status).toEqual('connected')
347+
})
348+
349+
it('should set wcError and rethrow when connectWalletConnect rejects in non-cached mode', async () => {
350+
client.connectWalletConnect = vi.fn().mockRejectedValueOnce(new Error('Connection failed'))
351+
352+
ConnectionController.state.wcError = false
353+
354+
await expect(ConnectionController.connectWalletConnect({ cache: 'never' })).rejects.toThrow(
355+
'Connection failed'
356+
)
357+
358+
expect(ConnectionController.state.wcError).toEqual(true)
359+
expect(ConnectionController.state.wcFetchingUri).toEqual(false)
360+
expect(ConnectionController.state.status).toEqual('disconnected')
361+
})
362+
307363
it('should handle connectWalletConnect when cache argument is "never"', async () => {
308364
vi.spyOn(CoreHelperUtil, 'isTelegram').mockReturnValue(true)
309365
vi.spyOn(CoreHelperUtil, 'isSafari').mockReturnValue(true)

0 commit comments

Comments
 (0)