UNPKG

2.35 kBJavaScriptView Raw
1// @flow
2
3import * as React from 'react';
4import type { Node } from 'react';
5
6import Modal from 'react-responsive-modal';
7import { qrcode } from 'qrcode.es'; // eslint-disable-line import/no-unresolved
8
9import './adsumQrCode.css';
10
11type PropsType = {|
12 isOpen: boolean,
13 onClose?: () => null,
14 text?: string,
15 qrCodeOptions?: Object,
16 ModalProps?: Object,
17 qrCodeCSS?: CSSStyleDeclaration
18|};
19
20class AdsumQrCode extends React.Component<PropsType> {
21 static defaultProps = {
22 onClose: () => null,
23 text: '',
24 qrCodeOptions: {},
25 ModalProps: {},
26 qrCodeCSS: {},
27 };
28
29 state = {
30 showModal: false,
31 };
32
33 qrCode = null;
34
35 componentDidUpdate(prevProps: PropsType) {
36 const { isOpen, text, qrCodeOptions } = this.props;
37
38 if (!prevProps.isOpen && isOpen) {
39 const element = document.getElementById('qrCode');
40 // eslint-disable-next-line new-cap
41 this.qrCode = new qrcode(element);
42
43 this.qrCode.generate(text, qrCodeOptions)
44 .then(() => {
45 this.setState({
46 showModal: true,
47 });
48 });
49 } else if (prevProps.isOpen && !isOpen) {
50 this.qrCode = null;
51 // eslint-disable-next-line react/no-did-update-set-state
52 this.setState({
53 showModal: false,
54 });
55 }
56 }
57
58 render(): Node {
59 const {
60 isOpen, onClose, ModalProps, qrCodeCSS,
61 } = this.props;
62
63 const { showModal } = this.state;
64
65 const hideModalCSS = {
66 overlay: 'hide',
67 };
68
69 let { classNames, showCloseIcon } = ModalProps;
70 if (!showModal) {
71 classNames = hideModalCSS;
72 }
73
74 if (!showCloseIcon) {
75 showCloseIcon = false;
76 }
77
78 return (
79 <div className="qrCodeWrapper">
80 <Modal
81 {...ModalProps}
82 open={isOpen}
83 onClose={onClose}
84 showCloseIcon={showCloseIcon}
85 classNames={classNames}
86 >
87 <canvas id="qrCode" style={qrCodeCSS} />
88 </Modal>
89 </div>
90 );
91 }
92}
93
94export default AdsumQrCode;