/** @jsxImportSource @emotion/react */ import { ChangeEvent, ForwardedRef, forwardRef, useCallback, useEffect, useState } from 'react'; import { useUid } from '@/libs/hooks'; import FieldContainer from './container/FieldContainer'; const NumbericField = forwardRef( ( { error, edge, disabled, value, onChange, sizes, themes, ...props }: NumbericType, ref: ForwardedRef ) => { const id = props?.id ?? useUid(); const [displayValue, setDisplayValue] = useState(''); const [isFocused, setIsFocused] = useState(false); const handleFocus = useCallback(() => setIsFocused(true), [isFocused]); const handleBlur = useCallback(() => setIsFocused(false), [isFocused]); useEffect(() => { let formattedValue = '0'; if (typeof value === 'number') formattedValue = value.toLocaleString(); else if (value === '') formattedValue = ''; else if (/^\d*\.?\d*$/.test(value?.toString() ?? '')) { formattedValue = parseFloat(value?.toString() ?? '').toLocaleString(); setDisplayValue(formattedValue); } }, [value]); const handleInputChange = (e: ChangeEvent) => { const rawValue = e.target.value.replace(/,/g, ''); if (rawValue === '') { setDisplayValue(''); onChange?.({ ...e, target: { ...e.target, value: '' } }); } else if (/^\d*\.?\d*$/.test(rawValue)) { setDisplayValue(rawValue.replace(/\B(?=(\d{3})+(?!\d))/g, ',')); onChange?.({ ...e, target: { ...e.target, value: rawValue } }); } else { setDisplayValue(''); onChange?.({ ...e, target: { ...e.target, value: '0' } }); } }; return ( ); } ); export default NumbericField;