"use client"; import { type ReactElement, type ReactNode, useEffect, useState } from "react"; import { useSsr } from "./SsrProvider.js"; /** @since 6.0.0 */ export interface NoSsrProps { children: ReactNode; } /** * **Client Component** * * A small wrapper that can be used to render children client side only. The * main use-case are for components that rely on browser API to work correctly. * * @example Simple Example * ```tsx * import { NoSsr } from "@react-md/core/NoSsr"; * import { CoreProviders } from "@react-md/core/CoreProviders" * import { Typography } from "@react-md/core/typography/Typography" * import { type ReactElement } from "react"; * * function Example(): ReactElement { * return ( * <> * This is always rendered. * * * This is only rendered client-side after rehydrating. * * * * ); * } * * function App(): ReactElement { * return ( * * * * ); * } * ``` * * @since 6.0.0 */ export function NoSsr(props: NoSsrProps): ReactElement { const { children } = props; const ssr = useSsr(); const [rendered, setRendered] = useState(!ssr); useEffect(() => { setRendered(true); }, []); return <>{rendered && children}; }