import React, { useEffect, useMemo, useRef, useState } from 'react' import { Platform } from 'react-native' import { BreakpointIndexProvider } from '../css/breakpoints' import { DripsyThemeContext } from './context' type Props = DripsyThemeContext & { children: React.ReactNode } & ( | { /** * Set this boolean to `true` if you are using SSR on your app. * * Keep in mind, Dripsy doesn't support SSR anymore. * * Enabling this boolean just renders `null` until your app has mounted on web. * * Set this to `true` if you aren't gating your content already, and if you use responsive arrays in your app. */ ssr?: false ssrPlaceholder?: never } | { /** * Set this boolean to `true` if you are using SSR on your app. * * Keep in mind, Dripsy doesn't support SSR anymore. * * Enabling this boolean just renders `null` until your app has mounted on web. * * Set this to `true` if you aren't gating your content already, and if you use responsive arrays in your app. */ ssr: true /** * When `ssr` is true, your app will return null on the first mount by default. * * You can use the ssrPlaceholder if you'd prefer. * * ```tsx * }>{children} * ``` */ ssrPlaceholder?: React.ReactNode } ) const useIsSSRReady = ({ ssr = false }: Pick) => { const [ready, setReady] = useState(() => { if (Platform.OS !== 'web') { return true } if (ssr) { return false } return true }) const isSSR = useRef(ssr) useEffect(() => { if (isSSR.current) { setReady(true) } }, []) return { ready, } } export function DripsyProvider(p: Props) { const { ssrPlaceholder = null, ssr, theme, children } = p const { ready } = useIsSSRReady({ ssr }) const context = useMemo(() => ({ theme }), [theme]) if (!ready) { return <>{ssrPlaceholder} } return ( {children} ) } /** * @deprecated use DripsyProvider instead */ export function ThemeProvider() { throw new Error( '🍷 [Dripsy] ThemeProvider is deprecated, please use DripsyProvider instead.' ) }