2024-09-06 03:21:27 +02:00
|
|
|
import { useCallback, useEffect, useState } from '@wordpress/element';
|
2024-09-05 21:17:36 +02:00
|
|
|
import { registerPaymentMethod } from '@woocommerce/blocks-registry';
|
|
|
|
|
|
|
|
import { loadPaypalScript } from '../../../ppcp-button/resources/js/modules/Helper/ScriptLoading';
|
|
|
|
|
|
|
|
// Hooks
|
|
|
|
import useAxoBlockManager from './hooks/useAxoBlockManager';
|
|
|
|
import { useCustomerData } from './hooks/useCustomerData';
|
|
|
|
|
|
|
|
// Components
|
|
|
|
import { Payment } from './components/Payment';
|
|
|
|
|
|
|
|
// Helpers
|
|
|
|
import { snapshotFields, restoreOriginalFields } from './helpers/fieldHelpers';
|
2024-09-06 11:33:01 +02:00
|
|
|
import { setupWatermark, removeWatermark } from './helpers/watermarkHelpers';
|
|
|
|
import { removeCardChangeButton } from './helpers/cardChangeButtonManager';
|
|
|
|
import { removeShippingChangeButton } from './helpers/shippingChangeButtonManager';
|
2024-09-05 21:17:36 +02:00
|
|
|
|
|
|
|
// Event handlers
|
|
|
|
import { onEmailSubmit } from './events/fastlaneEmailManager';
|
|
|
|
|
|
|
|
const ppcpConfig = wc.wcSettings.getSetting( 'ppcp-credit-card-gateway_data' );
|
|
|
|
|
|
|
|
if ( typeof window.PayPalCommerceGateway === 'undefined' ) {
|
|
|
|
window.PayPalCommerceGateway = ppcpConfig;
|
|
|
|
}
|
|
|
|
|
|
|
|
const axoConfig = window.wc_ppcp_axo;
|
|
|
|
|
|
|
|
const Axo = () => {
|
|
|
|
const [ paypalLoaded, setPaypalLoaded ] = useState( false );
|
|
|
|
const [ isGuest, setIsGuest ] = useState( true );
|
|
|
|
const [ shippingAddress, setShippingAddress ] = useState( null );
|
|
|
|
const [ card, setCard ] = useState( null );
|
|
|
|
const [ shouldIncludeAdditionalInfo, setShouldIncludeAdditionalInfo ] =
|
|
|
|
useState( true );
|
|
|
|
const fastlaneSdk = useAxoBlockManager( axoConfig, ppcpConfig );
|
|
|
|
|
|
|
|
// Access WooCommerce customer data
|
|
|
|
const {
|
|
|
|
shippingAddress: wooShippingAddress,
|
|
|
|
billingAddress: wooBillingAddress,
|
|
|
|
setShippingAddress: updateWooShippingAddress,
|
|
|
|
setBillingAddress: updateWooBillingAddress,
|
|
|
|
} = useCustomerData();
|
|
|
|
|
2024-09-06 11:33:01 +02:00
|
|
|
// Cleanup logic for Change buttons
|
2024-09-05 21:17:36 +02:00
|
|
|
useEffect( () => {
|
|
|
|
return () => {
|
2024-09-06 03:21:27 +02:00
|
|
|
removeShippingChangeButton();
|
2024-09-06 11:33:01 +02:00
|
|
|
removeCardChangeButton();
|
|
|
|
removeWatermark();
|
2024-09-06 03:21:27 +02:00
|
|
|
|
|
|
|
// Restore WooCommerce fields
|
2024-09-05 21:17:36 +02:00
|
|
|
restoreOriginalFields(
|
|
|
|
updateWooShippingAddress,
|
|
|
|
updateWooBillingAddress
|
2024-09-06 03:21:27 +02:00
|
|
|
);
|
2024-09-05 21:17:36 +02:00
|
|
|
};
|
2024-09-06 03:21:27 +02:00
|
|
|
}, [ updateWooShippingAddress, updateWooBillingAddress ] );
|
2024-09-05 21:17:36 +02:00
|
|
|
|
|
|
|
const {
|
|
|
|
setShippingAddress: setWooShippingAddress,
|
|
|
|
setBillingAddress: setWooBillingAddress,
|
|
|
|
} = useCustomerData();
|
|
|
|
|
|
|
|
useEffect( () => {
|
|
|
|
console.log( 'ppcpConfig', ppcpConfig );
|
2024-09-06 03:21:27 +02:00
|
|
|
if ( ! paypalLoaded ) {
|
|
|
|
loadPaypalScript( ppcpConfig, () => {
|
|
|
|
console.log( 'PayPal script loaded' );
|
|
|
|
setPaypalLoaded( true );
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
}, [ paypalLoaded, ppcpConfig ] );
|
2024-09-05 21:17:36 +02:00
|
|
|
|
|
|
|
useEffect( () => {
|
|
|
|
if ( paypalLoaded && fastlaneSdk ) {
|
|
|
|
console.log( 'Fastlane SDK and PayPal loaded' );
|
2024-09-06 11:33:01 +02:00
|
|
|
setupWatermark(
|
2024-09-05 21:17:36 +02:00
|
|
|
fastlaneSdk,
|
2024-09-06 11:33:01 +02:00
|
|
|
shouldIncludeAdditionalInfo,
|
|
|
|
async ( email ) => {
|
|
|
|
await onEmailSubmit(
|
|
|
|
email,
|
|
|
|
fastlaneSdk,
|
|
|
|
setIsGuest,
|
|
|
|
isGuest,
|
|
|
|
setShippingAddress,
|
|
|
|
setCard,
|
|
|
|
snapshotFields,
|
|
|
|
wooShippingAddress,
|
|
|
|
wooBillingAddress,
|
|
|
|
setWooShippingAddress,
|
|
|
|
setWooBillingAddress,
|
|
|
|
onChangeShippingAddressClick,
|
|
|
|
onChangeButtonClick,
|
|
|
|
shouldIncludeAdditionalInfo,
|
|
|
|
setShouldIncludeAdditionalInfo
|
|
|
|
);
|
|
|
|
}
|
2024-09-05 21:17:36 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
return () => {
|
2024-09-06 11:33:01 +02:00
|
|
|
removeWatermark();
|
2024-09-05 21:17:36 +02:00
|
|
|
};
|
|
|
|
}, [ paypalLoaded, fastlaneSdk, shouldIncludeAdditionalInfo ] );
|
|
|
|
|
2024-09-06 03:21:27 +02:00
|
|
|
const onChangeShippingAddressClick = useCallback( async () => {
|
|
|
|
// Updated
|
2024-09-05 21:17:36 +02:00
|
|
|
if ( fastlaneSdk ) {
|
|
|
|
const { selectionChanged, selectedAddress } =
|
|
|
|
await fastlaneSdk.profile.showShippingAddressSelector();
|
|
|
|
if ( selectionChanged ) {
|
|
|
|
setShippingAddress( selectedAddress );
|
|
|
|
console.log(
|
|
|
|
'Selected shipping address changed:',
|
|
|
|
selectedAddress
|
|
|
|
);
|
|
|
|
|
|
|
|
const { address, name, phoneNumber } = selectedAddress;
|
|
|
|
|
|
|
|
setWooShippingAddress( {
|
|
|
|
first_name: name.firstName,
|
|
|
|
last_name: name.lastName,
|
|
|
|
address_1: address.addressLine1,
|
|
|
|
address_2: address.addressLine2 || '',
|
|
|
|
city: address.adminArea2,
|
|
|
|
state: address.adminArea1,
|
|
|
|
postcode: address.postalCode,
|
|
|
|
country: address.countryCode,
|
|
|
|
phone: phoneNumber.nationalNumber,
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
}
|
2024-09-06 03:21:27 +02:00
|
|
|
}, [ fastlaneSdk, setWooShippingAddress ] );
|
2024-09-05 21:17:36 +02:00
|
|
|
|
2024-09-06 03:21:27 +02:00
|
|
|
const onChangeButtonClick = useCallback( async () => {
|
2024-09-05 21:17:36 +02:00
|
|
|
const { selectionChanged, selectedCard } =
|
|
|
|
await fastlaneSdk.profile.showCardSelector();
|
|
|
|
if ( selectionChanged ) {
|
|
|
|
setCard( selectedCard );
|
|
|
|
}
|
2024-09-06 03:21:27 +02:00
|
|
|
}, [ fastlaneSdk ] );
|
2024-09-05 21:17:36 +02:00
|
|
|
|
2024-09-06 03:21:27 +02:00
|
|
|
const handlePaymentLoad = useCallback(
|
|
|
|
( paymentComponent ) => {
|
|
|
|
console.log( 'Payment component loaded', paymentComponent );
|
|
|
|
},
|
|
|
|
[] // Empty dependency array to avoid re-creating the function on every render
|
|
|
|
);
|
2024-09-05 21:17:36 +02:00
|
|
|
|
|
|
|
const handleChange = ( selectedCard ) => {
|
|
|
|
console.log( 'Selected card changed', selectedCard );
|
|
|
|
setCard( selectedCard );
|
|
|
|
};
|
|
|
|
|
|
|
|
return fastlaneSdk ? (
|
|
|
|
<Payment
|
|
|
|
fastlaneSdk={ fastlaneSdk }
|
|
|
|
card={ card }
|
|
|
|
shippingAddress={ shippingAddress }
|
|
|
|
onChange={ handleChange }
|
2024-09-06 03:21:27 +02:00
|
|
|
isGuest={ isGuest }
|
2024-09-05 21:17:36 +02:00
|
|
|
onPaymentLoad={ handlePaymentLoad }
|
|
|
|
onChangeButtonClick={ onChangeButtonClick }
|
|
|
|
/>
|
|
|
|
) : (
|
|
|
|
<div>Loading Fastlane...</div>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
// Register the payment method
|
|
|
|
registerPaymentMethod( {
|
|
|
|
name: ppcpConfig.id,
|
|
|
|
label: (
|
|
|
|
<div
|
|
|
|
id="ppcp-axo-block-radio-label"
|
|
|
|
dangerouslySetInnerHTML={ { __html: ppcpConfig.title } }
|
|
|
|
/>
|
|
|
|
),
|
|
|
|
content: <Axo />,
|
|
|
|
edit: <h1>This is Axo Blocks in the editor</h1>,
|
|
|
|
ariaLabel: ppcpConfig.title,
|
|
|
|
canMakePayment: () => true,
|
|
|
|
supports: {
|
|
|
|
showSavedCards: true,
|
|
|
|
features: ppcpConfig.supports,
|
|
|
|
},
|
|
|
|
} );
|
|
|
|
|
|
|
|
export default Axo;
|