Skip to content

Commit 02f1ce6

Browse files
committed
HOContext creator added, config updated to split bundles for tree shaking support, README updated.
1 parent c5b7494 commit 02f1ce6

File tree

9 files changed

+388
-59
lines changed

9 files changed

+388
-59
lines changed

.babelrc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"presets": ["@babel/preset-env"]
3-
}
2+
"presets": ["@babel/preset-env", "@babel/preset-react"],
3+
}

README.md

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,30 +17,21 @@ yarn add create-use-context
1717
## Usage
1818

1919
```javascript
20-
import React, { useState } from 'react';
20+
import React, { Component, useState } from 'react';
2121

22-
import createUseContext from 'create-use-context';
22+
import { createUseContext, createWithContext } from 'create-use-context';
2323

24-
const [
25-
MyContext,
26-
MyContextProvider,
27-
MyContextConsumer,
28-
useMyContext,
29-
] = createUseContext((Provider) => ({ children }) => {
24+
const {
25+
Context: MyContext,
26+
ContextProvider: MyContextProvider,
27+
ContextConsumer: MyContextConsumer,
28+
useContext: useMyContext,
29+
} = createUseContext((Provider) => ({ children }) => {
3030
const [counter, setCounter] = useState(0);
3131

3232
return <Provider value={{ counter, setCounter }}>{children}</Provider>;
3333
});
3434

35-
function App() {
36-
return (
37-
<MyContextProvider>
38-
<ComponentWithHook />
39-
<ComponentWithConsumer />
40-
</MyContextProvider>
41-
);
42-
}
43-
4435
function ComponentWithHook() {
4536
const { counter, setCounter } = useMyContext();
4637

@@ -71,5 +62,40 @@ function ComponentWithConsumer() {
7162
);
7263
}
7364

65+
// You might also need a High Order Component to wrap your class Components
66+
// if you don't line Render Prop pattern with a Consumer Component.
67+
68+
// So you can use `createWithContext` helper function:
69+
70+
const withMyContext = createWithContext(MyContext, 'my');
71+
72+
class ClassComponent extends Component {
73+
render() {
74+
const { counter, setCounter } = this.props.my;
75+
76+
return (
77+
<button
78+
onClick={() => {
79+
setCounter(counter + 1);
80+
}}
81+
>
82+
{counter} - add one
83+
</button>
84+
);
85+
}
86+
}
87+
88+
const ClassCompoenntWithHOC = withMyContext(ClassComponent);
89+
90+
function App() {
91+
return (
92+
<MyContextProvider>
93+
<ComponentWithHook />
94+
<ComponentWithConsumer />
95+
<ClassCompoenntWithHOC />
96+
</MyContextProvider>
97+
);
98+
}
99+
74100
export default App;
75101
```

package.json

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
{
22
"name": "create-use-context",
3-
"version": "0.0.3",
3+
"version": "1.0.0",
44
"description": "A helper method which wraps original React `createContext` method and provides additional functionality like wrapping a `Context.Provider`, `useContext` helper, etc.",
55
"repository": {
66
"type": "git",
77
"url": "https://github.com/todesstoss/create-use-context.git"
88
},
9-
"main": "dist/create-use-context.cjs.js",
10-
"module": "dist/create-use-context.esm.js",
11-
"browser": "dist/create-use-context.umd.js",
9+
"main": "dist/cjs/index.js",
10+
"module": "dist/esm/index.js",
11+
"browser": "dist/umd/index.js",
1212
"scripts": {
1313
"build": "rollup -c",
1414
"dev": "rollup -c -w",
@@ -21,18 +21,28 @@
2121
"createContext"
2222
],
2323
"files": [
24-
"/dist"
24+
"dist/cjs/*",
25+
"dist/esm/*",
26+
"dist/umd/*"
2527
],
2628
"author": "Eugene Mickhnitskyy",
2729
"license": "MIT",
2830
"devDependencies": {
2931
"@babel/core": "^7.4.5",
3032
"@babel/preset-env": "^7.4.5",
33+
"@babel/preset-react": "^7.0.0",
3134
"prettier": "^1.17.1",
3235
"rollup": "^1.12.3",
33-
"rollup-plugin-babel": "^4.3.2"
36+
"rollup-plugin-babel": "^4.3.2",
37+
"rollup-plugin-commonjs": "^10.0.0",
38+
"rollup-plugin-node-resolve": "^5.0.0",
39+
"rollup-plugin-terser": "^5.0.0"
3440
},
3541
"peerDependencies": {
42+
"hoist-non-react-statics": "^3.3.0",
3643
"react": "^16.8.0"
44+
},
45+
"dependencies": {
46+
"react-display-name": "^0.2.4"
3747
}
3848
}

