Context

Lightweight wrapper React 16 context API

Demo

Install

yarn add @humblejs/context

Usage

import { Provider, withContext } from '@humblejs/context';

Provider

Provides the context using React 16 context API

import { Provider } from '@humblejs/context';

const App = () => (
  <Provider value={
    {
      name: 'Amrayn Web Services',
      productName: 'humblejs',
    }
  }>
    <MyComponent />
  </Provider>
);

withContext

Function to consume all the props provided by Provider

You can use this function in 3 different style, each one has its own benefit over other.

Simple

Simple mapping is where you map all the consumables in one-to-one fashion.

withContext(
  'name',
  'productName',
)

The props are available with same names, i.e, props.name and props.productName

For example

<div>Company name is {props.name}. Product: {props.productName}</div>

Mapped

You can map all the consumables with a custom name.

withContext(
  {
    'companyName': 'name',
  },
  'productName',
)

The name prop is available as companyName and productName is available as it is.

For example

<div>Company name is {props.companyName}. Product: {props.productName}</div>

Wrapped Object

You can map all the consumables in a separate wrapped object. Notice the object

withContext(
  {
    company: [
      'name',
      'productName',
    ],
  }
)

All the information is under object called company.

For example

<div>Company name is {props.company.name}. Product: {props.company.productName}</div>

Provider Nesting

There will be time when you require multiple contexts created in same file. You will have to create your custom context pair.

import Context from '@humblejs/context';

const { Provider: Context1Provider, withContext: withContext1 } = Context.createContext();
const { Provider: Context2Provider, withContext: withContext2 } = Context.createContext();

<Context1Provider value={
  {
    name: 'context1-name',
    age: 22,
  }
}>
  <Context2Provider value={
    {
      amount: 24.33,
    }
  }>
    <MyComponent />
  </Context2Provider>
</Context1Provider>
const MyComponent = props => (
  <div>
    <div>Name: {props.name}</div>
    <div>Age: {props.age}</div>
    <div>Amount: {props.amount}</div>
  </div>
);

export default flow( // flow from lodash
  withContext1(
    'name',
    'age',
  ),
  withContext2(
    'amount',
  ),
)(MyComponent);