@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
JavaScript
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