-
-
Save thebinaryfelix/6f85a9ec7cad11accb71f22d8e2edfec to your computer and use it in GitHub Desktop.
export interface IProviderComposerProps extends React.PropsWithChildren { | |
/** | |
* Providers list | |
* */ | |
with: React.FC<React.PropsWithChildren>[] | |
} | |
const ComposerFragment: React.FC<React.PropsWithChildren> = ({ | |
children, | |
}): JSX.Element => <>{children}</> | |
const providerReducer = | |
( | |
ParentProvider: React.FC<React.PropsWithChildren>, | |
ChildProvider: React.FC<React.PropsWithChildren>, | |
) => | |
({ children }: React.PropsWithChildren) => | |
( | |
<ParentProvider> | |
<ChildProvider>{children}</ChildProvider> | |
</ParentProvider> | |
) | |
/** | |
* @Component | |
* @name ProviderComposer | |
* @description Component that receives a list of providers and composes them to a single component. | |
*/ | |
export const ProviderComposer = (props: IProviderComposerProps) => { | |
const ComposedProviders = props.with.reduce(providerReducer, ComposerFragment) | |
return <ComposedProviders>{props.children}</ComposedProviders> | |
} |
Nice, but how can I put some providers that has props ?
<MantineProvider theme={{ primaryColor: 'blue', fontFamily: 'Inter VP' }} withGlobalStyles withNormalizeCSS withCSSVariables >
?
@carlosrziegler you can create a component such as:
const MyProvider = ({ children }) => (
<MantineProvider
theme={{ primaryColor: 'blue', fontFamily: 'Inter VP' }}
withGlobalStyles
withNormalizeCSS
withCSSVariables
>
{children}
</MantineProvider>)
And then use that in the ProviderComposer.
<ProviderComposer with={[MyProvider]} />
As long as your component receives children
and pass it along, you can even include complex logic inside the providers.
@thebinaryfelix do you stack them in order of dependency to each?
@t1amat9409 yes, because the order matters. In the example above, the FirstProvider
should be placed in the first position of the array.
@thebinaryfelix nice! this is awesome!!
πππ
how to solve ESLint Component definition is missing display name?
I changed on named functions syntax for now
const providerReducer = (
ParentProvider: React.FC<React.PropsWithChildren>,
ChildProvider: React.FC<React.PropsWithChildren>,
) =>
function providerReducerInner({ children }: React.PropsWithChildren) {
return (
<ParentProvider>
<ChildProvider>{children}</ChildProvider>
</ParentProvider>
);
};
How to use
Instead of nesting providers like this:
Use the
ProviderComposer
to make it cleaner: