You've already forked wc-licensed-product
- Add WooCommerce Checkout Blocks support for domain field - Create CheckoutBlocksIntegration for block-based checkout - Create StoreApiExtension for Store API domain handling - Add checkout-blocks.js for frontend domain field in blocks - Fix LicenseManager product type check in generateLicense() - Add multiple order status hooks for reliable license generation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
101 lines
3.3 KiB
JavaScript
101 lines
3.3 KiB
JavaScript
/**
|
|
* WooCommerce Checkout Blocks Integration
|
|
*
|
|
* Adds a domain field to the checkout block for licensed products.
|
|
*
|
|
* @package WcLicensedProduct
|
|
*/
|
|
|
|
(function () {
|
|
'use strict';
|
|
|
|
const { registerCheckoutBlock } = wc.blocksCheckout;
|
|
const { createElement, useState, useEffect } = wp.element;
|
|
const { TextControl } = wp.components;
|
|
const { __ } = wp.i18n;
|
|
const { extensionCartUpdate } = wc.blocksCheckout;
|
|
const { getSetting } = wc.wcSettings;
|
|
|
|
// Get settings passed from PHP
|
|
const settings = getSetting('wc-licensed-product_data', {});
|
|
|
|
/**
|
|
* Validate domain format
|
|
*/
|
|
function isValidDomain(domain) {
|
|
if (!domain || domain.length > 255) {
|
|
return false;
|
|
}
|
|
const pattern = /^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/;
|
|
return pattern.test(domain);
|
|
}
|
|
|
|
/**
|
|
* Normalize domain (remove protocol and www)
|
|
*/
|
|
function normalizeDomain(domain) {
|
|
let normalized = domain.toLowerCase().trim();
|
|
normalized = normalized.replace(/^https?:\/\//, '');
|
|
normalized = normalized.replace(/^www\./, '');
|
|
normalized = normalized.replace(/\/.*$/, '');
|
|
return normalized;
|
|
}
|
|
|
|
/**
|
|
* License Domain Block Component
|
|
*/
|
|
const LicenseDomainBlock = ({ checkoutExtensionData, extensions }) => {
|
|
const [domain, setDomain] = useState('');
|
|
const [error, setError] = useState('');
|
|
const { setExtensionData } = checkoutExtensionData;
|
|
|
|
// Only show if cart has licensed products
|
|
if (!settings.hasLicensedProducts) {
|
|
return null;
|
|
}
|
|
|
|
const handleChange = (value) => {
|
|
const normalized = normalizeDomain(value);
|
|
setDomain(normalized);
|
|
|
|
// Validate
|
|
if (normalized && !isValidDomain(normalized)) {
|
|
setError(settings.validationError || __('Please enter a valid domain.', 'wc-licensed-product'));
|
|
} else {
|
|
setError('');
|
|
}
|
|
|
|
// Update extension data for server-side processing
|
|
setExtensionData('wc-licensed-product', 'licensed_product_domain', normalized);
|
|
};
|
|
|
|
return createElement(
|
|
'div',
|
|
{ className: 'wc-block-components-licensed-product-domain' },
|
|
createElement(
|
|
'h3',
|
|
{ className: 'wc-block-components-title' },
|
|
settings.sectionTitle || __('License Domain', 'wc-licensed-product')
|
|
),
|
|
createElement(TextControl, {
|
|
label: settings.fieldLabel || __('Domain for License Activation', 'wc-licensed-product'),
|
|
value: domain,
|
|
onChange: handleChange,
|
|
placeholder: settings.fieldPlaceholder || 'example.com',
|
|
help: error || settings.fieldDescription || __('Enter the domain where you will use this license.', 'wc-licensed-product'),
|
|
className: error ? 'has-error' : '',
|
|
required: true,
|
|
})
|
|
);
|
|
};
|
|
|
|
// Register the checkout block
|
|
registerCheckoutBlock({
|
|
metadata: {
|
|
name: 'wc-licensed-product/domain-field',
|
|
parent: ['woocommerce/checkout-contact-information-block'],
|
|
},
|
|
component: LicenseDomainBlock,
|
|
});
|
|
})();
|