1+ import { Signer } from '@ethersproject/abstract-signer'
12import { ConnectButton } from '@rainbow-me/rainbowkit'
2- import { ElectionProvider , OrganizationProvider , useElection } from '@vocdoni/react-providers'
3- import { PublishedElection } from '@vocdoni/sdk'
3+ import { ClientProvider , ElectionProvider , OrganizationProvider , useElection } from '@vocdoni/react-providers'
4+ import { EnvOptions , PublishedElection } from '@vocdoni/sdk'
5+ import { PropsWithChildren , useEffect , useState } from 'react'
6+ import { useTranslation } from 'react-i18next'
47import { useLoaderData } from 'react-router-dom'
8+ import { useAccount , useWalletClient } from 'wagmi'
59import { ProcessView as ProcessViewComponent } from '~components/Process/View'
10+ import { farcasterSignerAdapter , isFarcasterMiniapp } from '~utils/farcaster'
11+ import { VocdoniEnvironment } from '~src/constants'
12+ import { walletClientToSigner } from '~src/constants/wagmi-adapters'
13+ import { translations } from '~src/i18n/components'
14+ import { datesLocale } from '~src/i18n/locales'
615import { useDocumentTitle } from '~src/use-document-title'
716
817const ProcessView = ( ) => {
@@ -15,14 +24,74 @@ const ProcessView = () => {
1524 return < ProcessViewComponent />
1625}
1726
27+ /**
28+ * Farcaster-aware ClientProvider wrapper
29+ * Automatically uses Farcaster wallet when running in Farcaster miniapp context,
30+ * otherwise falls back to Wagmi wallet
31+ */
32+ const FarcasterAwareClientProvider = ( { children } : PropsWithChildren ) => {
33+ const { data : wagmiWalletClient } = useWalletClient ( )
34+ const { address } = useAccount ( )
35+ const { t, i18n } = useTranslation ( )
36+ const [ farcasterSigner , setFarcasterSigner ] = useState < Signer | null > ( null )
37+ const [ isInitialized , setIsInitialized ] = useState ( false )
38+
39+ // Get Farcaster signer if in miniapp
40+ useEffect ( ( ) => {
41+ const initFarcaster = async ( ) => {
42+ if ( isFarcasterMiniapp ( ) ) {
43+ try {
44+ // Get Farcaster signer (SDK already initialized in AppProviders)
45+ const signer = await farcasterSignerAdapter ( )
46+ setFarcasterSigner ( signer )
47+ console . log ( '✅ Using Farcaster wallet for voting' )
48+ } catch ( error ) {
49+ console . error ( '❌ Farcaster signer creation failed, falling back to Wagmi:' , error )
50+ }
51+ }
52+ setIsInitialized ( true )
53+ }
54+
55+ initFarcaster ( )
56+ } , [ ] )
57+
58+ // Determine which signer to use
59+ let signer : Signer | null = null
60+ if ( farcasterSigner ) {
61+ // Use Farcaster signer if available
62+ signer = farcasterSigner
63+ } else if ( wagmiWalletClient && address && wagmiWalletClient . account . address === address ) {
64+ // Fall back to Wagmi wallet
65+ signer = walletClientToSigner ( wagmiWalletClient )
66+ }
67+
68+ // Don't render until Farcaster initialization is complete
69+ if ( ! isInitialized ) {
70+ return null
71+ }
72+
73+ return (
74+ < ClientProvider
75+ env = { VocdoniEnvironment as EnvOptions }
76+ signer = { signer as Signer }
77+ locale = { translations ( t ) }
78+ datesLocale = { datesLocale ( i18n . language ) }
79+ >
80+ { children }
81+ </ ClientProvider >
82+ )
83+ }
84+
1885const Process = ( ) => {
1986 const election = useLoaderData ( ) as PublishedElection
2087
2188 return (
2289 < OrganizationProvider id = { election . organizationId } >
23- < ElectionProvider election = { election } ConnectButton = { ConnectButton } fetchCensus autoUpdate >
24- < ProcessView />
25- </ ElectionProvider >
90+ < FarcasterAwareClientProvider >
91+ < ElectionProvider election = { election } ConnectButton = { ConnectButton } fetchCensus autoUpdate >
92+ < ProcessView />
93+ </ ElectionProvider >
94+ </ FarcasterAwareClientProvider >
2695 </ OrganizationProvider >
2796 )
2897}
0 commit comments