1 |
|
2 |
|
3 | import * as React from 'react';
|
4 | import type { Node } from 'react';
|
5 |
|
6 | import Modal from 'react-responsive-modal';
|
7 | import { qrcode } from 'qrcode.es';
|
8 |
|
9 | import './adsumQrCode.css';
|
10 |
|
11 | type PropsType = {|
|
12 | isOpen: boolean,
|
13 | onClose?: () => null,
|
14 | text?: string,
|
15 | qrCodeOptions?: Object,
|
16 | ModalProps?: Object,
|
17 | qrCodeCSS?: CSSStyleDeclaration
|
18 | |};
|
19 |
|
20 | class 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 |
|
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 |
|
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 |
|
94 | export default AdsumQrCode;
|