File "block.js"
Full Path: /home/romayxjt/public_html/wp-content/plugins/orderable/inc/modules/checkout/blocks/order-date/src/js/block.js
File size: 4.42 KB
MIME-type: text/x-java
Charset: utf-8
/**
* External dependencies
*/
import { useEffect, useState } from '@wordpress/element';
import { SelectControl } from '@wordpress/components';
import { useSelect } from '@wordpress/data';
import { __ } from '@wordpress/i18n';
import { map, sortBy, filter, head, isEmpty } from 'lodash';
import { ValidationInputError } from '@woocommerce/blocks-components'; // eslint-disable-line import/no-unresolved
export const Block = ( { checkoutExtensionData, extensions, validation } ) => {
const { setExtensionData } = checkoutExtensionData;
const { getValidationError, setValidationErrors, clearValidationError } =
validation;
const serviceDates =
extensions?.[ 'orderable/order-service-date' ]?.serviceDates;
const serviceDatesLabel =
extensions?.[ 'orderable/order-service-date' ]?.serviceDatesLabel;
const serviceDate = useSelect( ( select ) => {
return select( 'wc/store/checkout' ).getExtensionData()?.[
'orderable/order-service-date'
]?.timestamp;
} );
const isShippingRateBeingSelected = useSelect( ( select ) =>
select( 'wc/store/cart' ).isShippingRateBeingSelected()
);
const isDisabled = useSelect(
( select ) => {
return (
isShippingRateBeingSelected ||
select( 'wc/store/cart' ).isCustomerDataUpdating()
);
},
[ isShippingRateBeingSelected ]
);
const hasShippingRates = useSelect( ( select ) => {
return ! isEmpty(
select( 'wc/store/cart' ).getShippingRates()?.[ 0 ]?.shipping_rates
);
} );
const shouldSelectFirstAvailableDateFromExtensions =
extensions?.[ 'orderable/order-service-date' ]
?.shouldSelectFirstAvailableDate;
const [
shouldSelectFirstAvailableDate,
setShouldSelectFirstAvailableDate,
] = useState( false );
const hasNoServiceDatesAvailable = getValidationError(
'orderable/order-service-date'
);
const hasNoServiceDateSelected = getValidationError(
'orderable/order-no-service-date-selected'
);
useEffect( () => {
if ( shouldSelectFirstAvailableDateFromExtensions ) {
setShouldSelectFirstAvailableDate( true );
}
}, [ shouldSelectFirstAvailableDateFromExtensions ] );
useEffect( () => {
if ( shouldSelectFirstAvailableDate && ! isDisabled ) {
const timestamp = head(
sortBy(
filter(
serviceDates,
( serviceDateItem ) =>
serviceDateItem?.value &&
serviceDateItem?.value !== 'asap'
),
[ 'value' ]
)
)?.value;
if ( ! timestamp ) {
return;
}
setExtensionData(
'orderable/order-service-date',
'timestamp',
`${ timestamp }`
);
setShouldSelectFirstAvailableDate( false );
}
}, [
shouldSelectFirstAvailableDate,
serviceDates,
isDisabled,
setExtensionData,
] );
useEffect( () => {
if ( ! serviceDates && hasShippingRates ) {
setValidationErrors( {
'orderable/order-service-date': {
message: __( 'No service dates available', 'orderable' ),
hidden: false,
},
} );
return;
}
clearValidationError( 'orderable/order-service-date' );
}, [
serviceDates,
setValidationErrors,
clearValidationError,
hasShippingRates,
] );
useEffect( () => {
if ( ! serviceDate ) {
setExtensionData(
'orderable/order-service-date',
'timestamp',
serviceDates?.[ 0 ]?.value
);
}
}, [ serviceDates, setExtensionData, serviceDate ] );
useEffect( () => {
if ( ! serviceDate ) {
setValidationErrors( {
'orderable/order-no-service-date-selected': {
message: __( 'Please select a service date', 'orderable' ),
hidden: true,
},
} );
return;
}
clearValidationError( 'orderable/order-no-service-date-selected' );
}, [ serviceDate, setValidationErrors, clearValidationError ] );
return (
<div
className={ `wp-block-orderable-checkout__service-date ${
hasNoServiceDateSelected ? 'has-error' : ''
}` }
>
{ hasNoServiceDatesAvailable?.message && (
<ValidationInputError
errorMessage={ hasNoServiceDatesAvailable.message }
/>
) }
{ serviceDates && (
<>
<SelectControl
label={ serviceDatesLabel }
disabled={ isDisabled }
value={ serviceDate }
options={ map( serviceDates ) }
onChange={ ( value ) => {
setExtensionData(
'orderable/order-service-date',
'timestamp',
value
);
} }
/>
{ hasNoServiceDateSelected &&
! hasNoServiceDateSelected.hidden && (
<ValidationInputError
errorMessage={
hasNoServiceDateSelected.message
}
/>
) }
</>
) }
</div>
);
};