Skip to content
Snippets Groups Projects
withModal.js 2.67 KiB
Newer Older
import React from 'react'
import { omit } from 'lodash'
import { connect } from 'react-redux'
import { compose } from 'recompose'

import Modal from './Modal'
import { showModal, hideModal, setModalError } from '../redux/modal'

const mapState = state => ({
  modalsVisibility: omit(state.modal, 'props'),
  modalProps: state.modal.props,
const mapDispatch = modalKey => (dispatch, propss) => ({
  hideModal: () => dispatch(hideModal()),
  showModal: (modalProps = {}) => dispatch(showModal(modalKey, modalProps)),
  setModalError: errorMessage => dispatch(setModalError(errorMessage)),
const mapDispatch2 = (dispatch, props) => ({
  hideModal: () => dispatch(hideModal()),
Alexandru Munteanu's avatar
Alexandru Munteanu committed
  showModal: (modalProps = {}) => {
    console.log('showing modal dispatch', modalProps, props)
    dispatch(showModal(props.modalKey, modalProps))
  },
  setModalError: errorMessage => dispatch(setModalError(errorMessage)),
})

export const withModal2 = mapperFn => BaseComponent =>
  compose(connect(mapState, mapDispatch2))(baseProps => {
    const { modalComponent: Component, overlayColor } = mapperFn(baseProps)
    const {
      hideModal,
      modalProps,
      modalError,
      modalsVisibility,
      modalKey,
Alexandru Munteanu's avatar
Alexandru Munteanu committed
      showModal,
      ...rest
    } = baseProps
    return (
      <React.Fragment>
        {modalsVisibility[modalKey] && (
          <Modal
            {...modalProps}
            component={Component}
            hideModal={hideModal}
            modalError={modalError}
            overlayColor={overlayColor}
            setModalError={setModalError}
            showModal={showModal}
          />
        )}
        <BaseComponent
          hideModal={hideModal}
          setModalError={setModalError}
          showModal={showModal}
          {...rest}
        />
      </React.Fragment>
    )
  })

const withModal = ({
  modalComponent: Component,
  overlayColor,
}) => WrappedComponent =>
  connect(mapState, mapDispatch(modalKey))(
    ({
      modalsVisibility,
      modalProps,
      modalError,
      hideModal,
      showModal,
      setModalError,
      ...rest
    }) => (
        {modalsVisibility[modalKey] && (
          <Modal
            {...modalProps}
            component={Component}
            hideModal={hideModal}
            overlayColor={overlayColor}
            setModalError={setModalError}
            showModal={showModal}
        <WrappedComponent
          hideModal={hideModal}
          setModalError={setModalError}
          showModal={showModal}
          {...rest}
        />
    ),
  )

export default withModal