woocommerce-paypal-payments/modules/ppcp-applepay/resources/js/ApplepayManager.js

109 lines
2.7 KiB
JavaScript

import buttonModuleWatcher from '../../../ppcp-button/resources/js/modules/ButtonModuleWatcher';
import ApplePayButton from './ApplepayButton';
import ContextHandlerFactory from './Context/ContextHandlerFactory';
class ApplePayManager {
constructor( namespace, buttonConfig, ppcpConfig, buttonAttributes = {} ) {
this.namespace = namespace;
this.buttonConfig = buttonConfig;
this.ppcpConfig = ppcpConfig;
this.buttonAttributes = buttonAttributes;
this.applePayConfig = null;
this.transactionInfo = null;
this.contextHandler = null;
this.buttons = [];
buttonModuleWatcher.watchContextBootstrap( async ( bootstrap ) => {
this.contextHandler = ContextHandlerFactory.create(
bootstrap.context,
buttonConfig,
ppcpConfig,
bootstrap.handler
);
const button = ApplePayButton.createButton(
bootstrap.context,
bootstrap.handler,
buttonConfig,
ppcpConfig,
this.contextHandler,
this.buttonAttributes
);
this.buttons.push( button );
const initButton = () => {
button.configure(
this.applePayConfig,
this.transactionInfo,
this.buttonAttributes
);
button.init();
};
// Initialize button only if applePayConfig and transactionInfo are already fetched.
if ( this.applePayConfig && this.transactionInfo ) {
initButton();
} else {
// Ensure ApplePayConfig is loaded before proceeding.
await this.init();
if ( this.applePayConfig && this.transactionInfo ) {
initButton();
}
}
} );
}
async init() {
try {
if ( ! this.applePayConfig ) {
// Gets ApplePay configuration of the PayPal merchant.
this.applePayConfig = await window[ this.namespace ]
.Applepay()
.config();
}
if ( ! this.transactionInfo ) {
this.transactionInfo = await this.fetchTransactionInfo();
}
if ( ! this.applePayConfig ) {
console.error( 'No ApplePayConfig received during init' );
} else if ( ! this.transactionInfo ) {
console.error( 'No transactionInfo found during init' );
} else {
for ( const button of this.buttons ) {
button.configure(
this.applePayConfig,
this.transactionInfo,
this.buttonAttributes
);
button.init();
}
}
} catch ( error ) {
console.error( 'Error during initialization:', error );
}
}
async fetchTransactionInfo() {
try {
if ( ! this.contextHandler ) {
throw new Error( 'ContextHandler is not initialized' );
}
return await this.contextHandler.transactionInfo();
} catch ( error ) {
console.error( 'Error fetching transaction info:', error );
throw error;
}
}
reinit() {
for ( const button of this.buttons ) {
button.reinit();
}
}
}
export default ApplePayManager;