xylabs/sdk-react

View on GitHub
packages/crypto/src/wallets/third-party/hooks/useEthWallet.tsx

Summary

Maintainability
A
1 hr
Test Coverage
import { EthAddress } from '@xylabs/eth-address'
import { usePromise } from '@xylabs/react-promise'
import { useMemo } from 'react'

import { EthWallet } from '../../types'
import { EthWalletConnectorBase } from '../classes'
import { useChainId } from './useChainId'
import { useConnectWallet } from './useConnect'
import { useCurrentAccount } from './useCurrentAccount'
import { useProvider } from './useProvider'
import { useSigner } from './useSigner'

/**
 * A hook that takes an instance of EthWalletConnectorBase and makes certain functionality reactive.
 */
export const useEthWallet = (connector: EthWalletConnectorBase): EthWallet => {
  const [currentAccount, additionalAccounts] = useCurrentAccount(connector)

  const chainId = useChainId(connector)

  const chainName = useMemo(() => (chainId ? connector.chainName : undefined), [chainId, connector])

  const { provider, providerName } = useProvider(connector)

  const { connectWallet, connectRefused, connectError } = useConnectWallet(connector)

  const signer = useSigner(connector, currentAccount)

  const [signerAddress] = usePromise(async () => EthAddress.fromString(await signer?.getAddress()), [signer])

  const signMessage = useMemo(() => connector.signMessage.bind(connector), [connector])

  const installed = useMemo(() => connector.installed, [connector.installed])

  const providerInfo = useMemo(() => connector.providerInfo, [connector.providerInfo])

  return {
    additionalAccounts,
    chainId,
    chainName,
    connectError,
    connectRefused,
    connectWallet,
    currentAccount,
    installed,
    provider,
    providerInfo,
    providerName,
    signMessage,
    signer,
    signerAddress,
  }
}