import { useContext, useCallback, useState } from 'react' import { ConnectionContext } from '../providers/ConnectionProvider' import type { UseWalletCapabilitiesReturn, WalletError } from '@meshconnect/uwc-types' /** * Hook for managing wallet capabilities * @returns Wallet capabilities state and a fetch function to manually fetch capabilities * @throws Error if used outside of ConnectionProvider * @example * ```tsx * const { capabilities, networkCapabilities, isLoading, error, fetchCapabilities } = useWalletCapabilities() * * const handleFetchCapabilities = async () => { * await fetchCapabilities() * } * * if (isLoading) { * return
Loading capabilities...
* } * * if (capabilities?.['eip155:1']?.atomicBatching.supported) { * console.log('Atomic batching is supported') * } * ``` */ export function useWalletCapabilities(): UseWalletCapabilitiesReturn { const context = useContext(ConnectionContext) if (!context) { throw new Error( 'useWalletCapabilities must be used within a ConnectionProvider' ) } const { connector, session } = context const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState() // Manual fetch function to be called from the app const fetchCapabilities = useCallback(async () => { // If no active session or address, clear capabilities if (!session?.activeAddress || !session?.connectionMode) { return } setIsLoading(true) setError(undefined) try { // Use provided network or find the active network from session const networkToUse = connector .getNetworks() .find(n => n.id === session.activeNetwork?.id) await connector.getWalletCapabilities(session.activeAddress, networkToUse) } catch (err) { const walletError = err as WalletError setError(walletError) } finally { setIsLoading(false) } }, [ session?.activeAddress, session?.connectionMode, session?.activeNetwork, connector ]) return { isLoading, error, fetchCapabilities } }