PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.33.3
GiveWP – Donation Plugin and Fundraising Platform v2.33.3
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Views / Components / Modal / index.js
give / src / Views / Components / Modal Last commit date
index.js 4 years ago styles.module.scss 4 years ago
index.js
168 lines
1 import {useEffect, useCallback} from 'react';
2 import PropTypes from 'prop-types';
3 import classNames from 'classnames';
4 import LoadingOverlay from '@givewp/components/LoadingOverlay';
5
6 import styles from './styles.module.scss';
7
8 import {__} from '@wordpress/i18n';
9
10 const Modal = ({visible, type, children, isLoading, handleClose, ...rest}) => {
11 const closeModal = useCallback((event) => {
12 if (event.keyCode === 27 && typeof handleClose === 'function') {
13 handleClose();
14 }
15 }, []);
16
17 useEffect(() => {
18 document.addEventListener('keydown', closeModal, false);
19
20 return () => {
21 document.removeEventListener('keydown', closeModal, false);
22 };
23 }, []);
24
25 const handleOverlayClick = (e) => {
26 if (e.target.classList.contains(styles.overlay) && typeof handleClose === 'function') {
27 handleClose();
28 }
29 };
30
31 const modalStyles = classNames({
32 [styles.modal]: true,
33 [styles.error]: type === 'error' || type === 'failed',
34 [styles.warning]: type === 'warning',
35 [styles.success]: type === 'success',
36 [styles.http]: type === 'http',
37 });
38
39 return (
40 <div className={classNames({[styles.overlay]: visible})} onClick={handleOverlayClick} {...rest}>
41 <div className={styles.container}>
42 <div className={modalStyles}>
43 {isLoading && <LoadingOverlay spinnerSize="small" />}
44 <div className={styles.content}>{children}</div>
45 </div>
46 </div>
47 </div>
48 );
49 };
50
51 Modal.Title = ({children, ...rest}) => {
52 return (
53 <div className={styles.title} {...rest}>
54 {children}
55 </div>
56 );
57 };
58
59 Modal.CloseIcon = ({onClick, ...rest}) => {
60 return (
61 <div className={styles.closeIconContainer}>
62 <div className={styles.close} onClick={onClick} {...rest}>
63 <span className="dashicons dashicons-no" />
64 </div>
65 </div>
66 );
67 };
68
69 Modal.Section = ({title, content, ...rest}) => {
70 return (
71 <div className={styles.section} {...rest}>
72 <strong>{title}:</strong>
73 {content}
74 </div>
75 );
76 };
77
78 Modal.Content = ({children, align, ...rest}) => {
79 const contentClasses = classNames({
80 [styles.innerContent]: true,
81 [styles.textCenter]: align === 'center',
82 [styles.textRight]: align === 'right',
83 [styles.textLeft]: !align || align === 'left',
84 });
85
86 return (
87 <div className={contentClasses} {...rest}>
88 {children}
89 </div>
90 );
91 };
92
93 Modal.AdditionalContext = ({type, context, ...rest}) => {
94 const title = ['error', 'failed'].includes(type) ? __('Error details', 'give') : __('Additional context', 'give');
95
96 return (
97 <div className={styles.section} {...rest}>
98 <strong>{title}:</strong>
99 <div className={styles.errorDetailsContainer}>
100 <pre>
101 {context instanceof Object
102 ? Object.entries(context).map(([key, value]) => {
103 return (
104 <div key={key}>
105 <span>{key}:</span>
106 {value}
107 </div>
108 );
109 })
110 : context}
111 </pre>
112 </div>
113 </div>
114 );
115 };
116
117 Modal.propTypes = {
118 // Is visible
119 visible: PropTypes.bool.isRequired,
120 // Is loading
121 isLoading: PropTypes.bool,
122 // Modal type
123 type: PropTypes.string,
124 // Collection of react DOM elements
125 children: PropTypes.arrayOf(PropTypes.object),
126 // Handle close callback
127 handleClose: PropTypes.func,
128 };
129
130 Modal.Title.propTypes = {
131 // Collection of react DOM elements
132 children: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.object)]),
133 };
134
135 Modal.CloseIcon.propTypes = {
136 // On click callback
137 onClick: PropTypes.func.isRequired,
138 };
139
140 Modal.Section.propTypes = {
141 // Section title
142 title: PropTypes.string.isRequired,
143 // Section content
144 content: PropTypes.string.isRequired,
145 };
146
147 Modal.Content.propTypes = {
148 // Collection of react DOM elements
149 children: PropTypes.object,
150 };
151
152 Modal.AdditionalContext.propTypes = {
153 // Log type
154 type: PropTypes.string.isRequired,
155 // String or Array of objects
156 context: PropTypes.any.isRequired,
157 };
158
159 Modal.defaultProps = {
160 visible: true,
161 isLoading: false,
162 type: 'notice',
163 children: {},
164 handleClose: () => {},
165 };
166
167 export default Modal;
168