diff --git a/app/components/content/Eip6963.client.vue b/app/components/content/Eip6963.client.vue index 6757774..8fe2093 100644 --- a/app/components/content/Eip6963.client.vue +++ b/app/components/content/Eip6963.client.vue @@ -14,7 +14,7 @@ const providerList = computed(() => { }) }) -async function onClickWallet(rdns?: RDNS) { +async function onClickWallet(rdns: RDNS) { useVueDappModal().close() await connectTo('BrowserWallet', { target: 'rdns', rdns }) } diff --git a/packages/core/src/browserWalletConnector.ts b/packages/core/src/browserWalletConnector.ts index a1a77d2..cb882e6 100644 --- a/packages/core/src/browserWalletConnector.ts +++ b/packages/core/src/browserWalletConnector.ts @@ -37,7 +37,7 @@ export class BrowserWalletConnector extends Connector) { const { target, rdns, timeout } = options const { provider, info } = this.getProvider(target, rdns) diff --git a/packages/core/src/services/connect.ts b/packages/core/src/services/connect.ts index 7e64506..e22e0ea 100644 --- a/packages/core/src/services/connect.ts +++ b/packages/core/src/services/connect.ts @@ -1,6 +1,6 @@ import { computed, readonly } from 'vue' import { useStore } from '../store' -import { ConnectOptions, ConnectorName, ProviderTarget, RDNS } from '../types' +import { ConnectOptions, ConnectorName, ProviderTarget } from '../types' import { AutoConnectError, ConnectError, ConnectorNotFoundError } from '../errors' import { normalizeChainId } from '../utils' import { @@ -24,7 +24,7 @@ export function useConnect(pinia?: any) { walletStore.wallet.providerTarget = null } - async function connectTo(connectorName: ConnectorName | string, options?: ConnectOptions) { + async function connectTo(connectorName: T, options: ConnectOptions) { walletStore.wallet.error = '' walletStore.wallet.status = 'connecting' @@ -36,11 +36,8 @@ export function useConnect(pinia?: any) { const { provider, account, chainId, info } = await connector.connect(options) if (connector.name === 'BrowserWallet') { - if (!info) throw new Error('BrowserWallet connector requires provider info') - if (!options?.target) throw new Error('BrowserWallet connector requires target') - - walletStore.wallet.providerInfo = info - walletStore.wallet.providerTarget = options?.target + walletStore.wallet.providerInfo = info || null + walletStore.wallet.providerTarget = options?.target || null } walletStore.wallet.connector = connector @@ -114,12 +111,14 @@ export function useConnect(pinia?: any) { const browserWallet = walletStore.connectors.find(conn => conn.name === 'BrowserWallet') if (!browserWallet) return - let options: ConnectOptions + let options: ConnectOptions<'BrowserWallet'> switch (target) { case 'window.ethereum': if (!isWindowEthereumAvailable) return - options = { target: 'window.ethereum' } + options = { + target: 'window.ethereum', + } break case 'rdns': const lastRdns = getLastConnectedBrowserWallet() @@ -132,7 +131,7 @@ export function useConnect(pinia?: any) { } try { - await connectTo(browserWallet.name, options) + await connectTo('BrowserWallet', options) } catch (err: any) { throw new AutoConnectError(err) } diff --git a/packages/core/src/types/connector.ts b/packages/core/src/types/connector.ts index 25f64e8..2eccf3f 100644 --- a/packages/core/src/types/connector.ts +++ b/packages/core/src/types/connector.ts @@ -11,12 +11,19 @@ export type ConnectorData = { info?: EIP6963ProviderInfo // Only available for BrowserWalletConnector } -export type ConnectOptions = { +export type ConnectOptionsBase = { target?: ProviderTarget rdns?: string timeout?: number } +type ConnectOptionsForBrowserWallet = ConnectOptionsBase & + (T extends 'rdns' ? { target: T; rdns: string } : { target: T }) + +export type ConnectOptions = T extends 'BrowserWallet' + ? ConnectOptionsForBrowserWallet + : ConnectOptionsBase | undefined + export abstract class Connector { // Connector name abstract readonly name: string @@ -27,7 +34,7 @@ export abstract class Connector { this.options = options } - abstract connect(optionsOrTimeout?: ConnectOptions | number): Promise + abstract connect(optionsOrTimeout?: ConnectOptions | number): Promise abstract getProvider(): Promise | { provider: EIP1193Provider; info?: EIP6963ProviderInfo } diff --git a/packages/modal/src/VueDappModal.vue b/packages/modal/src/VueDappModal.vue index 71922df..6ac37d0 100644 --- a/packages/modal/src/VueDappModal.vue +++ b/packages/modal/src/VueDappModal.vue @@ -93,10 +93,10 @@ watch(modalOpen, async () => { } }) -async function onClickWallet(connName: ConnectorName, options?: ConnectOptions) { +async function onClickWallet(connName: T, options?: ConnectOptions) { try { closeModal() - await connectTo(connName, options) + await connectTo(connName, options) } catch (err: any) { emit('connectError', err) }