UNPKG

@broxus/tvm-connect

Version:

Nekoton-compatible wallets connector.

44 lines (43 loc) 2.24 kB
'use client'; import { debug } from '@broxus/js-utils'; import { useContext } from '@broxus/react-uikit'; import { reaction } from 'mobx'; import * as React from 'react'; import { DEFAULT_NETWORK, DEFAULT_PROVIDER } from '../constants'; import { TvmWalletProvidersProvider } from '../context/TvmWalletProvidersContext'; import { getRecentConnectionMeta, storeRecentConnectionMeta } from '../hooks'; import { TvmWalletService } from '../services'; export const TvmWalletServiceContext = React.createContext(null); export function useTvmWalletService() { return useContext(TvmWalletServiceContext); } export function TvmWalletServiceProvider({ agreementsNote, children, params, recentMetaStorageKey, wallet, }) { const context = React.useMemo(() => { if (wallet instanceof TvmWalletService) { return wallet; } debug('Wallet is not provided from upper scope. Use an internal wallet instance.'); const providers = (!params?.providers || params.providers.length === 0) ? [DEFAULT_PROVIDER()] : params.providers; const networks = (!params?.networks || params.networks.length === 0) ? [DEFAULT_NETWORK] : params.networks; return new TvmWalletService({ defaultNetworkId: Number(networks.at(0)?.chainId) ?? params?.defaultNetworkId, providerId: providers?.at(0)?.id ?? params?.providerId, ...params, networks, providers, }); }, [params, wallet]); React.useEffect(() => reaction(() => context.chainId, chainId => { if (chainId) { const recentMeta = getRecentConnectionMeta(recentMetaStorageKey); storeRecentConnectionMeta({ ...recentMeta, chainId: chainId.toString() }, recentMetaStorageKey); } }, { delay: 10, fireImmediately: context.isReady }), [context, recentMetaStorageKey]); return (React.createElement(TvmWalletServiceContext.Provider, { value: context }, React.createElement(TvmWalletProvidersProvider, { agreementsNote: agreementsNote, recentMetaStorageKey: recentMetaStorageKey }, children))); } if (process.env.NODE_ENV !== 'production') { TvmWalletServiceContext.displayName = 'TvmWalletServiceContext'; }