160 lines
3.8 KiB
TypeScript
160 lines
3.8 KiB
TypeScript
/**
|
|
* External dependencies
|
|
*/
|
|
import { __ } from '@wordpress/i18n';
|
|
import {
|
|
ProductStatus,
|
|
ProductType,
|
|
Product,
|
|
ProductDimensions,
|
|
} from '@woocommerce/data';
|
|
import type { FormErrors } from '@woocommerce/components';
|
|
import moment from 'moment';
|
|
|
|
const validateInventory = (
|
|
values: Partial< Product< ProductStatus, ProductType > >,
|
|
errors: FormErrors< typeof values >
|
|
) => {
|
|
const nextErrors = { ...errors };
|
|
|
|
if ( values.stock_quantity && values.stock_quantity < 0 ) {
|
|
nextErrors.stock_quantity = __(
|
|
'Stock quantity must be a positive number.',
|
|
'woocommerce'
|
|
);
|
|
}
|
|
|
|
if ( values.low_stock_amount && values.low_stock_amount < 0 ) {
|
|
nextErrors.low_stock_amount = __(
|
|
'Stock quantity must be a positive number.',
|
|
'woocommerce'
|
|
);
|
|
}
|
|
|
|
return nextErrors;
|
|
};
|
|
|
|
function validateScheduledSaleFields(
|
|
values: Partial< Product< ProductStatus, ProductType > >
|
|
): FormErrors< typeof values > {
|
|
const errors: FormErrors< typeof values > = {};
|
|
|
|
const dateOnSaleFrom = moment(
|
|
values.date_on_sale_from_gmt,
|
|
moment.ISO_8601,
|
|
true
|
|
);
|
|
const dateOnSaleTo = moment(
|
|
values.date_on_sale_to_gmt,
|
|
moment.ISO_8601,
|
|
true
|
|
);
|
|
|
|
if ( values.date_on_sale_from_gmt && ! dateOnSaleFrom.isValid() ) {
|
|
errors.date_on_sale_from_gmt = __(
|
|
'Please enter a valid date.',
|
|
'woocommerce'
|
|
);
|
|
}
|
|
|
|
if ( values.date_on_sale_to_gmt && ! dateOnSaleTo.isValid() ) {
|
|
errors.date_on_sale_to_gmt = __(
|
|
'Please enter a valid date.',
|
|
'woocommerce'
|
|
);
|
|
}
|
|
|
|
if ( dateOnSaleFrom.isAfter( dateOnSaleTo ) ) {
|
|
errors.date_on_sale_from_gmt = __(
|
|
'The start date of the sale must be before the end date.',
|
|
'woocommerce'
|
|
);
|
|
}
|
|
|
|
if ( dateOnSaleTo.isBefore( dateOnSaleFrom ) ) {
|
|
errors.date_on_sale_to_gmt = __(
|
|
'The end date of the sale must be after the start date.',
|
|
'woocommerce'
|
|
);
|
|
}
|
|
|
|
return errors;
|
|
}
|
|
|
|
export const validate = (
|
|
values: Partial< Product< ProductStatus, ProductType > >
|
|
) => {
|
|
let errors: FormErrors< typeof values > = {};
|
|
errors = validateInventory( values, errors );
|
|
|
|
if ( ! values.name?.length ) {
|
|
errors.name = __( 'This field is required.', 'woocommerce' );
|
|
}
|
|
|
|
if ( values.name && values.name.length > 120 ) {
|
|
errors.name = __(
|
|
'Please enter a product name shorter than 120 characters.',
|
|
'woocommerce'
|
|
);
|
|
}
|
|
|
|
if ( values.regular_price && ! /^[0-9.,]+$/.test( values.regular_price ) ) {
|
|
errors.regular_price = __(
|
|
'Please enter a price with one monetary decimal point without thousand separators and currency symbols.',
|
|
'woocommerce'
|
|
);
|
|
}
|
|
|
|
if ( values.sale_price && ! /^[0-9.,]+$/.test( values.sale_price ) ) {
|
|
errors.sale_price = __(
|
|
'Please enter a price with one monetary decimal point without thousand separators and currency symbols.',
|
|
'woocommerce'
|
|
);
|
|
}
|
|
|
|
if (
|
|
values.sale_price &&
|
|
( ! values.regular_price ||
|
|
parseFloat( values.sale_price ) >=
|
|
parseFloat( values?.regular_price ) )
|
|
) {
|
|
errors.sale_price = __(
|
|
'Sale price cannot be equal to or higher than list price.',
|
|
'woocommerce'
|
|
);
|
|
}
|
|
|
|
errors = {
|
|
...errors,
|
|
...validateScheduledSaleFields( values ),
|
|
};
|
|
|
|
if ( values.dimensions?.width && +values.dimensions.width <= 0 ) {
|
|
errors.dimensions = {
|
|
width: __( 'Width must be higher than zero.', 'woocommerce' ),
|
|
};
|
|
}
|
|
|
|
if ( values.dimensions?.length && +values.dimensions.length <= 0 ) {
|
|
errors.dimensions = {
|
|
...( ( errors.dimensions as FormErrors< ProductDimensions > ) ??
|
|
{} ),
|
|
length: __( 'Length must be higher than zero.', 'woocommerce' ),
|
|
};
|
|
}
|
|
|
|
if ( values.dimensions?.height && +values.dimensions.height <= 0 ) {
|
|
errors.dimensions = {
|
|
...( ( errors.dimensions as FormErrors< ProductDimensions > ) ??
|
|
{} ),
|
|
height: __( 'Height must be higher than zero.', 'woocommerce' ),
|
|
};
|
|
}
|
|
|
|
if ( values.weight && +values.weight <= 0 ) {
|
|
errors.weight = __( 'Weight must be higher than zero.', 'woocommerce' );
|
|
}
|
|
|
|
return errors;
|
|
};
|