import { Fragment } from 'react' import { injectIntl, FormattedMessage, defineMessages } from 'react-intl' import classNames from 'classnames/bind' import { openModal } from '../../actions/modal' import { cancelReplyCompose } from '../../actions/compose' const messages = defineMessages({ confirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, delete: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' }, }) const mapStateToProps = state => ({ composeId: state.getIn(['compose', 'id']), composeText: state.getIn(['compose', 'text']), }) const mapDispatchToProps = (dispatch) => ({ onOpenModal(type, opts) { dispatch(openModal(type, opts)) }, onCancelReplyCompose() { dispatch(cancelReplyCompose()) }, }) const cx = classNames.bind(_s) export default @connect(mapStateToProps, mapDispatchToProps) @injectIntl class ModalBase extends PureComponent { static propTypes = { children: PropTypes.node, onClose: PropTypes.func.isRequired, onOpenModal: PropTypes.func.isRequired, onCancelReplyCompose: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, composeId: PropTypes.string, composeText: PropTypes.string, type: PropTypes.string, } state = { revealed: !!this.props.children, } activeElement = this.state.revealed ? document.activeElement : null handleKeyUp = (e) => { if ((e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27) && !!this.props.children) { this.handleOnClose() } } handleOnClose = () => { const { onOpenModal, composeText, composeId, onClose, intl, type, onCancelReplyCompose } = this.props if (!composeId && composeText && type == 'COMPOSE') { onOpenModal('CONFIRM', { message: intl.formatMessage(messages.delete), confirm: intl.formatMessage(messages.confirm), onConfirm: () => onCancelReplyCompose(), onCancel: () => onOpenModal('COMPOSE'), }) } else { onClose() } } componentDidMount () { window.addEventListener('keyup', this.handleKeyUp, false) } componentWillReceiveProps (nextProps) { if (!!nextProps.children && !this.props.children) { this.activeElement = document.activeElement this.getSiblings().forEach(sibling => sibling.setAttribute('inert', true)) } else if (!nextProps.children) { this.setState({ revealed: false }) } if (!nextProps.children && !!this.props.children) { this.activeElement.focus() this.activeElement = null } } componentDidUpdate (prevProps) { if (!this.props.children && !!prevProps.children) { this.getSiblings().forEach(sibling => sibling.removeAttribute('inert')) } if (this.props.children) { requestAnimationFrame(() => { this.setState({ revealed: true }) }) } } componentWillUnmount () { window.removeEventListener('keyup', this.handleKeyUp) } getSiblings = () => { return Array(...this.node.parentElement.childNodes).filter(node => node !== this.node) } setRef = ref => { this.node = ref } render () { const { children } = this.props const visible = !!children const containerClasses = cx({ default: 1, z4: 1, height100PC: visible, width100PC: visible, displayNone: !visible, }) return (
{ !!visible &&
{children}
}
) } }