@lifi/wallet-management
Version:
LI.FI Wallet Management solution.
95 lines • 4.19 kB
JavaScript
import { useConfig as useBigmiConfig } from '@bigmi/react';
import { ChainId, ChainType } from '@lifi/sdk';
import { useWallet } from '@solana/wallet-adapter-react';
import { useMemo } from 'react';
import { useAccount as useAccountInternal } from 'wagmi';
import { create } from 'zustand';
const defaultAccount = {
chainType: ChainType.EVM,
isConnected: false,
isConnecting: false,
isReconnecting: false,
isDisconnected: true,
status: 'disconnected',
};
export const useLastConnectedAccount = create((set) => ({
lastConnectedAccount: null,
setLastConnectedAccount: (account) => set({ lastConnectedAccount: account }),
}));
/**
* @param args When we provide args we want to return either account with corresponding chainType or default disconnected one
* @returns - Account result
*/
export const useAccount = (args) => {
const bigmiConfig = useBigmiConfig();
const bigmiAccount = useAccountInternal({ config: bigmiConfig });
const wagmiAccount = useAccountInternal();
const { wallet } = useWallet();
const { lastConnectedAccount } = useLastConnectedAccount();
// biome-ignore lint/correctness/useExhaustiveDependencies:
return useMemo(() => {
const svm = wallet?.adapter.publicKey
? {
address: wallet?.adapter.publicKey.toString(),
chainId: ChainId.SOL,
chainType: ChainType.SVM,
connector: wallet?.adapter,
isConnected: Boolean(wallet?.adapter.publicKey),
isConnecting: false,
isReconnecting: false,
isDisconnected: !wallet,
status: 'connected',
}
: {
chainType: ChainType.SVM,
isConnected: false,
isConnecting: false,
isReconnecting: false,
isDisconnected: true,
status: 'disconnected',
};
const evm = { ...wagmiAccount, chainType: ChainType.EVM };
const utxo = { ...bigmiAccount, chainType: ChainType.UTXO };
const accounts = [evm, svm, utxo];
const connectedAccounts = accounts.filter((account) => account.isConnected && account.address);
// If a chainType argument is provided, attempt to find a connected account with the matching chainType.
// If no matching account is found, fallback to the default account.
// If no chainType argument, selectedAccount should be used.
const selectedChainTypeAccount = args?.chainType
? connectedAccounts.find((account) => account.chainType === args?.chainType) || defaultAccount
: undefined;
// If lastConnectedAccount exists, attempt to find a connected account with a matching connector ID or name.
// If no matching account is found, fallback to the first connected account.
// If lastConnectedAccount is not present, simply select the first connected account.
const selectedAccount = lastConnectedAccount
? connectedAccounts.find((account) => {
const connectorIdMatch = lastConnectedAccount?.id ===
account.connector?.id;
const connectorNameMatch = !lastConnectedAccount?.id &&
lastConnectedAccount?.name ===
account.connector?.name;
return connectorIdMatch || connectorNameMatch;
}) || connectedAccounts[0]
: connectedAccounts[0];
return {
account: selectedChainTypeAccount || selectedAccount || defaultAccount,
// We need to return only connected account list
accounts: connectedAccounts,
};
}, [
wallet?.adapter.publicKey,
wagmiAccount.connector?.uid,
wagmiAccount.connector?.id,
wagmiAccount.status,
wagmiAccount.address,
wagmiAccount.chainId,
bigmiAccount.connector?.uid,
bigmiAccount.connector?.id,
bigmiAccount.status,
bigmiAccount.address,
bigmiAccount.chainId,
args?.chainType,
lastConnectedAccount,
]);
};
//# sourceMappingURL=useAccount.js.map