mirror of
https://github.com/woocommerce/woocommerce-paypal-payments.git
synced 2025-09-04 08:47:23 +08:00
142 lines
3.9 KiB
JavaScript
142 lines
3.9 KiB
JavaScript
import { createElement, createRoot } from '@wordpress/element';
|
|
import { Watermark, WatermarkManager } from '../Watermark';
|
|
|
|
// Object to store references to the watermark container and root
|
|
const watermarkReference = {
|
|
container: null,
|
|
root: null,
|
|
};
|
|
|
|
/**
|
|
* Creates a container for the watermark in the checkout contact information block.
|
|
*/
|
|
export const createWatermarkContainer = () => {
|
|
const textInputContainer = document.querySelector(
|
|
'.wp-block-woocommerce-checkout-contact-information-block .wc-block-components-text-input'
|
|
);
|
|
|
|
if ( textInputContainer && ! watermarkReference.container ) {
|
|
const emailInput =
|
|
textInputContainer.querySelector( 'input[id="email"]' );
|
|
|
|
if ( emailInput ) {
|
|
// Create watermark container
|
|
watermarkReference.container = document.createElement( 'div' );
|
|
watermarkReference.container.setAttribute(
|
|
'class',
|
|
'wc-block-checkout-axo-block-watermark-container'
|
|
);
|
|
|
|
const emailButton = textInputContainer.querySelector(
|
|
'.wc-block-axo-email-submit-button-container'
|
|
);
|
|
|
|
// Insert the watermark after the "Continue" button or email input
|
|
const insertAfterElement = emailButton || emailInput;
|
|
|
|
insertAfterElement.parentNode.insertBefore(
|
|
watermarkReference.container,
|
|
insertAfterElement.nextSibling
|
|
);
|
|
|
|
// Create a root for the watermark
|
|
watermarkReference.root = createRoot(
|
|
watermarkReference.container
|
|
);
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Sets up the watermark manager component.
|
|
*
|
|
* @param {Object} fastlaneSdk - The Fastlane SDK instance.
|
|
* @return {Function} Cleanup function to remove the watermark.
|
|
*/
|
|
export const setupWatermark = ( fastlaneSdk ) => {
|
|
const container = document.createElement( 'div' );
|
|
document.body.appendChild( container );
|
|
const root = createRoot( container );
|
|
root.render( createElement( WatermarkManager, { fastlaneSdk } ) );
|
|
|
|
// Return cleanup function
|
|
return () => {
|
|
root.unmount();
|
|
if ( container && container.parentNode ) {
|
|
container.parentNode.removeChild( container );
|
|
}
|
|
};
|
|
};
|
|
|
|
/**
|
|
* Removes the watermark from the DOM and resets the reference.
|
|
*/
|
|
export const removeWatermark = () => {
|
|
if ( watermarkReference.root ) {
|
|
watermarkReference.root.unmount();
|
|
}
|
|
if ( watermarkReference.container ) {
|
|
if ( watermarkReference.container.parentNode ) {
|
|
watermarkReference.container.parentNode.removeChild(
|
|
watermarkReference.container
|
|
);
|
|
} else {
|
|
// Fallback removal if parent node is not available
|
|
const detachedContainer = document.querySelector(
|
|
'.wc-block-checkout-axo-block-watermark-container'
|
|
);
|
|
if ( detachedContainer ) {
|
|
detachedContainer.remove();
|
|
}
|
|
}
|
|
}
|
|
// Reset watermark reference
|
|
Object.assign( watermarkReference, { container: null, root: null } );
|
|
};
|
|
|
|
/**
|
|
* Renders content in the watermark container.
|
|
*
|
|
* @param {ReactElement} content - The content to render.
|
|
*/
|
|
export const renderWatermarkContent = ( content ) => {
|
|
if ( watermarkReference.root ) {
|
|
watermarkReference.root.render( content );
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Updates the watermark content based on the current state.
|
|
*
|
|
* @param {Object} params - State parameters.
|
|
* @param {boolean} params.isAxoActive - Whether AXO is active.
|
|
* @param {boolean} params.isAxoScriptLoaded - Whether AXO script is loaded.
|
|
* @param {Object} params.fastlaneSdk - The Fastlane SDK instance.
|
|
*/
|
|
export const updateWatermarkContent = ( {
|
|
isAxoActive,
|
|
isAxoScriptLoaded,
|
|
fastlaneSdk,
|
|
} ) => {
|
|
if ( ! isAxoActive && ! isAxoScriptLoaded ) {
|
|
// Show loading spinner
|
|
renderWatermarkContent(
|
|
createElement( 'span', {
|
|
className: 'wc-block-components-spinner',
|
|
'aria-hidden': 'true',
|
|
} )
|
|
);
|
|
} else if ( isAxoActive ) {
|
|
// Show Fastlane watermark
|
|
renderWatermarkContent(
|
|
createElement( Watermark, {
|
|
fastlaneSdk,
|
|
name: 'fastlane-watermark-email',
|
|
includeAdditionalInfo: true,
|
|
} )
|
|
);
|
|
} else {
|
|
// Clear watermark content
|
|
renderWatermarkContent( null );
|
|
}
|
|
};
|