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, modalError: state.modal.error, }) const mapDispatch = (dispatch, props) => ({ hideModal: () => dispatch(hideModal()), showModal: (modalProps = {}) => dispatch(showModal(props.modalKey, modalProps)), setModalError: errorMessage => dispatch(setModalError(errorMessage)), }) const withModal = mapperFn => BaseComponent => compose(connect(mapState, mapDispatch))(baseProps => { const { modalComponent: Component, overlayColor } = mapperFn(baseProps) const { modalKey, showModal, hideModal, modalProps, modalError, isFetching, setModalError, modalsVisibility, ...rest } = baseProps return ( <React.Fragment> {modalsVisibility[modalKey] && ( <Modal {...modalProps} component={Component} hideModal={hideModal} isFetching={isFetching} modalError={modalError} overlayColor={overlayColor} setModalError={setModalError} showModal={showModal} /> )} <BaseComponent hideModal={hideModal} setModalError={setModalError} showModal={showModal} {...rest} /> </React.Fragment> ) }) export default withModal