|
| 1 | +import React from 'react' |
| 2 | +import injectSheetDefault from 'react-jss' |
| 3 | +import { pure } from 'recompose' |
| 4 | + |
| 5 | + |
| 6 | +type StyledElementType = Function & { Tag: string, styles: Object } |
| 7 | + |
| 8 | + |
| 9 | +export const prepareStyled = (injectSheet: Function = injectSheetDefault) => |
| 10 | + ( |
| 11 | + Element: string | StyledElementType, |
| 12 | + styles: Object, |
| 13 | + baseStyles: ?Object = {}, |
| 14 | + ): StyledElementType => { |
| 15 | + const { |
| 16 | + Tag, |
| 17 | + styles: inheritStyles = {}, |
| 18 | + }: { |
| 19 | + Tag: string, |
| 20 | + styles?: Object |
| 21 | + } = typeof Element === 'string' ? { Tag: Element } : Element |
| 22 | + |
| 23 | + const elementStyles = { ...inheritStyles, ...styles } |
| 24 | + |
| 25 | + const StyledElement = pure( |
| 26 | + injectSheet({ [Tag]: elementStyles, ...baseStyles })(({ classes, children }) => |
| 27 | + <Tag className={classes[Tag]}> |
| 28 | + {children} |
| 29 | + </Tag>, |
| 30 | + ), |
| 31 | + ) |
| 32 | + |
| 33 | + return Object.assign(StyledElement, { Tag, styles: elementStyles }) |
| 34 | + } |
| 35 | + |
| 36 | +export const styled = prepareStyled() |
| 37 | + |
| 38 | +export const setStyledCreator = (styledFunction: Function = styled) => |
| 39 | + (baseStyles: Object) => Object.assign( |
| 40 | + (Element: string | StyledElementType, styles: Object) => |
| 41 | + styledFunction(Element, styles, baseStyles), |
| 42 | + { styles: baseStyles }, |
| 43 | + ) |
| 44 | + |
| 45 | +export default setStyledCreator() |
0 commit comments