Skip to content
Snippets Groups Projects
polkadotExtensionContext.tsx 2.33 KiB
Newer Older
Niklas P's avatar
Niklas P committed
import { ReactNode, createContext, useEffect, useState } from "react";
Niklas P's avatar
Niklas P committed
import type { InjectedExtension } from "@polkadot/extension-inject/types";
Niklas P's avatar
Niklas P committed
import { SubscriptionFn, WalletAccount, getWallets, isWalletInstalled } from "@talismn/connect-wallets";
Niklas P's avatar
Niklas P committed

type PolkadotExtensionContextType = {
Niklas P's avatar
Niklas P committed
    accounts: WalletAccount[] | undefined;
    actingAccountIdx: number | undefined;
Niklas P's avatar
Niklas P committed
    setActingAccountIdx: (idx: number) => void;
    setActingAccountByAddress: (address: string) => void;
Niklas P's avatar
Niklas P committed
    injector: InjectedExtension | undefined;
Niklas P's avatar
Niklas P committed
    isInitialized: boolean;
Niklas P's avatar
Niklas P committed
}

export const PolkadotExtensionContext = 
    createContext<PolkadotExtensionContextType>({} as PolkadotExtensionContextType);

Niklas P's avatar
Niklas P committed
export const PolkadotExtensionProvider = ( { children } : { children : ReactNode }) => {
Niklas P's avatar
Niklas P committed
  const [isInitialized, setIsInitialized ] = useState<boolean>( false )
Niklas P's avatar
Niklas P committed
  const [accounts, setAccounts] = useState<WalletAccount[] | undefined>([]);
  const [actingAccountIdx, setActingAccountIdx] = useState<number | undefined>( undefined );
  const [isWeb3Injected, setIsWeb3Injected] = useState<boolean>(false);
  const [injector, setInjector] = useState<InjectedExtension>();
Niklas P's avatar
Niklas P committed

Niklas P's avatar
Niklas P committed
  const setActingAccountByAddress = (address: string) => {
    setActingAccountIdx( accounts?.findIndex( account => account.address === address ) )
  }
Niklas P's avatar
Niklas P committed
  const initWalletExtension = async () => {      
Niklas P's avatar
Niklas P committed
    if (typeof window !== "undefined" ) {
      const installedWallets = getWallets().filter(wallet => wallet.installed)
      const firstWallet = installedWallets[0]
Niklas P's avatar
Niklas P committed
      // enable the wallet
Niklas P's avatar
Niklas P committed
      try {
Niklas P's avatar
Niklas P committed
        await firstWallet?.enable( "Polkadot Tokengated Demo" )
Niklas P's avatar
Niklas P committed
        await firstWallet?.subscribeAccounts((allAccounts: WalletAccount[] | undefined) => {
Niklas P's avatar
a  
Niklas P committed
            console.log("got accounts via talisman connect", allAccounts)
            if ( accounts === undefined || accounts.length === 0 ) {
Niklas P's avatar
Niklas P committed
              setAccounts( allAccounts )
              setActingAccountIdx( 0 )
Niklas P's avatar
a  
Niklas P committed
            }
        });
Niklas P's avatar
Niklas P committed
      } catch (error) {
        console.log( error )
Niklas P's avatar
Niklas P committed
      } 
Niklas P's avatar
Niklas P committed
      setIsInitialized( true )
Niklas P's avatar
Niklas P committed
    }
Niklas P's avatar
Niklas P committed
  }
Niklas P's avatar
Niklas P committed
  initWalletExtension()
Niklas P's avatar
Niklas P committed
  return (
      <PolkadotExtensionContext.Provider value={ { 
        accounts,
        actingAccountIdx,
        setActingAccountIdx,
        setActingAccountByAddress,
        injector,
Niklas P's avatar
Niklas P committed
        isInitialized,
Niklas P's avatar
Niklas P committed
      } }>
          {children}
      </PolkadotExtensionContext.Provider>
  )
Niklas P's avatar
Niklas P committed
}