'use client' import { useEffect } from 'react' import { getWindow } from 'ssr-window' import { AlphaTokenProvider } from '~/src/components/AlphaTokenProvider' import { BetaTokenProvider } from '~/src/components/BetaTokenProvider' import { FeatureProvider } from '~/src/components/FeatureProvider' import { TokenProvider } from '~/src/components/TokenProvider' import { WindowProvider } from '~/src/components/WindowProvider' import { type AppProviderProps } from './AppProvider.types' const defaultWindow = getWindow() /** * `AppProvider` is a required wrapper component that provides context for the app. * @example * * ```tsx * import React from 'react' * import { createRoot } from 'react-dom/client' * import { AppProvider } from '@channel.io/bezier-react' * * const container = document.getElementById('root') * const root = createRoot(container) * * root.render( * * * , * ) * ``` */ export function AppProvider({ children, themeName = 'light', features = [], window = defaultWindow, }: AppProviderProps) { useEffect( function updateRootThemeDataAttribute() { const rootElement = window.document.documentElement // TODO: Change data attribute constant to import from bezier-tokens rootElement.setAttribute('data-bezier-theme', themeName) return function cleanup() { rootElement.removeAttribute('data-bezier-theme') } }, [window, themeName] ) return ( {children} ) }