/** * WordPress dependencies */ import { SelectControl } from '@safe-wordpress/components'; import { _x } from '@safe-wordpress/i18n'; /** * External dependencies */ import type { NumberMatch } from '@nelio/popups/types'; import { max } from 'lodash'; /** * Internal dependencies */ import { NumberControl } from './number-control'; const MATCH_LABELS: Record< NumberMatch[ 'matchType' ], string > = { 'greater-than': _x( 'greater than', 'text', 'nelio-popups' ), 'less-than': _x( 'less than', 'text', 'nelio-popups' ), between: _x( 'between', 'text', 'nelio-popups' ), }; const MATCH_OPTIONS = Object.keys( MATCH_LABELS ).map( ( value: NumberMatch[ 'matchType' ] ) => ( { value, label: MATCH_LABELS[ value ], } ) ); export type NumberMatchControlProps = { readonly match: NumberMatch; readonly label?: string; readonly labelMinimum?: string; readonly labelMaximum?: string; readonly disabled?: boolean; readonly onChange: ( newMatch: NumberMatch ) => void; }; export const NumberMatchControl = ( props: NumberMatchControlProps ): JSX.Element => { const { match, label = _x( 'Value', 'text', 'nelio-popups' ), labelMinimum = _x( 'Minimum value', 'text', 'nelio-popups' ), labelMaximum = _x( 'Maximum value', 'text', 'nelio-popups' ), disabled, onChange, } = props; const { matchType, ...other } = match; const onSelectChange = ( value: NumberMatch[ 'matchType' ] ) => { if ( value === 'between' ) { return onChange( { matchType: 'between', minMatchValue: 0, maxMatchValue: 0, ...other, } ); } if ( value === 'greater-than' ) { return onChange( { matchType: 'greater-than', matchValue: 0, ...other, } ); } return onChange( { matchType: value, matchValue: 0, ...other, } ); }; return ( <> ); }; type RangeDimensionControlProps = { readonly match: NumberMatch; readonly labelMinimum: string; readonly labelMaximum: string; readonly disabled?: boolean; readonly onChange: ( newMatch: NumberMatch ) => void; }; const RangeDimensionControl = ( props: RangeDimensionControlProps ): JSX.Element | null => { const { match, labelMinimum, labelMaximum, disabled, onChange } = props; if ( match.matchType !== 'between' ) { return null; } return ( <> onChange( { ...match, minMatchValue: newMin, maxMatchValue: max( [ newMin, match.maxMatchValue ] ) ?? 0, } ) } /> onChange( { ...match, maxMatchValue: newMax, minMatchValue: max( [ 0, match.minMatchValue ] ) ?? 0, } ) } /> ); }; type SingleDimensionControlProps = { readonly match: NumberMatch; readonly label: string; readonly disabled?: boolean; readonly onChange: ( newMatch: NumberMatch ) => void; }; const SingleDimensionControl = ( props: SingleDimensionControlProps ): JSX.Element | null => { const { match, label, disabled, onChange } = props; if ( match.matchType === 'between' ) { return null; } return ( <> onChange( { ...match, matchValue: newValue, } ) } /> ); };