import React, { createContext, useEffect, useState } from 'react'; import dynamic from 'next/dynamic'; import { sdk } from '@farcaster/frame-sdk'; const FarcasterSolanaProvider = dynamic( () => import('@farcaster/mini-app-solana').then( mod => mod.FarcasterSolanaProvider, ), { ssr: false }, ); type SafeFarcasterSolanaProviderProps = { endpoint: string; children: React.ReactNode; }; const SolanaProviderContext = createContext<{ hasSolanaProvider: boolean }>({ hasSolanaProvider: false, }); export function SafeFarcasterSolanaProvider({ endpoint, children, }: SafeFarcasterSolanaProviderProps) { const isClient = typeof window !== 'undefined'; const [hasSolanaProvider, setHasSolanaProvider] = useState(false); const [checked, setChecked] = useState(false); useEffect(() => { if (!isClient) return; let cancelled = false; (async () => { try { const provider = await sdk.wallet.getSolanaProvider(); if (!cancelled) { setHasSolanaProvider(!!provider); } } catch { if (!cancelled) { setHasSolanaProvider(false); } } finally { if (!cancelled) { setChecked(true); } } })(); return () => { cancelled = true; }; }, [isClient]); useEffect(() => { let errorShown = false; const origError = console.error; console.error = (...args) => { if ( typeof args[0] === 'string' && args[0].includes('WalletConnectionError: could not get Solana provider') ) { if (!errorShown) { origError(...args); errorShown = true; } return; } origError(...args); }; return () => { console.error = origError; }; }, []); if (!isClient || !checked) { return null; } return ( {hasSolanaProvider ? ( {children} ) : ( <>{children} )} ); } export function useHasSolanaProvider() { return React.useContext(SolanaProviderContext).hasSolanaProvider; }