import { createElement, useEffect, useState } from '@wordpress/element'; import { createRoot } from 'react-dom/client'; import { Modal, Notice } from '@wordpress/components'; import { __, sprintf } from '@wordpress/i18n'; import * as Sentry from '@sentry/react'; import { BulkLabelsBanner, BulkPrintDialog } from 'components/bulk-labels'; import { BulkPurchaseModal } from 'components/bulk-labels/bulk-purchase-modal'; import { BatchProgressModal, type BatchPurchaseState, } from 'components/bulk-labels/batch-progress-modal'; import { getBulkLabelsMaxOrders, registerBulkLabelsStore, registerOrdersShippingContextEntity, } from 'data/bulk-labels'; import type { PurchasableBulkPurchaseOrder } from 'data/bulk-labels'; import type { LabelPrintFulfillmentRef } from 'types'; import { initSentry } from 'utils'; initSentry(); registerOrdersShippingContextEntity(); registerBulkLabelsStore(); const CONTAINER_ID = 'wcshipping-bulk-labels-banner-root'; const BULK_ACTION_VALUE = 'wcshipping_create_shipping_labels'; let root: ReturnType< typeof createRoot > | null = null; /** * Read order IDs from the WP orders form's selected row checkboxes. Used * when the merchant triggers the modal via the native bulk-action dropdown. */ const getCheckedOrderIdsFromForm = (): number[] => { const checkboxes = document.querySelectorAll< HTMLInputElement >( '#the-list input[type="checkbox"][name="id[]"]:checked,' + ' #the-list input[type="checkbox"][name="post[]"]:checked' ); const ids = Array.from( checkboxes ) .map( ( cb ) => Number( cb.value ) ) .filter( ( id ) => Number.isFinite( id ) && id > 0 ); // Drop a Sentry breadcrumb when malformed checkbox values are // silently filtered out so the gap is visible if it ever becomes // non-zero (e.g. a WP markup change). if ( ids.length !== checkboxes.length ) { Sentry.addBreadcrumb( { category: 'bulk-labels', level: 'warning', message: 'Some bulk-labels order checkboxes had non-numeric values; dropped.', data: { expected: checkboxes.length, actual: ids.length, }, } ); } return ids; }; /** * Whether the orders form's bulk-action