diff --git a/.vscode/settings.json b/.vscode/settings.json index 4922e5d5d0..eca0af2af0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,8 +5,8 @@ "typescript.preferences.importModuleSpecifier": "shortest", "typescript.tsdk": "node_modules/typescript/lib", "editor.codeActionsOnSave": { - "quickfix.biome": true, - "source.organizeImports.biome": true + "quickfix.biome": "explicit", + "source.organizeImports.biome": "explicit" }, "[json]": { "editor.defaultFormatter": "biomejs.biome" diff --git a/packages/core/src/actions/disconnect.test.ts b/packages/core/src/actions/disconnect.test.ts index 16c1fe9a75..03d63db7de 100644 --- a/packages/core/src/actions/disconnect.test.ts +++ b/packages/core/src/actions/disconnect.test.ts @@ -21,28 +21,6 @@ test('parameters: connector', async () => { expect(config.state.status).toEqual('disconnected') }) -test('behavior: not connected to connector', async () => { - await expect(disconnect(config)).rejects.toMatchInlineSnapshot( - ` - [ConnectorNotFoundError: Connector not found. - - Version: @wagmi/core@x.y.z] - `, - ) -}) - -test('behavior: connector passed not connected', async () => { - await connect(config, { connector }) - const connector_ = config._internal.connectors.setup(mock({ accounts })) - await expect( - disconnect(config, { connector: connector_ }), - ).rejects.toMatchInlineSnapshot(` - [ConnectorNotConnectedError: Connector not connected. - - Version: @wagmi/core@x.y.z] - `) -}) - test('behavior: uses next connector on disconnect', async () => { const connector_ = config._internal.connectors.setup(mock({ accounts })) await connect(config, { connector: connector_ }) diff --git a/packages/core/src/actions/disconnect.ts b/packages/core/src/actions/disconnect.ts index d35a382857..b8f18fa907 100644 --- a/packages/core/src/actions/disconnect.ts +++ b/packages/core/src/actions/disconnect.ts @@ -1,14 +1,8 @@ -import { - type Config, - type Connection, - type Connector, -} from '../createConfig.js' +import type { Config, Connection, Connector } from '../createConfig.js' import type { BaseErrorType, ErrorType } from '../errors/base.js' -import { - ConnectorNotConnectedError, - type ConnectorNotConnectedErrorType, - ConnectorNotFoundError, - type ConnectorNotFoundErrorType, +import type { + ConnectorNotConnectedErrorType, + ConnectorNotFoundErrorType, } from '../errors/config.js' import type { ConnectorParameter } from '../types/properties.js' @@ -36,16 +30,16 @@ export async function disconnect( connector = connection?.connector } - if (!connector) throw new ConnectorNotFoundError() const connections = config.state.connections - if (!connections.has(connector.uid)) throw new ConnectorNotConnectedError() - await connector.disconnect() - connector.emitter.off('change', config._internal.events.change) - connector.emitter.off('disconnect', config._internal.events.disconnect) - connector.emitter.on('connect', config._internal.events.connect) + if (connector) { + await connector.disconnect() + connector.emitter.off('change', config._internal.events.change) + connector.emitter.off('disconnect', config._internal.events.disconnect) + connector.emitter.on('connect', config._internal.events.connect) - connections.delete(connector.uid) + connections.delete(connector.uid) + } config.setState((x) => { // if no connections exist, move to disconnected state diff --git a/packages/react/src/hooks/useConnect.ts b/packages/react/src/hooks/useConnect.ts index 027d2cd149..423ded7b3c 100644 --- a/packages/react/src/hooks/useConnect.ts +++ b/packages/react/src/hooks/useConnect.ts @@ -15,6 +15,7 @@ import { type ConnectVariables, connectMutationOptions, } from '@wagmi/core/query' +import { useEffect } from 'react' import type { ConfigParameter } from '../types/properties.js' import type { @@ -74,6 +75,17 @@ export function useConnect< ...mutationOptions, }) + // Reset mutation back to an idle state when the connector disconnects. + useEffect(() => { + return config.subscribe( + ({ status }) => status, + (status, previousStatus) => { + if (previousStatus !== 'disconnected' && status === 'disconnected') + result.reset() + }, + ) + }, [config, result]) + return { ...result, connect: mutate, diff --git a/playgrounds/vite-react/src/App.tsx b/playgrounds/vite-react/src/App.tsx index b050b8bb38..47437fef69 100644 --- a/playgrounds/vite-react/src/App.tsx +++ b/playgrounds/vite-react/src/App.tsx @@ -59,7 +59,7 @@ function Account() { status: {account.status} - {account.status === 'connected' && ( + {account.status !== 'disconnected' && (