/ apps / web / src / hooks / useWalletAuth.ts
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  }