Skip to content

Commit 21e8b6e

Browse files
committed
Use HoC approach for both class- and stateless-style components
1 parent e1b4a3d commit 21e8b6e

File tree

6 files changed

+75
-209
lines changed

6 files changed

+75
-209
lines changed

src/extendReactClass.js

Lines changed: 0 additions & 50 deletions
This file was deleted.

src/index.js

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,24 @@
11
import _ from 'lodash';
2-
import extendReactClass from './extendReactClass';
3-
import wrapStatelessFunction from './wrapStatelessFunction';
2+
import wrapComponent from './wrapComponent';
43

54
/**
65
* @see https://github.com/gajus/react-css-modules#options
76
*/
87
type OptionsType = {};
98

10-
/**
11-
* Determines if the given object has the signature of a class that inherits React.Component.
12-
*/
13-
const isReactComponent = (maybeReactComponent: any): boolean => {
14-
return 'prototype' in maybeReactComponent && _.isFunction(maybeReactComponent.prototype.render);
15-
};
16-
179
/**
1810
* When used as a function.
1911
*/
2012
const functionConstructor = (Component: Function, defaultStyles: Object, options: OptionsType): Function => {
21-
let decoratedClass;
22-
23-
if (isReactComponent(Component)) {
24-
decoratedClass = extendReactClass(Component, defaultStyles, options);
25-
} else {
26-
decoratedClass = wrapStatelessFunction(Component, defaultStyles, options);
27-
}
13+
let WrappedComponent = wrapComponent(Component, defaultStyles, options);
2814

2915
if (Component.displayName) {
30-
decoratedClass.displayName = Component.displayName;
16+
WrappedComponent.displayName = Component.displayName;
3117
} else {
32-
decoratedClass.displayName = Component.name;
18+
WrappedComponent.displayName = Component.name;
3319
}
3420

35-
return decoratedClass;
21+
return WrappedComponent;
3622
};
3723

3824
/**

src/isIterable.js

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/linkClass.js

Lines changed: 0 additions & 75 deletions
This file was deleted.

src/wrapComponent.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/* eslint-disable react/prop-types */
2+
3+
import generateAppendClassName from './generateAppendClassName';
4+
import hoistNonReactStatics from 'hoist-non-react-statics';
5+
import makeConfiguration from './makeConfiguration';
6+
import parseStyleName from './parseStyleName';
7+
import React, {Children} from 'react';
8+
9+
/**
10+
* @param {ReactElement} element
11+
* @param {Object} styles
12+
* @param {Object} options
13+
* @returns {ReactElement}
14+
*/
15+
function updateProps(element: Object, styles: Object, options: Object) {
16+
if (element == null || typeof element !== 'object') {
17+
return element;
18+
}
19+
let {styleName, className, children} = element.props;
20+
let didUpdate = false;
21+
if (styleName != null) {
22+
let styleNames = parseStyleName(styleName, options.allowMultiple);
23+
let appendClassName = generateAppendClassName(styles, styleNames, options.errorWhenNotFound);
24+
className = className ? className + ' ' + appendClassName : appendClassName;
25+
didUpdate = true;
26+
}
27+
if (children != null) {
28+
let newChildren = [];
29+
let didUpdateChildren = true;
30+
Children.forEach(children, (child) => {
31+
let newChild = updateProps(child, styles, options);
32+
newChildren.push(newChild);
33+
if (newChild !== child) {
34+
didUpdateChildren = true;
35+
}
36+
});
37+
if (didUpdateChildren) {
38+
children = newChildren;
39+
didUpdate = true;
40+
}
41+
}
42+
if (didUpdate) {
43+
let props = {...element.props, className, children};
44+
return {...element, props};
45+
} else {
46+
return element;
47+
}
48+
}
49+
50+
/**
51+
* @param {Function} Component
52+
* @param {Object} defaultStyles
53+
* @param {Object} options
54+
* @returns {ReactClass}
55+
*/
56+
export default function wrapComponent(Component: Function, defaultStyles: Object = {}, options: Object = {}) {
57+
class WrappedComponent extends React.Component {
58+
render() {
59+
let {props} = this;
60+
let {styles} = props;
61+
if (styles == null) {
62+
styles = defaultStyles;
63+
props = {...props, styles};
64+
}
65+
let element = React.createElement(Component, props);
66+
return updateProps(element, styles, makeConfiguration(options));
67+
}
68+
}
69+
return hoistNonReactStatics(WrappedComponent, Component);
70+
}

src/wrapStatelessFunction.js

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)