An open API service indexing awesome lists of open source software.

https://github.com/sevenoutman/compose-providers

Compose your React provider components to avoid boilerplates.
https://github.com/sevenoutman/compose-providers

react

Last synced: 5 months ago
JSON representation

Compose your React provider components to avoid boilerplates.

Awesome Lists containing this project

README

          

# compose-providers

Compose your React provider components to avoid boilerplates.

[![npm version](https://badgen.net/npm/v/compose-providers)](https://npm.im/compose-providers) [![npm downloads](https://badgen.net/npm/dm/compose-providers)](https://npm.im/compose-providers)

## Install

```bash
npm i compose-providers
```

## Usage

Assume you're using serveral libraries that requires using their provider components like:

- react-error-boundary
- react-intl
- react-query
- react-router

and you have to nest them around your app to get everything work

```jsx
render(



{/** your app */}


,
)
```

With `compose-providers` you can compose those providers into one component so that you get rid of all those boilerplates.

```jsx
import { composeProviders } from "compose-providers"

const AppContainer = composeProviders([
ErrorBoundary,
// You won't be unfamiliar if you have configured tools like babel/eslint
[
QueryClientProvider,
{
client: queryClient,
},
],
[
IntlProvider,
{
locale,
messages,
},
],
BrowserRouter,
])

render({/** your app */})
```

This is especiall useful when you are writing tests and need to combine different providers as wrappers to get your component work:

```jsx
// RouteComponent.test.tsx
import { render } from "@testing-library/react"

// const wrapper = (props) => (
//
// {props.children}
//
// )

const wrapper = composeProviders([QueryClientProvider, BrowserRouter])

render(, {
wrapper,
})

// IntlComponent.test.tsx
import { render } from "@testing-library/react"

// const wrapper = (props) => (
//
// {props.children}
//
// )

const wrapper = composeProviders([QueryClientProvider, IntlProvider])

render(, {
wrapper,
})
```

## License

MIT © [SevenOutman](https://github.com/SevenOutman)