PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.14.2
GiveWP – Donation Plugin and Fundraising Platform v4.14.2
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 / Campaigns / Blocks / shared / components / ModalForm / index.tsx
give / src / Campaigns / Blocks / shared / components / ModalForm Last commit date
ModalClose.tsx 1 year ago index.tsx 1 year ago styles.scss 4 months ago
index.tsx
174 lines
1 import {useEffect, useState} from '@wordpress/element';
2 import {__} from '@wordpress/i18n';
3 import IframeResizer from 'iframe-resizer-react';
4 import {Button, Dialog, Modal, ModalOverlay} from 'react-aria-components';
5 import ModalCloseIcon from './ModalClose';
6 import {Spinner} from '@wordpress/components';
7 import './styles.scss';
8 import '../EntitySelector/styles/index.scss';
9 import {FocusScope} from 'react-aria';
10
11 /**
12 * @unreleasaed
13 */
14 type ModalFormProps = {
15 dataSrc: string;
16 embedId: string;
17 buttonText: string;
18 isFormRedirect: boolean;
19 formViewUrl: string;
20 };
21
22 /**
23 * @unreleasaed
24 */
25 export default function ModalForm({dataSrc, embedId, buttonText, isFormRedirect, formViewUrl}: ModalFormProps) {
26 const [dataSrcUrl, setDataSrcUrl] = useState(dataSrc);
27 const [isOpen, setIsOpen] = useState<boolean>(isFormRedirect);
28 const [isLoading, setLoading] = useState<boolean>(false);
29 const [isEntering, setEntering] = useState<boolean>(false);
30
31 useEffect(() => {
32 const handleEscape = (event: KeyboardEvent) => {
33 if (event.key === 'Escape' && isOpen) {
34 closeModal();
35 }
36 };
37
38 document.addEventListener('keydown', handleEscape);
39 return () => {
40 document.removeEventListener('keydown', handleEscape);
41 };
42 }, [isOpen]);
43
44 // Preload the iframe document
45 useEffect(() => {
46 const selector = `link[rel="preload"][href="${dataSrcUrl}"][as="document"]`;
47
48 const existingLink = document.querySelector(selector);
49
50 if (!existingLink) {
51 const link = document.createElement('link');
52 link.rel = 'preload';
53 link.href = dataSrcUrl;
54 link.as = 'document';
55 document.head.appendChild(link);
56 }
57
58 return () => {
59 const addedLink = document.querySelector(selector);
60 if (addedLink) {
61 document.head.removeChild(addedLink);
62 }
63 };
64 }, [dataSrcUrl]);
65
66 useEffect(() => {
67 if (isEntering && !isLoading) {
68 resetEntering();
69 }
70 }, [isEntering, isLoading]);
71
72 // Offline gateways like Stripe refresh the page and need to programmatically
73 // open the confirmation page from the modal.
74 const resetDataSrcUrl = () => {
75 if (!isOpen && isFormRedirect) {
76 setDataSrcUrl(formViewUrl);
77 }
78 };
79
80 const openModal = () => {
81 setEntering(true);
82 setIsOpen(true);
83 setLoading(true);
84 resetDataSrcUrl();
85 };
86
87 const closeModal = () => {
88 setIsOpen(false);
89 setLoading(false);
90 resetDataSrcUrl();
91 };
92
93 const resetEntering = () => {
94 setTimeout(() => {
95 setEntering(false);
96 }, 2000);
97 };
98
99 return (
100 <>
101 <Button
102 type="button"
103 className="givewp-donation-form-modal__open"
104 onPress={openModal}
105 isPending={isLoading}
106 aria-label={isLoading ? __('Loading donation form', 'give') : __('Open donation form', 'give')}
107 >
108 {isLoading && (
109 <span className="givewp-donation-form-modal__open__spinner">
110 <Spinner
111 style={{margin: '0 auto', verticalAlign: 'middle'}}
112 aria-label={__('In progress', 'give')}
113 />
114 </span>
115 )}
116
117 <span style={{margin: '0', visibility: isLoading ? 'hidden' : 'visible'}} aria-hidden={isLoading}>
118 {buttonText}
119 </span>
120 </Button>
121
122 <ModalOverlay
123 className="givewp-donation-form-modal__overlay"
124 data-loading={isLoading}
125 isOpen={isOpen}
126 onOpenChange={setIsOpen}
127 isDismissable
128 isEntering={isEntering}
129 >
130 <Modal
131 className="givewp-donation-form-modal"
132 data-loading={isLoading}
133 >
134 <FocusScope contain restoreFocus autoFocus>
135 <Dialog
136 className="givewp-donation-form-modal__dialog"
137 aria-label={__('Donation Form', 'give')}
138 role="dialog"
139 aria-modal="true"
140 >
141 <button
142 aria-label={__('Close donation form', 'give')}
143 type="button"
144 className="givewp-donation-form-modal__close"
145 onClick={closeModal}
146 tabIndex={0}
147 >
148 <ModalCloseIcon />
149 </button>
150 <div className="givewp-donation-form-modal__dialog__content">
151 <IframeResizer
152 title={__('Donation Form', 'give')}
153 id={embedId}
154 src={dataSrcUrl}
155 checkOrigin={false}
156 heightCalculationMethod="taggedElement"
157 style={{
158 minWidth: '100%',
159 border: 'none',
160 }}
161 onInit={(iframe) => {
162 iframe.iFrameResizer.resize();
163 setLoading(false);
164 }}
165 />
166 </div>
167 </Dialog>
168 </FocusScope>
169 </Modal>
170 </ModalOverlay>
171 </>
172 );
173 }
174