All files / src/Modal ModalPortal.js

0% Statements 0/30
0% Branches 0/10
0% Functions 0/2
0% Lines 0/30

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56                                                                                                               
import React, { Component } from 'preact';
import PropTypes from 'prop-types';
import { StyledModalWrapper } from './styles';
 
/**
 * Modal Portal Component
 */
class ModalPortal extends Component {
    constructor(props) {
        super(props);
        this.portal = null;
    }
    componentDidMount() {
        let portal =
            this.props.portalId && document.getElementById(this.props.portalId);
        if (!portal) {
            portal = document.createElement('div');
            portal.id = this.props.portalId;
            portal.style.position = 'fixed';
            portal.style[this.props.position] = '0';
            portal.style.top = '0';
            portal.style.left = '0';
            portal.style.width = '100vw';
            portal.style.height = '100vh';
            portal.style.overflow = 'hidden';
            portal.style.display = 'flex';
            portal.style.alignItems = 'center';
            portal.style.justifyContent = 'center';
            portal.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';
            document.body.appendChild(portal);
        }
        this.portal = portal;
        this.componentDidUpdate();
    }
    componentWillUnmount() {
        const element = document.getElementById(this.props.portalId);
        if (element) {
            document.body.removeChild(this.portal);
        }
    }
    componentDidUpdate() {
        if (!this.props.children.length) {
            return;
        }
        React.render(
            <StyledModalWrapper {...this.props}>
                {this.props.children}
            </StyledModalWrapper>,
            this.portal
        );
    }
    render = () => null;
}
 
export default ModalPortal;