Skip to content

Instantly share code, notes, and snippets.

@thebinaryfelix
Last active August 23, 2024 14:40
Show Gist options
  • Save thebinaryfelix/6f85a9ec7cad11accb71f22d8e2edfec to your computer and use it in GitHub Desktop.
Save thebinaryfelix/6f85a9ec7cad11accb71f22d8e2edfec to your computer and use it in GitHub Desktop.
Component for composing providers in React v18 with Typescript
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>
}
@thebinaryfelix
Copy link
Author

thebinaryfelix commented Nov 9, 2022

@t1amat9409 yes, because the order matters. In the example above, the FirstProvider should be placed in the first position of the array.

@t1amat9409
Copy link

@thebinaryfelix nice! this is awesome!!

@mncorreia
Copy link

🚀🚀🚀

@mmospanenko
Copy link

mmospanenko commented May 30, 2024

how to solve ESLint Component definition is missing display name?

I changed on named functions syntax for now
image

const providerReducer = (
  ParentProvider: React.FC<React.PropsWithChildren>,
  ChildProvider: React.FC<React.PropsWithChildren>,
) =>
  function providerReducerInner({ children }: React.PropsWithChildren) {
    return (
      <ParentProvider>
        <ChildProvider>{children}</ChildProvider>
      </ParentProvider>
    );
  };

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment