Skip to content

Commit 9a46174

Browse files
authored
[fix] - MetaMask Connect Flow (#1293)
* Handle case where MM connection in progress * Increment version * Update copy * Add return statement
1 parent 2d33f78 commit 9a46174

File tree

3 files changed

+84
-12
lines changed

3 files changed

+84
-12
lines changed

packages/core/src/i18n/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
},
2626
"mainText": "Connecting...",
2727
"paragraph": "Make sure to select all accounts that you want to grant access to.",
28+
"previousConnection": "{wallet} already has a pending connection request, please open the {wallet} app to login and connect.",
2829
"rejectedText": "Connection Rejected!",
2930
"rejectedCTA": "Click here to try again",
3031
"primaryButton": "Back to wallets"

packages/core/src/views/connect/ConnectingWallet.svelte

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
export let deselectWallet: (label: string) => void
1313
export let setStep: (update: keyof i18n['connect']) => void
1414
export let connectionRejected: boolean
15+
export let previousConnectionRequest: boolean
1516
1617
const { appMetadata } = configuration
1718
</script>
@@ -69,23 +70,27 @@
6970
<div class="container flex flex-column items-center">
7071
<div
7172
class="connecting-container flex justify-between items-center"
72-
class:warning={connectionRejected}
73+
class:warning={connectionRejected || previousConnectionRequest}
7374
>
7475
<div class="flex">
7576
<div class="flex justify-center relative">
7677
<WalletAppBadge
7778
size={40}
7879
padding={8}
7980
icon={(appMetadata && appMetadata.icon) || questionIcon}
80-
border={connectionRejected ? 'yellow' : 'blue'}
81+
border={connectionRejected || previousConnectionRequest
82+
? 'yellow'
83+
: 'blue'}
8184
background="lightGray"
8285
/>
8386

8487
<div class="relative" style="right: 0.5rem;">
8588
<WalletAppBadge
8689
size={40}
8790
padding={8}
88-
border={connectionRejected ? 'yellow' : 'blue'}
91+
border={connectionRejected || previousConnectionRequest
92+
? 'yellow'
93+
: 'blue'}
8994
background="white"
9095
icon={selectedWallet.icon}
9196
/>
@@ -95,9 +100,9 @@
95100
<div class="flex flex-column justify-center ml">
96101
<div class="text" class:text-rejected={connectionRejected}>
97102
{$_(
98-
connectionRejected
99-
? 'connect.connectingWallet.rejectedText'
100-
: 'connect.connectingWallet.mainText',
103+
`connect.connectingWallet.${
104+
connectionRejected ? 'rejectedText' : 'mainText'
105+
}`,
101106
{
102107
default: connectionRejected
103108
? en.connect.connectingWallet.rejectedText
@@ -113,9 +118,15 @@
113118
</div>
114119
{:else}
115120
<div class="subtext">
116-
{$_('connect.connectingWallet.paragraph', {
117-
default: en.connect.connectingWallet.paragraph
118-
})}
121+
{$_(
122+
`connect.connectingWallet.${
123+
previousConnectionRequest ? 'previousConnection' : 'paragraph'
124+
}`,
125+
{
126+
default: en.connect.connectingWallet.paragraph,
127+
values: { wallet: selectedWallet.label }
128+
}
129+
)}
119130
</div>
120131
{/if}
121132
</div>

packages/core/src/views/connect/Index.svelte

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
<script lang="ts">
22
import { ProviderRpcErrorCode, WalletModule } from '@web3-onboard/common'
3-
import { BehaviorSubject, takeUntil } from 'rxjs'
43
import EventEmitter from 'eventemitter3'
54
import { _ } from 'svelte-i18n'
65
import en from '../../i18n/en.json'
7-
import { selectAccounts } from '../../provider.js'
6+
import { listenAccountsChanged, selectAccounts } from '../../provider.js'
87
import { state } from '../../store/index.js'
98
import { connectWallet$, onDestroy$ } from '../../streams.js'
109
import { addWallet, updateAccount } from '../../store/actions.js'
@@ -20,6 +19,18 @@
2019
import { configuration } from '../../configuration.js'
2120
import { getBlocknativeSdk } from '../../services.js'
2221
import { BigNumber } from 'ethers'
22+
23+
import {
24+
BehaviorSubject,
25+
distinctUntilChanged,
26+
filter,
27+
firstValueFrom,
28+
mapTo,
29+
Subject,
30+
take,
31+
takeUntil
32+
} from 'rxjs'
33+
2334
import {
2435
getChainId,
2536
requestAccounts,
@@ -39,8 +50,10 @@
3950
4051
const { appMetadata } = configuration
4152
const { walletModules, connect } = state.get()
53+
const cancelPreviousConnect$ = new Subject<void>()
4254
4355
let connectionRejected = false
56+
let previousConnectionRequest = false
4457
let wallets: WalletWithLoadingIcon[] = []
4558
let selectedWallet: WalletState | null
4659
let agreed: boolean
@@ -54,6 +67,25 @@
5467
'selectingWallet'
5568
)
5669
70+
// handle the edge case where disableModals was set to true on first call
71+
// and then set to false on second call and there is still a pending call
72+
connectWallet$
73+
.pipe(
74+
distinctUntilChanged(
75+
(prev, curr) =>
76+
prev.autoSelect &&
77+
curr.autoSelect &&
78+
prev.autoSelect.disableModals === curr.autoSelect.disableModals
79+
),
80+
filter(
81+
({ autoSelect }) => autoSelect && autoSelect.disableModals === false
82+
),
83+
takeUntil(onDestroy$)
84+
)
85+
.subscribe(() => {
86+
selectedWallet && connectWallet()
87+
})
88+
5789
// ==== SELECT WALLET ==== //
5890
async function selectWallet({
5991
label,
@@ -161,8 +193,15 @@
161193
162194
const { provider, label } = selectedWallet
163195
196+
cancelPreviousConnect$.next()
197+
164198
try {
165-
const [address] = await requestAccounts(provider)
199+
const [address] = await Promise.race([
200+
// resolved account
201+
requestAccounts(provider),
202+
// or connect wallet is called again whilst waiting for response
203+
firstValueFrom(cancelPreviousConnect$.pipe(mapTo([])))
204+
])
166205
167206
// canceled previous request
168207
if (!address) {
@@ -216,6 +255,25 @@
216255
217256
// account access has already been requested and is awaiting approval
218257
if (code === ProviderRpcErrorCode.ACCOUNT_ACCESS_ALREADY_REQUESTED) {
258+
previousConnectionRequest = true
259+
260+
if (autoSelect.disableModals) {
261+
connectWallet$.next({ inProgress: false })
262+
return
263+
}
264+
265+
listenAccountsChanged({
266+
provider: selectedWallet.provider,
267+
disconnected$: connectWallet$.pipe(
268+
filter(({ inProgress }) => !inProgress),
269+
mapTo('')
270+
)
271+
})
272+
.pipe(take(1))
273+
.subscribe(([account]) => {
274+
account && connectWallet()
275+
})
276+
219277
return
220278
}
221279
}
@@ -286,6 +344,7 @@
286344
})
287345
288346
function setStep(update: keyof i18n['connect']) {
347+
cancelPreviousConnect$.next()
289348
modalStep$.next(update)
290349
}
291350
@@ -408,6 +467,7 @@
408467
<ConnectingWallet
409468
{connectWallet}
410469
{connectionRejected}
470+
{previousConnectionRequest}
411471
{setStep}
412472
{deselectWallet}
413473
{selectedWallet}

0 commit comments

Comments
 (0)