UNPKG

@itwin/itwinui-react

Version:

A react component library for iTwinUI

39 lines (38 loc) 1.13 kB
import * as React from 'react'; import { useSyncExternalStore, useIsClient } from '../hooks/index.js'; let HydrationContext = React.createContext(false); let noopSubscribe = () => () => {}; let isServer = 'undefined' == typeof window; export const useHydration = () => { let hydrating = useSyncExternalStore( noopSubscribe, () => false, () => !isServer, ); let hydrated = React.useContext(HydrationContext); let hydratedFallback = useIsClient(); if (hydrated || hydratedFallback) return 'hydrated'; if (hydrating) return 'hydrating'; }; export const HydrationProvider = ({ children }) => { let [isHydrated, setIsHydrated] = React.useState( React.useContext(HydrationContext), ); let onHydrate = React.useCallback(() => setIsHydrated(true), []); return React.createElement( HydrationContext.Provider, { value: isHydrated, }, isHydrated ? null : React.createElement(HydrationCheck, { onHydrate: onHydrate, }), children, ); }; let HydrationCheck = ({ onHydrate }) => { React.useEffect(() => void onHydrate(), [onHydrate]); return null; };