export function WagmiProvider(
parameters: React.PropsWithChildren<WagmiProviderProps>,
) {
const { children, config } = parameters
const props = { value: config }
return createElement(
Hydrate,
parameters,
createElement(WagmiContext.Provider, props, children),
)
}
export function Hydrate(parameters: React.PropsWithChildren<HydrateProps>) {
const { children, config, initialState, reconnectOnMount = true } = parameters
const { onMount } = hydrate(config, {
initialState,
reconnectOnMount,
})
// Hydrate for non-SSR
if (!config._internal.ssr) onMount()
// Hydrate for SSR
const active = useRef(true)
// biome-ignore lint/correctness/useExhaustiveDependencies: `queryKey` not required
useEffect(() => {
if (!active.current) return
if (!config._internal.ssr) return
onMount()
return () => {
active.current = false
}
}, [])
return children as ReactElement
}
export function hydrate(config: Config, parameters: HydrateParameters) {
const { initialState, reconnectOnMount } = parameters
if (initialState && !config._internal.store.persist.hasHydrated())
config.setState({
...initialState,
chainId: config.chains.some((x) => x.id === initialState.chainId)
? initialState.chainId
: config.chains[0].id,
connections: reconnectOnMount ? initialState.connections : new Map(),
status: reconnectOnMount ? 'reconnecting' : 'disconnected',
})
return {
async onMount() {
if (config._internal.ssr) {
await config._internal.store.persist.rehydrate()
const mipdConnectors = config._internal.mipd
?.getProviders()
.map(config._internal.connectors.providerDetailToConnector)
.map(config._internal.connectors.setup)
config._internal.connectors.setState((connectors) => [
...connectors,
...(mipdConnectors ?? []),
])
}
if (reconnectOnMount) reconnect(config)
else if (config.storage)
// Reset connections that may have been hydrated from storage.
config.setState((x) => ({
...x,
connections: new Map(),
}))
},
}
}
import { persist, subscribeWithSelector } from 'zustand/middleware’
persist持久化