All files / app/ui/modal ModalTrigger.tsx

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 57 58 59 60 61 62 63 64 65 66 67 6883x                               83x 39x       39x   83x 39x     83x 2x     83x 51x 51x   51x                       39x 3x       3x         39x 1x       1x       83x  
import React, { Component, Fragment, MouseEventHandler, ReactNode } from 'react';
 
export interface ModalTriggerProps {
    children(props: { onClick: MouseEventHandler }): ReactNode;
    modal(props: ModalTriggerModalProps): ReactNode;
}
 
export interface ModalTriggerModalProps {
    isOpen: boolean;
    onRequestClose(): void;
}
 
export interface ModalTriggerState {
    isOpen: boolean;
}
 
export default class ModalTrigger extends Component<ModalTriggerProps, ModalTriggerState> {
    state = {
        isOpen: false,
    };
 
    private canHandleEvent: boolean = false;
 
    componentDidMount(): void {
        this.canHandleEvent = true;
    }
 
    componentWillUnmount(): void {
        this.canHandleEvent = false;
    }
 
    render() {
        const { children, modal } = this.props;
        const { isOpen } = this.state;
 
        return (
            <Fragment>
                { children({ onClick: this.handleOpen }) }
 
                { modal({
                    isOpen,
                    onRequestClose: this.handleClose,
                }) }
            </Fragment>
        );
    }
 
    private handleOpen: () => void = () => {
        Iif (!this.canHandleEvent) {
            return;
        }
 
        this.setState({
            isOpen: true,
        });
    };
 
    private handleClose: () => void = () => {
        Iif (!this.canHandleEvent) {
            return;
        }
 
        this.setState({
            isOpen: false,
        });
    };
}