UNPKG

@base-ui-components/react

Version:

Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.

45 lines (43 loc) 1.59 kB
"use strict"; 'use client'; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.NoSsr = NoSsr; var React = _interopRequireWildcard(require("react")); var _useIsoLayoutEffect = require("@base-ui-components/utils/useIsoLayoutEffect"); /** * NoSsr purposely removes components from the subject of Server Side Rendering (SSR). * * This component can be useful in a variety of situations: * * * Escape hatch for broken dependencies not supporting SSR. * * Improve the time-to-first paint on the client by only rendering above the fold. * * Reduce the rendering time on the server. * * Under too heavy server load, you can turn on service degradation. * * Documentation: [Base UI Unstable No Ssr](https://base-ui.com/react/components/unstable-no-ssr) */ function NoSsr(props) { const { children, defer = false, fallback = null } = props; const [mountedState, setMountedState] = React.useState(false); (0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => { if (!defer) { setMountedState(true); } }, [defer]); React.useEffect(() => { if (defer) { setMountedState(true); } }, [defer]); // TODO casting won't be needed at one point https://github.com/DefinitelyTyped/DefinitelyTyped/pull/65135 // We could replace React.JSX.Element with React.ReactNode. // But first, we need to bump min typescript support to version to 5.1 and enough people to adopt the above change. return mountedState ? children : fallback; }