diff --git a/packages/shared/core/styled-engine/emotion.js b/packages/shared/core/styled-engine/emotion.js index a68316bf3..6a0817cec 100644 --- a/packages/shared/core/styled-engine/emotion.js +++ b/packages/shared/core/styled-engine/emotion.js @@ -63,14 +63,14 @@ function patchStyledComponent(StyledComponent) { StyledComponent.withComponent = (component, options) => { // eslint-disable-next-line no-underscore-dangle const BaseComponent = StyledComponent.__emotion_base - return Object.assign( - patchStyledComponent( + return patchStyledComponent( + Object.assign( withComponent( props => , options, ), + StyledComponent, ), - StyledComponent, ) } diff --git a/packages/shared/core/styled-engine/util.js b/packages/shared/core/styled-engine/util.js index e7f8175a6..e714504cd 100644 --- a/packages/shared/core/styled-engine/util.js +++ b/packages/shared/core/styled-engine/util.js @@ -1,8 +1,31 @@ -function patchStyledComponent(StyledComponent, defaultAs) { - const { render } = StyledComponent - StyledComponent.withComponent = component => - patchStyledComponent({ ...StyledComponent }, component) - StyledComponent.render = ({ as = defaultAs, ...props }, ref) => +/* eslint-disable no-underscore-dangle */ +import React from 'react' + +function patchStyledComponent(StyledComponent) { + if (!StyledComponent.target.__smoothUIComponent) { + return StyledComponent + } + const { + render, + withComponent, + defaultProps, + propTypes, + componentStyle, + } = StyledComponent + StyledComponent.withComponent = (component, ...args) => { + const Target = StyledComponent.target + const NewTarget = props => + // eslint-disable-next-line no-underscore-dangle + NewTarget.__smoothUIComponent = true + return patchStyledComponent( + Object.assign(withComponent(NewTarget, ...args), { + defaultProps, + propTypes, + componentStyle, + }), + ) + } + StyledComponent.render = ({ as, ...props }, ref) => render({ forwardedAs: as, ...props }, ref) return StyledComponent } @@ -21,5 +44,7 @@ function wrapCreateStyledComponent(createStyledComponent) { } export function wrapStyled(styled) { - return component => wrapCreateStyledComponent(styled(component)) + const newStyled = component => wrapCreateStyledComponent(styled(component)) + Object.assign(newStyled, styled) + return newStyled } diff --git a/packages/shared/core/utils/createComponent.js b/packages/shared/core/utils/createComponent.js index 05f303732..a0ae8a92d 100644 --- a/packages/shared/core/utils/createComponent.js +++ b/packages/shared/core/utils/createComponent.js @@ -71,6 +71,9 @@ function createComponent(getConfig) { const RefComponent = React.forwardRef(forwardRef) RefComponent.displayName = InnerComponent.displayName + // eslint-disable-next-line no-underscore-dangle + RefComponent.__smoothUIComponent = true + const StyledComponent = styled(RefComponent)` ${style}; ${applySystem && applySystem(system)};