rollup.config.js

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,57 @@
1-
import pkg from './package.json';
21
import babel from 'rollup-plugin-babel';
2+
import jsx from 'rollup-plugin-jsx';
3+
import resolve from 'rollup-plugin-node-resolve';
4+
import commonjs from 'rollup-plugin-commonjs';
5+
import { terser } from 'rollup-plugin-terser';
36

47
export default [
58
// browser-friendly UMD build
69
{
10+
input: 'src/index.js',
711
plugins: [
12+
resolve(),
813
babel({
9-
exclude: 'node_modules/**'
10-
})
14+
exclude: 'node_modules/**',
15+
}),
16+
commonjs(),
17+
terser(),
1118
],
12-
input: 'src/index.js',
13-
external: ['react'],
1419
output: {
15-
name: 'create-use-context',
16-
file: pkg.browser,
20+
exports: 'named',
21+
name: 'createUseContext',
22+
file: 'dist/umd/index.js',
1723
format: 'umd',
24+
esModule: false,
25+
globals: {
26+
react: 'React',
27+
'hoist-non-react-statics': 'HoistNonReactStatics',
28+
},
1829
},
30+
external: ['react', 'hoist-non-react-statics'],
1931
},
2032
// CommonJS (for Node) and ES module (for bundlers) build.
2133
{
34+
input: {
35+
index: 'src/index.js',
36+
'create-use-context': 'src/createUseContext.js',
37+
'create-with-context': 'src/createWithContext.js',
38+
},
2239
plugins: [
2340
babel({
24-
exclude: 'node_modules/**'
25-
})
41+
exclude: 'node_modules/**',
42+
}),
2643
],
27-
input: 'src/index.js',
28-
external: ['react'],
2944
output: [
30-
{ file: pkg.main, format: 'cjs' },
31-
{ file: pkg.module, format: 'es' },
45+
{
46+
exports: 'named',
47+
dir: 'dist/cjs',
48+
format: 'cjs',
49+
},
50+
{
51+
dir: 'dist/esm',
52+
format: 'esm',
53+
},
3254
],
55+
external: ['react', 'hoist-non-react-statics', 'react-display-name'],
3356
},
3457
];

src/createUseContext.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import React from 'react';
2+
3+
export default function createUseContext(contextProviderWrapperCreator) {
4+
const Context = React.createContext();
5+
const useContext = () => React.useContext(Context);
6+
let ContextProvider;
7+
8+
if (typeof contextProviderWrapperCreator === 'function') {
9+
ContextProvider = contextProviderWrapperCreator(Context.Provider);
10+
} else {
11+
ContextProvider = Context.Provider;
12+
}
13+
14+
return {
15+
Context,
16+
ContextProvider,
17+
ContextConsumer: Context.Consumer,
18+
useContext,
19+
};
20+
}

src/createWithContext.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import React from 'react';
2+
import getDisplayName from 'react-display-name';
3+
import hoistStatics from 'hoist-non-react-statics';
4+
5+
import capitalize from './lib/capitalize';
6+
7+
export default function createWithContext(Context, name) {
8+
return function withContext(ComposedComponent) {
9+
const WithContextWrapper = (props) => {
10+
return (
11+
<ComposedComponent
12+
{...{ [name]: React.useContext(Context) }}
13+
{...props}
14+
/>
15+
);
16+
};
17+
18+
WithContextWrapper.displayName = `with${capitalize(
19+
name
20+
)}Context(${getDisplayName(ComposedComponent)})`;
21+
22+
return hoistStatics(WithContextWrapper, ComposedComponent);
23+
};
24+
}

src/index.js

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,2 @@
1-
import React from 'react';
2-
3-
export default function createUseContext(contextProviderWrapperCreator) {
4-
const NewContext = React.createContext();
5-
const useNewContext = () => React.useContext(NewContext);
6-
let NewContextProvider;
7-
8-
if (typeof contextProviderWrapperCreator === 'function') {
9-
NewContextProvider = contextProviderWrapperCreator(NewContext.Provider);
10-
} else {
11-
NewContextProvider = NewContext.Provider;
12-
}
13-
14-
return [NewContext, NewContextProvider, NewContext.Consumer, useNewContext];
15-
}
1+
export { default as createUseContext } from './createUseContext';
2+
export { default as createWithContext } from './createWithContext';

src/lib/capitalize.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export default function capitalize(string) {
2+
string = string.toLowerCase();
3+
return string.charAt(0).toUpperCase() + string.substring(1);
4+
}

0 commit comments

Comments
 (0)