@lifi/wallet-management
Version:
LI.FI Wallet Management solution.
66 lines (61 loc) • 2.26 kB
text/typescript
import type { Config as BigmiConfig } from '@bigmi/client'
import {
disconnect as bigmiDisconnect,
getAccount as bigmiGetAccount,
} from '@bigmi/client'
import { useConfig as useBigmiConfig } from '@bigmi/react'
import { ChainType } from '@lifi/sdk'
import { useDisconnectWallet } from '@mysten/dapp-kit'
import { useWallet } from '@solana/wallet-adapter-react'
import type { Config, Connector } from 'wagmi'
import { useConfig as useWagmiConfig } from 'wagmi'
import { disconnect, getAccount } from 'wagmi/actions'
import {
type WalletDisconnected,
WalletManagementEvent,
} from '../types/events.js'
import type { Account } from './useAccount.js'
import { useWalletManagementEvents } from './useWalletManagementEvents.js'
export const useAccountDisconnect = () => {
const emitter = useWalletManagementEvents()
const bigmiConfig = useBigmiConfig()
const wagmiConfig = useWagmiConfig()
const { disconnect: solanaDisconnect } = useWallet()
const { mutateAsync: disconnectWallet } = useDisconnectWallet()
const handleDisconnectEVM = async (config: Config) => {
const connectedAccount = getAccount(config)
if (connectedAccount.connector) {
await disconnect(config, { connector: connectedAccount.connector })
}
}
const handleDisconnectUTXO = async (config: BigmiConfig) => {
const connectedAccount = bigmiGetAccount(config)
if (connectedAccount.connector) {
await bigmiDisconnect(config, { connector: connectedAccount.connector })
}
}
return async (account: Account) => {
const walletDisconnected: WalletDisconnected = {
address: account.address,
chainId: account.chainId,
chainType: account.chainType,
connectorId: (account.connector as Connector)?.id,
connectorName: (account.connector as Connector)?.name,
}
switch (account.chainType) {
case ChainType.EVM:
await handleDisconnectEVM(wagmiConfig)
break
case ChainType.UTXO:
await handleDisconnectUTXO(bigmiConfig)
break
case ChainType.SVM:
await solanaDisconnect()
break
case ChainType.MVM:
await disconnectWallet()
break
}
emitter.emit(WalletManagementEvent.WalletDisconnected, walletDisconnected)
}
}