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 ] );