Skip to content

Releases: xaviervia/react-dream

Add .defaultProps & .propTypes

30 Aug 22:12
Compare
Choose a tag to compare

defaultProps allows you to set the defaultProps of the wrapped React component.

const SubmitButton = Html.Button
  .defaultProps({ type: 'submit' })

propTypes sets the propTypes of the React component.

import PropTypes from 'prop-types'

const Title = Html.H1
  .style(({ highlighted }) => ({
    backgroundColor: highlighted ? 'yellow' : 'transparent'
  }))
  .propTypes({
    children: PropTypes.node,
    highlighted: PropTypes.bool
  })

Both rely on recompose higher-order components under the hood.

Use @hocs/with-log and @hocs/with-debugger for .log and .debug

19 Aug 23:14
Compare
Choose a tag to compare

Now .log and .debug are simply wrapping @hocs/with-log and @hocs/with-debugger .

This also means that they are safer to use, since they will become no-ops when NODE_ENV is production.

Add pointfree style support

13 Aug 14:50
Compare
Choose a tag to compare

Pointfree style provides a flexibility that chains don’t have. Now all of React Dream methods can be written pointfree by requiring the helper.

So now this:

const HeaderWrapper = Html.Header
  .contramap(omit(['clicked', 'updateClicked']))
  .style(({ clicked }) => ({
    backgroundColor: clicked ? 'red' : 'green',
    cursor: 'pointer',
    padding: 15,
  }))
  .name('HeaderWrapper')
  .map(
    withHandlers({
      onClick: ({ clicked, updateClicked }) => () => updateClicked(!clicked),
    })
  )
  .map(withState('clicked', 'updateClicked', false))

…can also be written as:

import {Html, map, name, style, contramap} from 'react-dream'

const HeaderWrapper = compose(
  map(withState('clicked', 'updateClicked', false)),
  map(
    withHandlers({
      onClick: ({ clicked, updateClicked }) => () => updateClicked(!clicked),
    })
  ),
  name('HeaderWrapper'),
  style(({ clicked }) => ({
    backgroundColor: clicked ? 'red' : 'green',
    cursor: 'pointer',
    padding: 15,
  })),
  contramap(omit(['clicked', 'updateClicked']))
)(Html.Header)

Add .rotate, .scale and .translate

10 Aug 21:52
Compare
Choose a tag to compare

Rotate

rotate sets up a style transform property with the specified rotation, in degrees. If there is a transform already, rotate will append to it:

const Title = Html.H1
  .rotate(props => 45)

render(
  <Title.Component style={{ transform: 'translateX(20px)' }} />,
  document.getElementById('root')
)

…will result in transform: 'translateX(20px) rotate(45deg)'

Just a reminder: rotations start from the top left edge as the axis, which is rarely what one wants. If you want the rotation to happen from the center, you can set transform-origin: 'center', that with ReactDream would be .style(props => ({transformOrigin: 'center'})).

Scale

scale sets up a style transform property with the specified scaling factor. If there is a transform already, scale will append to it:

const Title = Html.H1
  .scale(props => 1.5)

render(
  <Title.Component style={{ transform: 'translateX(20px)' }} />,
  document.getElementById('root')
)

…will result in transform: 'translateX(20px) scale(1.5)'

Translate

translate allows you to easily set up the transform style property with the specified displacement. If there is a transform already, translate will append to it:

const Title = Html.H1
  .translate(props => [30])
  .translate(props => [null, 30])
  .translate(props => [null, null, 30])

…will result in transform: 'translateZ(30px) translateY(30px) translateX(30px)'

Add Profunctor implementation

10 Aug 20:44
Compare
Choose a tag to compare

promap can be thought of as a shorthand for doing contramap and map at the same time. The first argument to it is the function that is going to be used to contramap and the second is the one to be used to map:

const Header = Html.Div
  .promap(
    ({title}) => ({children: title}),
    setDisplayName('Header')
  )

Add .log and .debug

06 Aug 19:55
Compare
Choose a tag to compare

.log(text) allows to easily log in the middle of a chain.

.debug() allows to inject a debugger statement in the middle of a chain.

Add .addProps and .removeProps

06 Aug 11:01
Compare
Choose a tag to compare

New wrappers for easily adding and removing props:

const Title = Html.H1
  .removeProps('label')
  .addProps(({ label }) => ({
    children: label
  }))