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