/**
* WordPress dependencies
*/
import { TextControl } from '@safe-wordpress/components';
/**
* External dependencies
*/
import type { Maybe } from '@nelio-content/types';
export type NumberControlProps = {
readonly id?: string;
readonly label?: string;
readonly className?: string;
readonly value?: number | string;
readonly onChange: ( val?: number ) => void;
readonly min?: number;
readonly max?: number;
readonly disabled?: boolean;
readonly placeholder?: string;
};
export const NumberControl = ( {
id,
className,
label,
value,
onChange,
min = -Infinity,
max = Infinity,
disabled,
placeholder,
}: NumberControlProps ): JSX.Element => {
if ( ! label ) {
return (
{
const newValue = Number.parseInt( ev.target.value );
return undefined === newValue ||
Number.isNaN( newValue ) ||
newValue < min ||
max < newValue
? onChange( undefined )
: onChange( newValue );
} }
/>
);
}
return (
{
const newValue = Number.parseInt( input );
return undefined === newValue ||
Number.isNaN( newValue ) ||
newValue < min ||
max < newValue
? onChange( undefined )
: onChange( newValue );
} }
/>
);
};
// =======
// HELPERS
// =======
function numberize( value: NumberControlProps[ 'value' ] ): Maybe< number > {
if ( 'number' === typeof value ) {
return value;
}
if ( 'string' !== typeof value ) {
return undefined;
}
const num = Number.parseInt( value );
return isNaN( num ) ? undefined : num;
}