/** * External dependencies */ import { SelectControl as WPSelectControl } from '@wordpress/components'; import type { ComponentType } from 'react'; /** * Internal dependencies */ import type { DesignSystemSelectControlProps, SelectItem } from './types'; /** * Get the design-system SelectControl if available (CIAB context), * otherwise return null to use fallback. * * Uses window.wp.hooks directly to ensure we use the same hooks instance as CIAB. * The bundled @wordpress/hooks in woocommerce-shipping is a separate instance. */ const getDesignSystemSelectControl = (): ComponentType< DesignSystemSelectControlProps > | null => { // Use global wp.hooks to share the same instance with CIAB const result = window.wp?.hooks?.applyFilters( 'woocommerce_shipping.components.SelectControl', null ); return result as ComponentType< DesignSystemSelectControlProps > | null; }; interface SelectControlProps { label?: string; hideLabelFromVision?: boolean; help?: string; value?: string; options?: SelectItem[]; items?: SelectItem[]; onChange?: ( value: string ) => void; onValueChange?: ( value: string ) => void; disabled?: boolean; required?: boolean; className?: string; // WP-specific props (ignored in design-system version) __next40pxDefaultSize?: boolean; __nextHasNoMarginBottom?: boolean; } /** * SelectControl that uses design-system version in CIAB context, * falls back to WordPress SelectControl otherwise. */ export const SelectControl = ( { label, hideLabelFromVision, help, value, options, items, onChange, onValueChange, disabled, required, className, __next40pxDefaultSize, __nextHasNoMarginBottom, }: SelectControlProps ) => { const DesignSystemSelect = getDesignSystemSelectControl(); // Use design-system SelectControl if available if ( DesignSystemSelect ) { const dsItems = items ?? options ?? []; return ( ); } // Fallback to WordPress SelectControl return ( ); }; export type { SelectItem, DesignSystemSelectControlProps };