import React, {ComponentType} from 'react';
import hoistStatics from 'hoist-non-react-statics';
export type ReactComponent
= ComponentType
;
export type ComponentClass = React.ComponentClass;
export type WrappingFunction = (
Component: ReactComponent,
) => ReactComponent;
export default function compose(
...wrappingFunctions: WrappingFunction[]
) {
return function wrapComponent(
OriginalComponent: ReactComponent & C,
): ReactComponent & C {
let result: ReactComponent;
if (wrappingFunctions.length === 0) {
result = OriginalComponent;
} else {
result = wrappingFunctions.reduce(
(wrappingFunctionA, wrappingFunctionB) => {
return (WrappingComponent: ReactComponent) =>
wrappingFunctionA(wrappingFunctionB(WrappingComponent));
},
)(OriginalComponent);
}
return hoistStatics(
result as ComponentClass,
OriginalComponent as ComponentClass,
) as ReactComponent & C;
};
}