|
1 | 1 | <script lang="ts"> |
2 | 2 | import { ProviderRpcErrorCode, WalletModule } from '@web3-onboard/common' |
3 | 3 | import { BigNumber } from 'ethers' |
| 4 | + import { BehaviorSubject, takeUntil } from 'rxjs' |
4 | 5 | import EventEmitter from 'eventemitter3' |
5 | 6 | import { _ } from 'svelte-i18n' |
6 | 7 | import en from '../../i18n/en.json' |
7 | 8 | import { selectAccounts } from '../../provider' |
8 | 9 | import { state } from '../../store' |
9 | | - import { connectWallet$, internalState$ } from '../../streams' |
| 10 | + import { connectWallet$, internalState$, onDestroy$ } from '../../streams' |
10 | 11 | import { |
11 | 12 | getChainId, |
12 | 13 | requestAccounts, |
|
47 | 48 | let windowWidth: number |
48 | 49 | let scrollContainer: HTMLElement |
49 | 50 |
|
50 | | - const walletToAutoSelect = |
| 51 | + let walletToAutoSelect = |
51 | 52 | autoSelect && |
52 | 53 | walletModules.find( |
53 | 54 | ({ label }) => label.toLowerCase() === autoSelect.label.toLowerCase() |
54 | 55 | ) |
55 | 56 |
|
| 57 | + const modalStep$ = new BehaviorSubject<keyof i18n['connect']>( |
| 58 | + 'selectingWallet' |
| 59 | + ) |
| 60 | +
|
56 | 61 | // ==== SELECT WALLET ==== // |
57 | 62 | async function selectWallet({ |
58 | 63 | label, |
|
185 | 190 | // user rejected account access |
186 | 191 | if (code === ProviderRpcErrorCode.ACCOUNT_ACCESS_REJECTED) { |
187 | 192 | connectionRejected = true |
| 193 | + if (autoSelect) { |
| 194 | + walletToAutoSelect = null |
| 195 | + } |
188 | 196 | return |
189 | 197 | } |
190 | 198 |
|
|
229 | 237 | setTimeout(() => connectWallet$.next({ inProgress: false }), 1500) |
230 | 238 | } |
231 | 239 |
|
232 | | - let step: keyof i18n['connect'] = 'selectingWallet' |
233 | | -
|
234 | | - // ==== STEP HANDLING LOGIC ==== // |
235 | | - $: switch (step) { |
236 | | - case 'selectingWallet': { |
237 | | - if (walletToAutoSelect) { |
238 | | - autoSelectWallet(walletToAutoSelect) |
239 | | - } else { |
240 | | - loadWalletsForSelection() |
| 240 | + modalStep$.pipe(takeUntil(onDestroy$)).subscribe(step => { |
| 241 | + switch (step) { |
| 242 | + case 'selectingWallet': { |
| 243 | + if (walletToAutoSelect) { |
| 244 | + autoSelectWallet(walletToAutoSelect) |
| 245 | + } else { |
| 246 | + loadWalletsForSelection() |
| 247 | + } |
| 248 | + break |
| 249 | + } |
| 250 | + case 'connectingWallet': { |
| 251 | + connectWallet() |
| 252 | + break |
| 253 | + } |
| 254 | + case 'connectedWallet': { |
| 255 | + updateAccountDetails() |
| 256 | + break |
241 | 257 | } |
242 | | -
|
243 | | - break |
244 | | - } |
245 | | - case 'connectingWallet': { |
246 | | - connectWallet() |
247 | | - break |
248 | | - } |
249 | | - case 'connectedWallet': { |
250 | | - updateAccountDetails() |
251 | | - break |
252 | 258 | } |
253 | | - } |
| 259 | + }) |
254 | 260 |
|
255 | 261 | function setStep(update: keyof i18n['connect']) { |
256 | | - step = update |
| 262 | + modalStep$.next(update) |
257 | 263 | } |
258 | 264 |
|
259 | 265 | function scrollToTop() { |
|
331 | 337 | <Modal {close}> |
332 | 338 | <div class="container relative flex"> |
333 | 339 | {#if windowWidth >= 809} |
334 | | - <Sidebar {step} /> |
| 340 | + <Sidebar step={$modalStep$} /> |
335 | 341 | {/if} |
336 | 342 |
|
337 | 343 | <div class="content flex flex-column"> |
338 | 344 | <div class="header relative flex items-center"> |
339 | 345 | <h4 class="header-heading"> |
340 | | - {$_(`connect.${step}.header`, { |
341 | | - default: en.connect[step].header, |
| 346 | + {$_(`connect.${$modalStep$}.header`, { |
| 347 | + default: en.connect[$modalStep$].header, |
342 | 348 | values: { |
343 | 349 | connectionRejected, |
344 | 350 | wallet: selectedWallet && selectedWallet.label |
|
351 | 357 | </div> |
352 | 358 |
|
353 | 359 | <div class="scroll-container" bind:this={scrollContainer}> |
354 | | - {#if step === 'selectingWallet'} |
| 360 | + {#if $modalStep$ === 'selectingWallet'} |
355 | 361 | {#if wallets.length} |
356 | 362 | <Agreement bind:agreed /> |
357 | 363 |
|
|
368 | 374 | {/if} |
369 | 375 | {/if} |
370 | 376 |
|
371 | | - {#if step === 'connectingWallet' && selectedWallet} |
| 377 | + {#if $modalStep$ === 'connectingWallet' && selectedWallet} |
372 | 378 | <ConnectingWallet |
373 | 379 | {connectWallet} |
374 | 380 | {connectionRejected} |
|
378 | 384 | /> |
379 | 385 | {/if} |
380 | 386 |
|
381 | | - {#if step === 'connectedWallet' && selectedWallet} |
| 387 | + {#if $modalStep$ === 'connectedWallet' && selectedWallet} |
382 | 388 | <ConnectedWallet {selectedWallet} /> |
383 | 389 | {/if} |
384 | 390 | </div> |
|
0 commit comments