import { isInTheFuture } from '@wordpress/date';
import { mapValues, mapKeys, isObject } from 'lodash';
import { camelCaseKeys } from '../common';
import { getConfig, getAccountSettings } from '../config';
import { Label } from 'types';
import { getDateTS, isDateValid } from 'utils';
export const getShipmentDates = () => {
const shipmentDates =
getConfig().shippingLabelData.storedData.shipment_dates;
if ( isObject( shipmentDates ) ) {
return mapKeys( mapValues( shipmentDates, camelCaseKeys ), ( _, key ) =>
key.replace( 'shipment_', '' )
);
}
return {};
};
/**
* Retrieves or calculates the default dates for a shipment.
*
* This function determines the shipping date and estimated delivery date for a shipment based on:
* 1. Previously stored dates for this specific shipment
* 2. The creation date of an active purchased label
* 3. User's last used shipping date from account settings (if enabled)
* 4. Today's date as a fallback
*
* The function prioritizes existing data over calculated values to maintain consistency.
* So if the shipment has a stored shipping date, it will be used.
* If the shipment does not have a stored shipping date, the label's created date will be used.
* If the user has enabled the "Remember last used shipping date" option in the account settings,
* the last used shipping date will be used.
* Otherwise, today's date will be used.
*
* @param shipmentId - The ID of the shipment
* @param activePurchasedLabel - The active purchased label
* @return An object containing the shipping date and optional estimated delivery date
*/
export const getShipmentDefaultDates = (
shipmentId: string,
activePurchasedLabel?: Label
): { shippingDate: Date; estimatedDeliveryDate?: Date } => {
const shipmentDates = getShipmentDates();
const accountSettings = getAccountSettings();
const shippingDate = shipmentDates[ shipmentId ]?.shippingDate;
const estimatedDeliveryDate =
shipmentDates[ shipmentId ]?.estimatedDeliveryDate;
// As we were not persisting the shipping date before, we use the label's created date which is used as label_date by our provider
const labelCreatedDate = activePurchasedLabel?.createdDate
? new Date( activePurchasedLabel.createdDate ).toISOString()
: undefined;
const initialShippingDate = () => {
// Only calculate lastShippingDate if shippingDate or labelCreatedDate are not provided
if ( shippingDate || labelCreatedDate ) {
return getDateTS( shippingDate ?? labelCreatedDate );
}
const today = getDateTS( null, true );
if ( ! isInTheFuture( accountSettings.userMeta.last_shipping_date ) ) {
return today;
}
// Get the last shipping date from the account settings or use null to yield today
const selectedShippingDate = getDateTS(
accountSettings.purchaseSettings.remember_last_used_shipping_date &&
isDateValid( accountSettings.userMeta.last_shipping_date )
? accountSettings.userMeta.last_shipping_date
: null
);
return selectedShippingDate;
};
return {
shippingDate: initialShippingDate(),
// Not setting estimatedDeliveryDate if it's not defined
estimatedDeliveryDate: estimatedDeliveryDate
? getDateTS( estimatedDeliveryDate )
: undefined,
};
};