You've already forked wc-licensed-product
Fix license generation and checkout domain field bugs
- 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>
This commit is contained in:
100
assets/js/checkout-blocks.js
Normal file
100
assets/js/checkout-blocks.js
Normal file
@@ -0,0 +1,100 @@
|
||||
/**
|
||||
* 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,
|
||||
});
|
||||
})();
|
||||
Reference in New Issue
Block a user