frontPanel/src/pages/PersonalizationAI/GenderAndAgeSelector.tsx
Nastya 929e6047cf
All checks were successful
Deploy / CreateImage (push) Successful in 7m11s
Deploy / DeployService (push) Successful in 28s
fix checkbox
2025-06-09 18:22:41 +03:00

212 lines
6.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Box, FormControl, FormLabel, Checkbox, FormControlLabel, useTheme, Button, useMediaQuery } from "@mui/material";
import CheckboxIcon from "@icons/Checkbox";
import AgeInputWithSelect from "./AgeInputWithSelect";
import { useState, useEffect } from "react";
interface GenderAndAgeSelectorProps {
gender: string;
age: string;
ageError: boolean;
onGenderChange: (gender: string) => void;
onAgeChange: (age: string) => void;
onAgeErrorChange: (error: boolean) => void;
onStartCreate: () => void;
}
export default function GenderAndAgeSelector({
gender,
age,
ageError,
onGenderChange,
onAgeChange,
onAgeErrorChange,
onStartCreate
}: GenderAndAgeSelectorProps) {
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down(845));
const [maleChecked, setMaleChecked] = useState(false);
const [femaleChecked, setFemaleChecked] = useState(false);
// Синхронизируем состояние чекбоксов с пропсом gender
useEffect(() => {
if (gender === '1') {
setMaleChecked(true);
setFemaleChecked(false);
} else if (gender === '0') {
setMaleChecked(false);
setFemaleChecked(true);
} else if (gender === '2') {
setMaleChecked(true);
setFemaleChecked(true);
} else {
setMaleChecked(false);
setFemaleChecked(false);
}
}, [gender]);
const handleGenderChange = (type: 'male' | 'female', checked: boolean) => {
if (type === 'male') {
setMaleChecked(checked);
} else {
setFemaleChecked(checked);
}
// Обновляем значение gender в родительском компоненте
if (type === 'male' && checked && !femaleChecked) {
onGenderChange('1'); // Только мужской
} else if (type === 'female' && checked && !maleChecked) {
onGenderChange('0'); // Только женский
} else if (type === 'male' && checked && femaleChecked) {
onGenderChange('2'); // Оба пола
} else if (type === 'female' && checked && maleChecked) {
onGenderChange('2'); // Оба пола
} else if (type === 'male' && !checked && femaleChecked) {
onGenderChange('0'); // Только женский
} else if (type === 'female' && !checked && maleChecked) {
onGenderChange('1'); // Только мужской
} else {
onGenderChange(''); // Ничего не выбрано
}
};
return (
<Box sx={{ display: 'flex', gap: 4, alignItems: "end", flexWrap: "wrap" }}>
<Box sx={{ display: "inline-flex", flexWrap: isMobile ? "wrap" : "initial" }}>
<FormControl component="fieldset" variant="standard">
<Box sx={{ display: 'flex', alignItems: "end", gap: '4px' }}>
<FormLabel
sx={{
'&.Mui-focused': {
color: '#4D4D4D',
},
color: '#4D4D4D',
fontSize: '18px',
fontWeight: 500,
lineHeight: 1,
letterSpacing: 0,
mr: '3px',
}}
component="legend">Пол</FormLabel>
</Box>
<Box
sx={{
width: "155px",
justifyContent: "space-between",
mt: "20px",
ml: "-9px",
display: 'flex',
gap: '10px'
}}
>
<FormControlLabel
sx={{
padding: 0,
'& .MuiTouchRipple-root': {
width: '100%',
height: '100%',
overflow: 'visible',
},
'& .MuiSvgIcon-root': {
position: 'absolute',
left: '50%',
top: '50%',
transform: 'translate(-50%, -50%)',
},
'& .MuiFormControlLabel-label': {
fontSize: '18px',
fontWeight: 400,
fontFamily: 'Rubik',
lineHeight: 1,
letterSpacing: 0,
color: '#4D4D4D',
ml: "6px"
},
m: 0,
}}
control={
<Checkbox
icon={<CheckboxIcon />}
checkedIcon={<CheckboxIcon checked />}
checked={maleChecked}
onChange={(e) => handleGenderChange('male', e.target.checked)}
/>
}
label="М"
/>
<FormControlLabel
sx={{
padding: 0,
'& .MuiTouchRipple-root': {
width: '100%',
height: '100%',
overflow: 'visible',
},
'& .MuiSvgIcon-root': {
position: 'absolute',
left: '50%',
top: '50%',
transform: 'translate(-50%, -50%)',
},
'& .MuiFormControlLabel-label': {
fontSize: '18px',
fontWeight: 400,
fontFamily: 'Rubik',
lineHeight: 1,
letterSpacing: 0,
color: '#4D4D4D',
},
m: 0,
}}
control={
<Checkbox
icon={<CheckboxIcon />}
checkedIcon={<CheckboxIcon checked />}
checked={femaleChecked}
onChange={(e) => handleGenderChange('female', e.target.checked)}
/>
}
label="Ж"
/>
</Box>
</FormControl>
<FormControl sx={{ maxWidth: "420px", width: "100%", marginLeft: isMobile ? "0" : "120px", minWidth: "265px" }} variant="filled">
<Box sx={{
display: 'flex',
alignItems: 'end',
gap: '4px'
}}>
<FormLabel sx={{
color: '#4D4D4D',
fontSize: "18px",
fontWeight: 500,
lineHeight: "100%",
'&.Mui-focused': {
color: '#4D4D4D',
},
}}>Возраст</FormLabel>
</Box>
<AgeInputWithSelect value={age} onChange={onAgeChange} onErrorChange={onAgeErrorChange} />
</FormControl>
</Box>
<Button
onClick={onStartCreate}
variant="contained"
disabled={!gender || !age || ageError}
sx={{
bgcolor: theme.palette.brightPurple.main,
borderRadius: "8px",
width: "130px",
height: "48px",
boxShadow: "none",
textTransform: "none",
fontSize: "18px",
'&:hover': { bgcolor: theme.palette.brightPurple.main },
}}
>
Ок
</Button>
</Box>
);
}