UNPKG

@safe-global/safe-react-hooks

Version:

A collection of React Hooks that facilitates the interaction of React apps with Safe Smart Accounts

61 lines 2.51 kB
import { createElement, useCallback, useEffect, useMemo, useState } from 'react'; import { QueryClientProvider } from '@tanstack/react-query'; import { createConfig, WagmiProvider } from 'wagmi'; import { InitializeSafeProviderError } from './errors/InitializeSafeProviderError.js'; import { isSafeConfigWithSigner } from './types/guards.js'; import { createPublicClient, createSignerClient } from './createClient.js'; import { queryClient } from './queryClient.js'; import { SafeContext } from './SafeContext.js'; export function SafeProvider(params) { const [config, setConfig] = useState(params.config); const [isInitialized, setIsInitialized] = useState(false); const [publicClient, setPublicClient] = useState(); const [signerClient, setSignerClient] = useState(); const wagmiConfig = useMemo(() => createConfig({ chains: [config.chain], transports: { [config.chain.id]: config.transport } }), [config.chain, config.transport]); useEffect(() => { setIsInitialized(false); Promise.all([ createPublicClient(config).then(setPublicClient), isSafeConfigWithSigner(config) ? setSigner(config.signer) : Promise.resolve() ]) .then(() => { setIsInitialized(true); }) .catch((err) => { throw new InitializeSafeProviderError('Failed to initialize clients.', err); }); }, [config]); const setSigner = useCallback(async (signer) => { if (signer) { try { const newSignerClient = await createSignerClient({ ...config, signer }); setSignerClient(newSignerClient); } catch (err) { throw new InitializeSafeProviderError('Failed to initialize signer client.', err); } } else if (signerClient) { setSignerClient(undefined); } }, [config, signerClient]); if (!config.provider) { throw new InitializeSafeProviderError('Provider not set in config.'); } const props = { value: { isInitialized, config, wagmiConfig, setConfig, setSigner, publicClient, signerClient } }; return createElement(SafeContext.Provider, props, createElement(WagmiProvider, { config: wagmiConfig }, createElement(QueryClientProvider, { client: queryClient }, params.children))); } //# sourceMappingURL=SafeProvider.js.map