useWalletAuth.ts
1 import { useAccount, useConnect, useDisconnect } from 'wagmi' 2 import { useEffect } from 'react' 3 import { useConnectModal } from '@rainbow-me/rainbowkit' 4 5 // Check if we're in a Farcaster Mini App context 6 export const isMiniApp = () => { 7 if (typeof window === 'undefined') return false 8 9 const url = new URL(window.location.href) 10 return ( 11 url.searchParams.get('miniApp') === 'true' || 12 url.pathname.startsWith('/mini') 13 ) 14 } 15 16 export function useWalletAuth() { 17 const miniApp = isMiniApp() 18 19 // Wagmi hooks for all contexts 20 const wagmiAccount = useAccount() 21 const { connect: wagmiConnect, connectors } = useConnect() 22 const { disconnect: wagmiDisconnect } = useDisconnect() 23 24 // RainbowKit modal hook for non-mini app context 25 const { openConnectModal } = useConnectModal() 26 27 // Auto-connect for Farcaster Mini App 28 useEffect(() => { 29 if (miniApp && !wagmiAccount.isConnected && connectors.length > 0) { 30 console.log('🔗 Auto-connecting Farcaster wallet...') 31 wagmiConnect({ connector: connectors[0] }) 32 } 33 }, [miniApp, wagmiAccount.isConnected, connectors, wagmiConnect]) 34 35 // Unified interface 36 return { 37 address: wagmiAccount.address, 38 isConnected: wagmiAccount.isConnected, 39 isConnecting: wagmiAccount.isConnecting, 40 isDisconnecting: false, 41 userInfo: null, 42 connect: async () => { 43 if (miniApp) { 44 // Farcaster mini app - use first connector 45 if (connectors.length > 0) { 46 wagmiConnect({ connector: connectors[0] }) 47 } 48 } else { 49 // Regular app - trigger RainbowKit modal 50 if (openConnectModal) { 51 openConnectModal() 52 } 53 } 54 }, 55 disconnect: async () => { 56 wagmiDisconnect() 57 } 58 } 59 }