import { labelPurchaseStore, registerLabelPurchaseStore, } from '../../data/label-purchase'; import { addressStore, registerAddressStore } from '../../data/address'; import { getConfig } from './../../utils'; import { memo, useCallback, useMemo, useRef } from 'react'; import { LabelPurchaseContextProvider } from '../../context/label-purchase'; import { LabelPurchaseEffects } from '../../effects/label-purchase'; import { LabelPurchaseTabs } from '../../components/label-purchase/label-purchase-tabs'; import { ShipmentContentV2 } from '../../components/label-purchase/design-next/shipment-content-v2'; import { dispatch } from '@wordpress/data'; import { AddressStep } from '../../components/address-step/address_step'; import { ADDRESS_TYPES } from '../../data/constants'; import type { Destination } from '../../types'; import { withBoundaryNext } from 'components/HOC'; interface AddressEditorPluginExportProps { address: Destination & { id: string }; orderId?: string; originCountry: string; onAddressComplete: ( updatedAddress: unknown ) => void; onAddressCancel: () => void; } const AddressEditorPluginExport = memo( ( { address, orderId, originCountry, onAddressComplete, onAddressCancel, }: AddressEditorPluginExportProps ) => { return ( ); } ); const PurchaseShippingLabelPluginExport = memo( ( { orderId }: { orderId: number } ) => { const noop = () => { /* no operation */ }; const ref = useRef( null ); // We need to reset the state when the order ID changes to avoid // showing data from a previous order. dispatch( addressStore ).stateReset(); dispatch( labelPurchaseStore ).stateReset(); return ( ); }, ( prevProps, nextProps ) => prevProps.orderId === nextProps.orderId ); const WCShippingPlugin = memo( () => { if ( ! addressStore ) { try { registerAddressStore( true ); } catch { // Store is already registered } } if ( ! labelPurchaseStore ) { try { registerLabelPurchaseStore(); } catch { // Store is already registered } } const config = getConfig(); const mode = config.mode ?? 'label-purchase'; // Memoize address transformation const addressEditorProps = useMemo( () => { if ( mode !== 'address-editor' ) { return null; } const shippingAddress = config.order?.shipping_address; const address = shippingAddress ? { id: '', firstName: shippingAddress.first_name, lastName: shippingAddress.last_name, company: shippingAddress.company, address: shippingAddress.address_1, address1: shippingAddress.address_1, address2: shippingAddress.address_2, city: shippingAddress.city, state: shippingAddress.state, postcode: shippingAddress.postcode, country: shippingAddress.country, email: shippingAddress.email, phone: shippingAddress.phone, } : ( { id: '', ...( config.address as Destination ), } as Destination & { id: string; } ); return { address, orderId: config.order?.id ? String( config.order.id ) : undefined, originCountry: config.accountSettings?.storeOptions?.origin_country ?? 'US', }; }, [ mode, config.order?.shipping_address, config.order?.id, config.address, config.accountSettings?.storeOptions?.origin_country, ] ); // Stable callbacks const onAddressComplete = useCallback( ( updatedAddress: unknown ) => { const currentConfig = getConfig(); if ( currentConfig.onAddressComplete ) { currentConfig.onAddressComplete( updatedAddress ); } }, [] ); const onAddressCancel = useCallback( () => { const currentConfig = getConfig(); if ( currentConfig.onAddressCancel ) { currentConfig.onAddressCancel(); } }, [] ); if ( mode === 'address-editor' && addressEditorProps ) { return ( ); } // Default to label-purchase mode for backward compatibility const orderId = config.order.id; return ; } ); window.WCShipping_Plugin = withBoundaryNext( WCShippingPlugin )(); export default WCShippingPlugin;