import { ChangeEvent, ForwardedRef, forwardRef, useContext, useRef, FocusEvent, } from 'react'; import { RtData, RtFormFieldNumberProps, RtFormFieldTextProps, } from '../types/rt-form-field-text.types'; import { RtFormField } from './rt-form-field'; import { RtText } from '@dpa/react-text'; import mergeRefs from 'merge-refs'; import { createContext } from 'react'; import { createSyntheticEvent } from '../utils/create-synthetic-event'; const RtFormFieldNumberContext = createContext<{ min?: RtFormFieldNumberProps['min']; max?: RtFormFieldNumberProps['max']; step?: RtFormFieldNumberProps['step']; }>({}); const RtDataComponent: RtData = (props) => { const localRef = useRef(null); const { min, max, step } = useContext(RtFormFieldNumberContext); function handleChange(e: ChangeEvent) { const v = e.target.value; let newValue = `${v}`; if (new RegExp(/^-?0+\d*$/).test(v) && v) { if (new RegExp(/^-?0*$/).test(v)) newValue = newValue.replace(/0+/g, '0'); else newValue = newValue.replace(/0+/g, ''); } newValue = newValue.replaceAll('e', ''); if (newValue !== v) e.target.value = newValue; props.onChange(e); } function handleBlur(e: FocusEvent) { const change = () => { const event = createSyntheticEvent({ type: 'change', event: e, target: e.target!, }) as ChangeEvent; handleChange(event); }; if (e.target.value.length > 0) { if (typeof min !== 'undefined' && +e.target.value < min) { e.target.value = `${min}`; change(); } else if (typeof max !== 'undefined' && +e.target.value > max) { e.target.value = `${max}`; change(); } } props.onBlur(e); } return ( ); }; export const RtFormFieldNumber = forwardRef(function RtFormFieldNumber( { onChange, ...props }: RtFormFieldNumberProps, ref: ForwardedRef ) { const handleChange: RtFormFieldTextProps['onChange'] = ({ event, value, }) => { onChange?.({ event, value: value.length === 0 ? null : +value }); }; return ( ); }); RtFormFieldNumber.displayName = 'RtFormFieldNumber';