PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.15.0
GiveWP – Donation Plugin and Fundraising Platform v2.15.0
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 5 years ago styles.module.scss 5 years ago
index.js
172 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 const { __ } = wp.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 && (
44 <LoadingOverlay spinnerSize="small" />
45 ) }
46 <div className={ styles.content }>
47 { children }
48 </div>
49 </div>
50 </div>
51 </div>
52 );
53 };
54
55 Modal.Title = ( { children, ...rest } ) => {
56 return (
57 <div className={ styles.title } { ...rest }>
58 { children }
59 </div>
60 );
61 };
62
63 Modal.CloseIcon = ( { onClick, ...rest } ) => {
64 return (
65 <div className={ styles.closeIconContainer }>
66 <div className={ styles.close } onClick={ onClick } { ...rest }>
67 <span className="dashicons dashicons-no" />
68 </div>
69 </div>
70 );
71 };
72
73 Modal.Section = ( { title, content, ...rest } ) => {
74 return (
75 <div className={ styles.section } { ...rest }>
76 <strong>{ title }:</strong>
77 { content }
78 </div>
79 );
80 };
81
82 Modal.Content = ( { children, align, ...rest } ) => {
83 const contentClasses = classNames( {
84 [ styles.innerContent ]: true,
85 [ styles.textCenter ]: align === 'center',
86 [ styles.textRight ]: align === 'right',
87 [ styles.textLeft ]: ! align || align === 'left',
88 } );
89
90 return (
91 <div className={ contentClasses } { ...rest }>
92 { children }
93 </div>
94 );
95 };
96
97 Modal.AdditionalContext = ( { type, context, ...rest } ) => {
98 const title = ( [ 'error', 'failed' ].includes( type ) ) ? __( 'Error details', 'give' ) : __( 'Additional context', 'give' );
99
100 return (
101 <div className={ styles.section } { ...rest }>
102 <strong>{ title }:</strong>
103 <div className={ styles.errorDetailsContainer }>
104 <pre>
105 { ( context instanceof Object ) ? (
106 Object.entries( context ).map( ( [ key, value ] ) => {
107 return (
108 <div key={ key }>
109 <span>{ key }:</span>
110 { value }
111 </div>
112 );
113 } )
114 ) : context }
115 </pre>
116 </div>
117 </div>
118 );
119 };
120
121 Modal.propTypes = {
122 // Is visible
123 visible: PropTypes.bool.isRequired,
124 // Is loading
125 isLoading: PropTypes.bool,
126 // Modal type
127 type: PropTypes.string,
128 // Collection of react DOM elements
129 children: PropTypes.object,
130 // Handle close callback
131 handleClose: PropTypes.func,
132 };
133
134 Modal.Title.propTypes = {
135 // Collection of react DOM elements
136 children: PropTypes.object,
137 };
138
139 Modal.CloseIcon.propTypes = {
140 // On click callback
141 onClick: PropTypes.func.isRequired,
142 };
143
144 Modal.Section.propTypes = {
145 // Section title
146 title: PropTypes.string.isRequired,
147 // Section content
148 content: PropTypes.string.isRequired,
149 };
150
151 Modal.Content.propTypes = {
152 // Collection of react DOM elements
153 children: PropTypes.object,
154 };
155
156 Modal.AdditionalContext.propTypes = {
157 // Log type
158 type: PropTypes.string.isRequired,
159 // String or Array of objects
160 context: PropTypes.any.isRequired,
161 };
162
163 Modal.defaultProps = {
164 visible: true,
165 isLoading: false,
166 type: 'notice',
167 children: {},
168 handleClose: () => {},
169 };
170
171 export default Modal;
172