Skip to content

Instantly share code, notes, and snippets.

@sciotta
Forked from Luisgustavom1/ComposeProviders.tsx
Last active May 10, 2023 05:07
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save sciotta/58030949ba2e0259800893f4440ba607 to your computer and use it in GitHub Desktop.
Save sciotta/58030949ba2e0259800893f4440ba607 to your computer and use it in GitHub Desktop.
Compose React Providers to avoid too much chaining

Too gist is too resolve problem of chaining of many context providers

  <AuthProvider>
    <ThemeProvider>
        <LionessProvider>
            <ErrorProvider>
              <LoadingProvider>
                <Component />
              </LoadingProvider>
            </ErrorProvider>
        </LionessProvider>
    </ThemeProvider>
  </AuthProvider>

Solution

  <ComposeProviders
    with=[
       { component: AuthProvider },
       {  
         component: ThemeProvider,
         props: { 
           theme: { main: 'palevioletred' }
         }
       },
       { component: LionessProvider },
       { component: ErrorProvider },
       { component: LoadingProvider }
    ]
  >
    <Component />
  </ComposeProviders>
import React from 'react'
interface IProviderProps {
component: React.ElementType,
props?: Record<string, any>,
}
interface IComposeProvidersProps {
with: Array<IProviderProps>,
children: React.ReactNode,
}
const ComposeProviders = ({
with: Providers,
children,
}: IComposeProvidersProps): React.ReactElement => (
<React.Fragment>
{Providers.reduce(
(AccProviders, Provider) => (
<Provider.component {...Provider.props}>{AccProviders}</Provider.component>
),
children,
)}
</React.Fragment>
)
export default ComposeProviders;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment