/** * Validates the email input and handles error display. * * @returns True if the email is valid, otherwise false. */ const accessibleDocsFormValidation = (): boolean => { // Email validation regex const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; const emailInput = document.querySelector('.js-accessible-docs-email'); const errorElement = document.querySelector('.js-accessible-docs-popup-error'); if (!emailInput || !errorElement) { console.warn('Email input or error element is not found.'); return false; } if (!emailInput || !emailRegex.test(emailInput.value.trim())) { errorElement.style.display = 'block'; return false; } // If valid, hide the error errorElement.style.display = 'none'; return true; }; /** * Sends a request for accessible documents. * * @param {string} email - The email address of the requester. * @param {string} href - The URL of the document being requested. * @returns {Promise} A promise that resolves to: * - `error` if the request fails. * - `in-process` if the file request is being processed. * - `completed` if the file request is successful. */ const sendAccessibleDocsRequest = async (email: string, href: string): Promise => { try { const formData = new FormData(); formData.append('action', 'accessible_docs_request'); // @ts-ignore formData.append('nonce', accessible_docs_object.nonce); formData.append('email', email); formData.append('url', href); // @ts-ignore const response = await fetch(accessible_docs_object.ajax_url, { method: 'POST', body: formData }); if (!response.ok) { accessibleDocsUpdatePopupStatus('error'); throw new Error(`Response status: ${response.status}`); } const result = await response.json(); if (!result.success) { accessibleDocsUpdatePopupStatus('error'); throw new Error(`Error: ${result.data.error}`); } if (result.data.status) { return result.data.status; } return 'success'; // Ensure a return value for all cases } catch (error) { accessibleDocsUpdatePopupStatus('error'); throw new Error(`Error: ${error}`); } }; /** * Updates the status of the accessible documents popup. * * @param {string} status - The status to be added as a CSS class. Allowed values: 'success', 'error', 'in_process'. */ const accessibleDocsUpdatePopupStatus = (status?: string): void => { const loader = document.querySelector('.js-accessible-docs-popup-loader'); if (!status) { throw new Error('Status parameter is required.'); } const popup = document.querySelector('.js-accessible-docs-popup'); if (!popup) { throw new Error('Accessible docs popup element not found.'); } // Only add the class if it's not already present if (!popup.classList.contains(status)) { popup.classList.add(status); } if (loader) { loader.classList.remove('active'); } }; /** * Handles the submit button logic for the accessible docs popup form. */ const handleSubmitAccessibleDocs = async () => { const emailInput = document.querySelector('.js-accessible-docs-email'); const linkElement = document.querySelector('.js-accessible-docs-link'); const loader = document.querySelector('.js-accessible-docs-popup-loader'); // Validate the email and handle error display const isValid = accessibleDocsFormValidation(); if ( isValid && emailInput && linkElement ) { const email = emailInput.value.trim(); const href = linkElement.href; if (loader) { loader.classList.add('active'); } const requestStatus = await sendAccessibleDocsRequest(email, href); if (requestStatus) { accessibleDocsUpdatePopupStatus(requestStatus); } if (loader) { loader.classList.remove('active'); } } } export default handleSubmitAccessibleDocs;