All files / components/dialog DialogCmp.tsx

72.73% Statements 16/22
100% Branches 4/4
57.14% Functions 4/7
68.42% Lines 13/19
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                  2x     2x 2x   2x 2x 2x         2x           2x         2x 6x 2x 1x                 2x
import React from 'react';
import './DialogCmp.css';
 
interface DialogProps {
  title?: string;
  children?: any;
  [attrs: string]: any;
}
 
export default class Dialog extends React.PureComponent<DialogProps> {
 
  private dialogContainer: HTMLDivElement;
  private static cssClassOpen = 'scale-up';
  private static cssClassClosed = 'scale-out-center';
 
  public componentDidMount() {
    const parentElement = this.dialogContainer && this.dialogContainer.parentElement as HTMLElement;
    parentElement && parentElement.addEventListener('click', () => {
      this.hide(); // Hide dialog when click outside
    });
  }
 
  public show() {
    this.dialogContainer.style.display = 'flex';
    this.dialogContainer.classList.remove(Dialog.cssClassClosed);
    this.dialogContainer.classList.add(Dialog.cssClassOpen);
  }
 
  public hide() {
    this.dialogContainer.classList.remove(Dialog.cssClassOpen);
    this.dialogContainer.classList.add(Dialog.cssClassClosed);
  }
 
  public render() {
    const {title, children} = this.props;
    return (
      <div id="dialog-container" ref={ (dialogContainer: HTMLDivElement) => this.dialogContainer = dialogContainer }
        className="dialog-container">
          <div id="dialog-content" className="dialog-content">
            <div className="dialog-title">{ title }</div>
            { children }
          </div>
      </div>
    )
  }
}