Skip to content

Instantly share code, notes, and snippets.

@beeman
Created February 19, 2023 20:23
Show Gist options
  • Save beeman/676e53aa0578d7b4750b14a73b775f7e to your computer and use it in GitHub Desktop.
Save beeman/676e53aa0578d7b4750b14a73b775f7e to your computer and use it in GitHub Desktop.

Revisions

  1. beeman created this gist Feb 19, 2023.
    24 changes: 24 additions & 0 deletions app-feature.tsx
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,24 @@
    import { useConnection, useWallet } from '@solana/wallet-adapter-react'
    import { useSolana } from './solana-provider'

    export function AppFeature() {
    const { connection } = useConnection()
    const { network } = useSolana()
    const wallet = useWallet()

    if (wallet.connecting) {
    return <div>Connecting wallet...</div>
    }

    if (!wallet.connected || !wallet?.publicKey) {
    return <div>Connect your wallet to continue</div>
    }

    return (
    <div>
    <div>Endpoint {`${connection.rpcEndpoint}`}</div>
    <div>Network {`${network}`}</div>
    <div>Public Key {`${wallet.publicKey}`}</div>
    </div>
    )
    }
    25 changes: 25 additions & 0 deletions app.tsx
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,25 @@
    import { WalletAdapterNetwork } from '@solana/wallet-adapter-base'
    import { PhantomWalletAdapter, SolflareWalletAdapter } from '@solana/wallet-adapter-wallets'
    import { clusterApiUrl } from '@solana/web3.js'
    import { useMemo } from 'react'
    import { SolanaProvider } from './solana-provider'
    import { AppFeature } from './app-feature'

    export function App() {
    const network = WalletAdapterNetwork.Devnet
    const endpoint = clusterApiUrl(network)
    const wallets = useMemo(
    () => [
    // Add more wallets here
    new SolflareWalletAdapter({ network }),
    new PhantomWalletAdapter({ network }),
    ],
    [network],
    )

    return (
    <SolanaProvider endpoint={endpoint} network={network} wallets={wallets}>
    <AppFeature />
    </SolanaProvider>
    )
    }
    40 changes: 40 additions & 0 deletions solana-provider.tsx
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,40 @@
    import { Adapter, WalletAdapterNetwork } from '@solana/wallet-adapter-base'
    import { ConnectionProvider, WalletProvider as SolanaWalletProvider } from '@solana/wallet-adapter-react'
    import { createContext, ReactNode, useContext } from 'react'
    import { WalletModalProvider } from '@solana/wallet-adapter-react-ui'

    export interface SolanaProviderContext {
    network: WalletAdapterNetwork
    endpoint: string
    }

    const SolanaContext = createContext<SolanaProviderContext>({} as SolanaProviderContext)

    export function SolanaProvider({
    children,
    endpoint,
    network,
    wallets = [],
    }: {
    children: ReactNode
    endpoint: string
    network: WalletAdapterNetwork
    wallets?: Adapter[]
    }) {
    const value: SolanaProviderContext = {
    network,
    endpoint,
    }

    return (
    <SolanaContext.Provider value={value}>
    <ConnectionProvider endpoint={endpoint}>
    <SolanaWalletProvider wallets={wallets} autoConnect>
    <WalletModalProvider>{children}</WalletModalProvider>
    </SolanaWalletProvider>
    </ConnectionProvider>
    </SolanaContext.Provider>
    )
    }

    export const useSolana = () => useContext(SolanaContext)