Skip to Content

ComposeContextProvider

Exports Size
loading...
Gzip Size
loading...
Brotli Size
Source Code
View on GitHub
Docs
Edit this page

Compose multiple React context providers together.

Usage

src/context.tsx
'use client'; import { createContextState } from 'foxact/context-state'; import { SWRConfig } from 'swr'; const [SidebarActiveProvider, useSidebarActive, useSetSidebarActive] = createContextState(); const [AuthTokenProvider, useAuthToken, useSetAuthToken] = createContextState(false); const MySWRProvider = ({ config, children }: React.PropsWithChildren<{ config: any }>) => { return ( <SWRConfig value={{ refreshInterval: 3000, ...config }} > <Dashboard /> </SWRConfig> ); } export { SidebarActiveProvider, useSidebarActive, useSetSidebarActive, AuthTokenProvider, useAuthToken, useSetAuthToken, MySWRProvider };

Normally, to use multiple context providers, you would have to nest them like this:

src/app/layout.tsx
import { cookies } from 'next/headers' import { SidebarActiveProvider, AuthTokenProvider, MySWRProvider } from 'src/context'; export default async function RootLayout({ children }) { return ( <html> <head /> <body> <SidebarActiveProvider initialState={await cookie().get('sidebar-active') === 'true'}> <AuthTokenProvider> {/** provider nesting hell */} <MySWRProvider config={{ fetcher }}> {children} </MySWRProvider> </AuthTokenProvider> </SidebarActiveProvider> </body> </html> ); }

With <ComposeContextProvider /> you can do this:

src/app/layout.tsx
import { SidebarActiveProvider, AuthTokenProvider, MySWRProvider } from 'src/context'; import { ComposeContextProvider } from 'foxact/compose-context-provider'; const contexts = [ <SidebarActiveProvider />, <AuthTokenProvider />, // You can also pass prop to the composed providers <MySWRProvider config={{ fetcher }} /> ]; export default function RootLayout({ children }) { return ( <html> <head /> <body> {/** composed providers */} <ComposeContextProvider contexts={contexts}> {children} </ComposeContextProvider> </body> </html> ); }