-
Notifications
You must be signed in to change notification settings - Fork 3k
/
Copy pathcreateOnyxContext.js
50 lines (43 loc) · 1.6 KB
/
createOnyxContext.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import React, {createContext} from 'react';
import PropTypes from 'prop-types';
import {withOnyx} from 'react-native-onyx';
import Str from 'expensify-common/lib/str';
import getComponentDisplayName from '../libs/getComponentDisplayName';
const propTypes = {
/** Rendered child component */
children: PropTypes.node.isRequired,
};
export default (onyxKeyName) => {
const Context = createContext();
const Provider = props => (
<Context.Provider value={props[onyxKeyName]}>
{props.children}
</Context.Provider>
);
Provider.propTypes = propTypes;
Provider.displayName = `${Str.UCFirst(onyxKeyName)}Provider`;
const ProviderWithOnyx = withOnyx({
[onyxKeyName]: {
key: onyxKeyName,
},
})(Provider);
const withOnyxKey = ({propName = onyxKeyName, transformValue = () => {}} = {}) => (WrappedComponent) => {
const Consumer = props => (
<Context.Consumer>
{(value) => {
const propsToPass = {
...props,
[propName]: transformValue ? transformValue(value, props) : value,
};
return (
// eslint-disable-next-line react/jsx-props-no-spreading
<WrappedComponent {...propsToPass} />
);
}}
</Context.Consumer>
);
Consumer.displayName = `with${Str.UCFirst(onyxKeyName)}(${getComponentDisplayName(WrappedComponent)})`;
return Consumer;
};
return [withOnyxKey, ProviderWithOnyx];
};