import React, { useState, useRef } from 'react'; import { Box, InputBase, IconButton, Menu, MenuItem, Paper, Popper, Grow, ClickAwayListener, MenuList, useTheme, FormHelperText } from '@mui/material'; import ArrowDownIcon from "@/assets/icons/ArrowDownIcon"; interface AgeInputWithSelectProps { value: string; onChange: (value: string) => void; onErrorChange?: (isError: boolean) => void; } const AgeInputWithSelect = ({ value, onChange, onErrorChange }: AgeInputWithSelectProps) => { const theme = useTheme(); const [open, setOpen] = useState(false); const anchorRef = useRef(null); const [errorType, setErrorType] = useState<'format' | 'range' | false>(false); // Валидация: только число или диапазон число-число, и диапазон 0-150 const validate = (val: string) => { if (!val) return false; // Число (только положительное) if (/^-?\d+$/.test(val)) { const num = Number(val); if (num < 0 || num > 150) return 'range'; return false; } // Диапазон (только положительные числа) const rangeMatch = val.match(/^(-?\d+)-(-?\d+)$/); if (rangeMatch) { const left = Number(rangeMatch[1]); const right = Number(rangeMatch[2]); if (left < 0 || left > 150 || right < 0 || right > 150 || left > right) return 'range'; return false; } return 'format'; }; const handleInputChange = (e: React.ChangeEvent) => { const filtered = e.target.value.replace(/[^\d-]/g, ''); onChange(filtered); const err = validate(filtered); setErrorType(err); if (onErrorChange) onErrorChange(!!err); }; const handleInputBlur = (e: React.FocusEvent) => { const trimmed = e.target.value.replace(/\s+/g, ''); onChange(trimmed); const err = validate(trimmed); setErrorType(err); if (onErrorChange) onErrorChange(!!err); }; const handleSelectItemClick = (selectedValue: string) => { onChange(selectedValue); setErrorType(false); setOpen(false); }; const handleToggle = () => { setOpen((prevOpen) => !prevOpen); }; const handleClose = (event: Event) => { if (anchorRef.current && anchorRef.current.contains(event.target as HTMLElement)) { return; } setOpen(false); }; return ( {errorType === 'format' && ( можно только число или диапазон )} {errorType === 'range' && ( таких возрастов нет )} {({ TransitionProps, placement }) => ( handleSelectItemClick('')}>Выберите возраст handleSelectItemClick('18-24')}>18-24 handleSelectItemClick('25-34')}>25-34 handleSelectItemClick('35-44')}>35-44 handleSelectItemClick('45-54')}>45-54 handleSelectItemClick('55+')}>55+ )} ); }; export default AgeInputWithSelect;