import {useEffect, useState} from '@wordpress/element'; import {__} from '@wordpress/i18n'; import IframeResizer from 'iframe-resizer-react'; import {Button, Dialog, Modal, ModalOverlay} from 'react-aria-components'; import ModalCloseIcon from './ModalClose'; import {Spinner} from '@wordpress/components'; import './styles.scss'; import '../EntitySelector/styles/index.scss'; import {FocusScope} from 'react-aria'; /** * @unreleasaed */ type ModalFormProps = { dataSrc: string; embedId: string; buttonText: string; isFormRedirect: boolean; formViewUrl: string; }; /** * @unreleasaed */ export default function ModalForm({dataSrc, embedId, buttonText, isFormRedirect, formViewUrl}: ModalFormProps) { const [dataSrcUrl, setDataSrcUrl] = useState(dataSrc); const [isOpen, setIsOpen] = useState(isFormRedirect); const [isLoading, setLoading] = useState(false); const [isEntering, setEntering] = useState(false); useEffect(() => { const handleEscape = (event: KeyboardEvent) => { if (event.key === 'Escape' && isOpen) { closeModal(); } }; document.addEventListener('keydown', handleEscape); return () => { document.removeEventListener('keydown', handleEscape); }; }, [isOpen]); // Preload the iframe document useEffect(() => { const selector = `link[rel="preload"][href="${dataSrcUrl}"][as="document"]`; const existingLink = document.querySelector(selector); if (!existingLink) { const link = document.createElement('link'); link.rel = 'preload'; link.href = dataSrcUrl; link.as = 'document'; document.head.appendChild(link); } return () => { const addedLink = document.querySelector(selector); if (addedLink) { document.head.removeChild(addedLink); } }; }, [dataSrcUrl]); useEffect(() => { if (isEntering && !isLoading) { resetEntering(); } }, [isEntering, isLoading]); // Offline gateways like Stripe refresh the page and need to programmatically // open the confirmation page from the modal. const resetDataSrcUrl = () => { if (!isOpen && isFormRedirect) { setDataSrcUrl(formViewUrl); } }; const openModal = () => { setEntering(true); setIsOpen(true); setLoading(true); resetDataSrcUrl(); }; const closeModal = () => { setIsOpen(false); setLoading(false); resetDataSrcUrl(); }; const resetEntering = () => { setTimeout(() => { setEntering(false); }, 2000); }; return ( <>
{ iframe.iFrameResizer.resize(); setLoading(false); }} />
); }