"use client";
import { useState } from "react";
import { Button } from "@/components/ui/button";
import { TextInput } from "@/components/ui/TextInput/TextInput";
import { AGE_GROUPS, GENERATION_GROUPS, parseAgeRange } from "@/lib/age-utils";
interface AgeSelectorProps {
selectedValues: string[];
onToggleValue: (value: string) => void;
onAddCustomValue: (value: string) => void;
}
export function AgeSelector({ selectedValues, onToggleValue, onAddCustomValue }: AgeSelectorProps) {
const [customValue, setCustomValue] = useState("");
const handleAddCustom = () => {
if (customValue.trim()) {
onAddCustomValue(customValue.trim());
setCustomValue("");
}
};
const isValueSelected = (value: string) => selectedValues.includes(value);
return (
{/* 🎂 ВОЗРАСТНЫЕ ГРУППЫ */}
🎂 Возрастные группы
{AGE_GROUPS.map((group) => {
const isSelected = isValueSelected(group.id);
return (
onToggleValue(group.id)}
className={`
relative group p-3 rounded-lg border-2 transition-all duration-200
hover:shadow-md text-left
${isSelected
? "border-primary bg-primary/10 shadow-md"
: "border-border hover:border-primary/50"
}
`}
title={group.description}
>
{/* Возрастной диапазон */}
🎂
{/* Информация */}
{group.name}
{group.description}
{/* Индикатор выбранного */}
{isSelected && (
✓
)}
);
})}
{/* 🚀 ПОКОЛЕНИЯ */}
🚀 Поколения
{GENERATION_GROUPS.map((generation) => {
const isSelected = isValueSelected(generation.id);
return (
onToggleValue(generation.id)}
className={`
relative group p-3 rounded-lg border-2 transition-all duration-200
hover:shadow-md text-left
${isSelected
? "border-primary bg-primary/10 shadow-md"
: "border-border hover:border-primary/50"
}
`}
title={`Родились ${generation.minYear}-${generation.maxYear}`}
>
{/* Иконка поколения */}
{generation.id === 'gen-z' ? '📱' :
generation.id === 'millennials' ? '💻' :
generation.id === 'gen-x' ? '📺' :
generation.id === 'boomers' ? '📻' : '📰'}
{/* Информация */}
{generation.name}
{generation.minYear}-{generation.maxYear} • {generation.description}
{/* Индикатор выбранного */}
{isSelected && (
✓
)}
);
})}
{/* 🎯 ДОБАВЛЕНИЕ КАСТОМНЫХ ЗНАЧЕНИЙ */}
Или добавить точный возраст/диапазон:
setCustomValue(e.target.value)}
onKeyDown={(e) => {
if (e.key === "Enter") {
e.preventDefault();
handleAddCustom();
}
}}
/>
Добавить
{/* Подсказки по форматам */}
Примеры: 25 (точный возраст), 18-21 (диапазон), 60+ (от 60 лет), age-25 (альтернативный формат)
{/* 📋 ВЫБРАННЫЕ ЗНАЧЕНИЯ */}
{selectedValues.length > 0 && (
Выбранные возрастные условия:
{selectedValues.map((value) => {
// Ищем в возрастных группах
const ageGroup = AGE_GROUPS.find(group => group.id === value);
if (ageGroup) {
return (
🎂 {ageGroup.name}
onToggleValue(value)}
className="ml-1 hover:text-red-500 transition-colors"
title="Удалить"
>
×
);
}
// Ищем в поколениях
const generation = GENERATION_GROUPS.find(gen => gen.id === value);
if (generation) {
return (
🚀 {generation.name}
onToggleValue(value)}
className="ml-1 hover:text-red-500 transition-colors"
title="Удалить"
>
×
);
}
// Кастомное значение
const range = parseAgeRange(value);
return (
🎯 {range ? `${range.min}-${range.max === 120 ? '+' : range.max}` : value}
onToggleValue(value)}
className="ml-1 hover:text-red-500 transition-colors"
title="Удалить"
>
×
);
})}
)}
{/* 💡 ПОДСКАЗКА */}
💡 Как это работает: Система автоматически рассчитывает возраст из
даты рождения пользователя. Выберите возрастные группы или поколения, при которых
должен показываться этот вариант экрана. Можно комбинировать разные условия.
);
}