@broxus/tvm-connect
Version:
Nekoton-compatible wallets connector.
44 lines (43 loc) • 2.24 kB
JavaScript
'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';
}