Skip to content

Instantly share code, notes, and snippets.

@brunos3d
Last active December 31, 2022 16:03
Show Gist options
  • Save brunos3d/30fdcbd9b006a9021a81dd3c07debf44 to your computer and use it in GitHub Desktop.
Save brunos3d/30fdcbd9b006a9021a81dd3c07debf44 to your computer and use it in GitHub Desktop.
import { ComponentProps, JSXElementConstructor } from 'react';
export const provider = <C extends JSXElementConstructor<unknown>>(
provider: C,
props: Partial<ComponentProps<C>> = {}
) => [provider, props];
export const ProviderComposer = ({ providers, children }) => {
for (let i = providers.length - 1; i >= 0; --i) {
const [Provider, props] = providers[i];
children = <Provider {...props}>{children}</Provider>;
}
return children;
};

Usage

image

const Providers = ({ children }) => (
  <ProviderComposer
    providers={[
      provider(GoogleTagManager),
      provider(StylesProvider, { injectFirst: true }),
      provider(MUIThemeProvider, { theme: theme }),
    ]}
  >
    {children}
  </ProviderComposer>
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment