import { useSelect } from '@wordpress/data';
import { BULK_LABELS_STORE_NAME } from 'data/constants';
import { toError, type BulkLabelsSelect } from './store';
import type { AssignablePackage } from './types';
interface UseAssignablePackagesResult {
isResolving: boolean;
error: Error | null;
packages: AssignablePackage[];
}
const EMPTY_PACKAGES: AssignablePackage[] = [];
/**
* The merchant's selectable box packages for the per-order package
* dropdown. Backed by the bulk-labels @wordpress/data store, so the
* GET /wcshipping/v1/packages call is made once and shared/cached
* across every row — no per-hook apiFetch/useState. `enabled` gates
* the selector so nothing is fetched until the modal opens.
*/
export const useAssignablePackages = (
enabled: boolean
): UseAssignablePackagesResult =>
useSelect(
( select ): UseAssignablePackagesResult => {
if ( ! enabled ) {
return {
isResolving: false,
error: null,
packages: EMPTY_PACKAGES,
};
}
const store = select(
BULK_LABELS_STORE_NAME
) as unknown as BulkLabelsSelect;
const packages = store.getAssignablePackages();
const resolutionError = store.getResolutionError(
'getAssignablePackages',
[]
);
return {
packages: packages ?? EMPTY_PACKAGES,
isResolving: ! store.hasFinishedResolution(
'getAssignablePackages',
[]
),
error: toError( resolutionError ),
};
},
[ enabled ]
);