UNPKG

@lifi/wallet-management

Version:

LI.FI Wallet Management solution.

151 lines 7.36 kB
import { useConfig as useBigmiConfig } from '@bigmi/react'; import { ChainType } from '@lifi/sdk'; import { useMediaQuery } from '@mui/material'; import { WalletReadyState } from '@solana/wallet-adapter-base'; import { useWallet } from '@solana/wallet-adapter-react'; import { useMemo } from 'react'; import { useAccount, useConnect } from 'wagmi'; import { defaultCoinbaseConfig } from '../config/coinbase.js'; import { defaultMetaMaskConfig } from '../config/metaMask.js'; import { defaultWalletConnectConfig } from '../config/walletConnect.js'; import { createCoinbaseConnector } from '../connectors/coinbase.js'; import { createMetaMaskConnector } from '../connectors/metaMask.js'; import { createWalletConnectConnector } from '../connectors/walletConnect.js'; import { useWalletManagementConfig } from '../providers/WalletManagementProvider/WalletManagementContext.js'; import { getConnectorIcon } from '../utils/getConnectorIcon.js'; import { getWalletPriority } from '../utils/getWalletPriority.js'; import { isWalletInstalled } from '../utils/isWalletInstalled.js'; const normalizeName = (name) => name.split(' ')[0].toLowerCase().trim(); const combineWalletLists = (utxoConnectorList, evmConnectorList, svmWalletList) => { const walletMap = new Map(); utxoConnectorList.forEach((utxo) => { const utxoName = utxo?.displayName || utxo?.name; const normalizedName = normalizeName(utxoName); const existing = walletMap.get(normalizedName) || { id: utxo.id, name: utxoName, icon: getConnectorIcon(utxo), connectors: [], }; existing.connectors.push({ connector: utxo, chainType: ChainType.UTXO }); walletMap.set(normalizedName, existing); }); evmConnectorList.forEach((evm) => { const evmName = evm?.displayName || evm?.name; const normalizedName = normalizeName(evmName); const existing = walletMap.get(normalizedName) || { id: evm.id, name: evmName, icon: getConnectorIcon(evm), connectors: [], }; existing.connectors.push({ connector: evm, chainType: ChainType.EVM }); walletMap.set(normalizedName, existing); }); svmWalletList.forEach((svm) => { const normalizedName = normalizeName(svm.adapter.name); const existing = walletMap.get(normalizedName) || { id: svm.adapter.name, name: svm.adapter.name, icon: svm.adapter.icon, connectors: [], }; existing.connectors.push({ connector: svm.adapter, chainType: ChainType.SVM, }); walletMap.set(normalizedName, existing); }); const combinedWallets = Array.from(walletMap.values()); combinedWallets.sort(walletComparator); return combinedWallets; }; export const useCombinedWallets = () => { const walletConfig = useWalletManagementConfig(); const bigmiConfig = useBigmiConfig(); const wagmiAccount = useAccount(); const bigmiAccount = useAccount({ config: bigmiConfig }); const { connectors: wagmiConnectors } = useConnect(); const { connectors: bigmiConnectors } = useConnect({ config: bigmiConfig }); const { wallets: solanaWallets } = useWallet(); const isDesktopView = useMediaQuery((theme) => theme.breakpoints.up('sm')); const data = useMemo(() => { const evmConnectors = Array.from(wagmiConnectors); // Ensure standard connectors are included if (!evmConnectors.some((connector) => connector.id.toLowerCase().includes('walletconnect'))) { evmConnectors.unshift(createWalletConnectConnector(walletConfig?.walletConnect ?? defaultWalletConnectConfig)); } if (!evmConnectors.some((connector) => connector.id.toLowerCase().includes('coinbase'))) { evmConnectors.unshift(createCoinbaseConnector(walletConfig?.coinbase ?? defaultCoinbaseConfig)); } if (!evmConnectors.some((connector) => connector.id.toLowerCase().includes('metamask'))) { evmConnectors.unshift(createMetaMaskConnector(walletConfig?.metaMask ?? defaultMetaMaskConfig)); } const includeEcosystem = (chainType) => !walletConfig.enabledChainTypes || walletConfig.enabledChainTypes.includes(chainType); const installedUTXOConnectors = includeEcosystem(ChainType.UTXO) ? bigmiConnectors.filter((connector) => { const isInstalled = isWalletInstalled(connector.id); const isConnected = bigmiAccount.connector?.id === connector.id; return isInstalled && !isConnected; }) : []; const installedEVMConnectors = includeEcosystem(ChainType.EVM) ? evmConnectors.filter((connector) => { const isInstalled = isWalletInstalled(connector.id); const isConnected = wagmiAccount.connector?.id === connector.id; return isInstalled && !isConnected; }) : []; const installedSVMWallets = includeEcosystem(ChainType.SVM) ? solanaWallets.filter((wallet) => { const isInstalled = wallet.adapter.readyState === WalletReadyState.Installed || wallet.adapter.readyState === WalletReadyState.Loadable; const isConnected = wallet.adapter.connected; return isInstalled && !isConnected; }) : []; const installedCombinedWallets = combineWalletLists(installedUTXOConnectors, installedEVMConnectors, installedSVMWallets); const notDetectedUTXOConnectors = bigmiConnectors.filter((connector) => { const isInstalled = isWalletInstalled(connector.id); return !isInstalled && isDesktopView; }); const notDetectedEVMConnectors = evmConnectors.filter((connector) => { const isInstalled = isWalletInstalled(connector.id); return !isInstalled && isDesktopView; }); const notDetectedSVMWallets = solanaWallets.filter((wallet) => { const isInstalled = wallet.adapter.readyState === WalletReadyState.Installed || wallet.adapter.readyState === WalletReadyState.Loadable; return !isInstalled && isDesktopView; }); const notDetectedCombinedWallets = combineWalletLists(notDetectedEVMConnectors, notDetectedUTXOConnectors, notDetectedSVMWallets); installedCombinedWallets.sort(walletComparator); notDetectedCombinedWallets.sort(walletComparator); return { installedWallets: installedCombinedWallets, notDetectedWallets: notDetectedCombinedWallets, }; }, [ bigmiAccount.connector?.id, bigmiConnectors, solanaWallets, wagmiAccount.connector?.id, wagmiConnectors, isDesktopView, walletConfig, ]); return data; }; // Ensure the walletComparator function is updated to handle CombinedWallet export const walletComparator = (a, b) => { const priorityA = getWalletPriority(a.id); const priorityB = getWalletPriority(b.id); if (priorityA !== priorityB) { return priorityA - priorityB; } return a.id?.localeCompare(b.id); }; //# sourceMappingURL=useCombinedWallets.js.map