woocommerce/plugins/woocommerce-admin/client/launch-your-store/settings/components/confirmation-modal.jsx

117 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* External dependencies
*/
import React from 'react';
import { Button, Modal } from '@wordpress/components';
import { useState, useEffect } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
/**
* Internal dependencies
*/
import './confirmation-modal.scss';
/**
* Confirmation modal for the site visibility settings.
*
* @return {React.ReactNode} The confirmation modal component.
*/
export const ConfirmationModal = ( {
formRef,
saveButtonRef,
currentSetting,
} ) => {
const [ pendingSubmitEvent, setPendingSubmitEvent ] = useState( null );
const [ isConfirmModalOpen, setIsConfirmModalOpen ] = useState( false );
const currentComingSoon = currentSetting?.woocommerce_coming_soon ?? 'no';
// Hooks into settings' "mainform" to show a confirmation modal when the form is submitted.
useEffect( () => {
const form = formRef.current;
const handleFormSubmit = ( event ) => {
const formData = new FormData( form );
// Only block submission when switching to coming soon mode from live.
if (
currentComingSoon === 'no' &&
formData.get( 'woocommerce_coming_soon' ) === 'yes'
) {
event.preventDefault();
setIsConfirmModalOpen( true );
setPendingSubmitEvent( event );
}
};
if ( form ) {
form.addEventListener( 'submit', handleFormSubmit );
}
return () => {
if ( form ) {
form.removeEventListener( 'submit', handleFormSubmit );
}
};
}, [ currentSetting, formRef ] );
const cancelSubmit = () => {
setPendingSubmitEvent( null ); // Clear the pending submit
setIsConfirmModalOpen( false ); // Close the modal
if ( saveButtonRef.current ) {
saveButtonRef.current.classList.remove( 'is-busy' );
}
};
const confirmSubmit = () => {
if ( pendingSubmitEvent ) {
// WooCommerce checks for the "save" input.
if ( saveButtonRef.current && formRef.current ) {
const hiddenInput = document.createElement( 'input' );
hiddenInput.type = 'hidden';
hiddenInput.name = saveButtonRef.current.name || 'save';
hiddenInput.value =
saveButtonRef.current.value ||
__( 'Save changes', 'woocommerce' );
formRef.current.appendChild( hiddenInput );
}
pendingSubmitEvent.target.submit();
setPendingSubmitEvent( null );
}
setIsConfirmModalOpen( false ); // Close the modal
};
return isConfirmModalOpen ? (
<Modal
title={ __(
'Confirm switch to Coming soon mode',
'woocommerce'
) }
onRequestClose={ cancelSubmit }
size="medium"
className="site-visibility-settings-confirmation-modal"
>
<div className="site-visibility-settings-confirmation-modal__content">
{ __(
'Are you sure you want to switch from live to coming soon mode? Your site will not be visible, and customers wont be able to make purchases during this time.',
'woocommerce'
) }
</div>
<div className="divider-container">
<hr />
</div>
<div className="site-visibility-settings-confirmation-modal__buttons">
<Button
variant="primary"
isBusy={ false }
onClick={ confirmSubmit }
>
{ __( 'Switch', 'woocommerce' ) }
</Button>
<Button variant="tertiary" onClick={ cancelSubmit }>
{ __( 'Cancel', 'woocommerce' ) }
</Button>
</div>
</Modal>
) : null;
};