167 lines
7.0 KiB
TypeScript
167 lines
7.0 KiB
TypeScript
"use client";
|
||
|
||
import { AgeSelector } from "./AgeSelector";
|
||
import { AGE_EXAMPLES, calculateAgeFromArray, getAgeGroup, getGenerationFromArray, createAgeValue, createGenerationValue } from "@/lib/age-utils";
|
||
import { useState } from "react";
|
||
|
||
/**
|
||
* Демо компонент для показа возможностей системы возраста
|
||
*/
|
||
export function AgeDemo() {
|
||
const [selectedValues, setSelectedValues] = useState<string[]>([]);
|
||
|
||
const toggleValue = (value: string) => {
|
||
setSelectedValues(prev =>
|
||
prev.includes(value)
|
||
? prev.filter(v => v !== value)
|
||
: [...prev, value]
|
||
);
|
||
};
|
||
|
||
const addCustomValue = (value: string) => {
|
||
if (!selectedValues.includes(value)) {
|
||
setSelectedValues(prev => [...prev, value]);
|
||
}
|
||
};
|
||
|
||
return (
|
||
<div className="space-y-6 p-6">
|
||
<div className="space-y-2">
|
||
<h1 className="text-2xl font-bold">🎂 Система работы с возрастом WitLab</h1>
|
||
<p className="text-muted-foreground">
|
||
Автоматический расчет возраста и поколений из даты рождения для системы вариативности
|
||
</p>
|
||
</div>
|
||
|
||
{/* 📖 ПРИМЕРЫ РАСЧЕТОВ */}
|
||
<div className="space-y-4">
|
||
<h2 className="text-lg font-semibold">📖 Примеры автоматических расчетов:</h2>
|
||
|
||
{AGE_EXAMPLES.map((example, index) => (
|
||
<div key={index} className="space-y-2 p-4 bg-muted/20 rounded-lg border">
|
||
<div className="text-sm font-medium text-foreground">
|
||
{example.description}
|
||
</div>
|
||
|
||
{/* Исходная дата */}
|
||
<div className="text-xs text-muted-foreground bg-slate-100 p-2 rounded font-mono">
|
||
Дата: [{example.input.join(', ')}] ({example.input[1]}.{example.input[0]}.{example.input[2]})
|
||
</div>
|
||
|
||
{/* Рассчитанные значения */}
|
||
<div className="grid grid-cols-2 gap-4 text-sm">
|
||
<div>
|
||
<strong>Возраст:</strong> {example.age} лет
|
||
<br />
|
||
<strong>Группа:</strong> {example.ageGroup || 'Не определена'}
|
||
</div>
|
||
<div>
|
||
<strong>Поколение:</strong> {example.generation || 'Не определено'}
|
||
<br />
|
||
<strong>Значения:</strong> {[
|
||
createAgeValue(example.age),
|
||
`age-${example.age}`,
|
||
createGenerationValue(example.input[2])
|
||
].join(', ')}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
))}
|
||
</div>
|
||
|
||
{/* 🎯 ИНТЕРАКТИВНЫЙ СЕЛЕКТОР */}
|
||
<div className="space-y-4">
|
||
<h2 className="text-lg font-semibold">🎯 Интерактивный селектор возраста:</h2>
|
||
|
||
<AgeSelector
|
||
selectedValues={selectedValues}
|
||
onToggleValue={toggleValue}
|
||
onAddCustomValue={addCustomValue}
|
||
/>
|
||
</div>
|
||
|
||
{/* 💡 ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ */}
|
||
<div className="bg-blue-50 border border-blue-200 rounded-lg p-4 space-y-3">
|
||
<h3 className="text-sm font-semibold text-blue-800">💡 Как использовать в условиях навигации:</h3>
|
||
|
||
<div className="space-y-2 text-xs text-blue-700">
|
||
<div className="bg-white p-2 rounded border">
|
||
<strong>Пример 1 - Возрастные группы:</strong>
|
||
<pre className="mt-1 text-xs">
|
||
{`{
|
||
"conditions": [{
|
||
"screenId": "birth-date",
|
||
"conditionType": "values",
|
||
"operator": "includesAny",
|
||
"values": ["22-25", "26-30"] // Молодые профессионалы
|
||
}]
|
||
}`}
|
||
</pre>
|
||
</div>
|
||
|
||
<div className="bg-white p-2 rounded border">
|
||
<strong>Пример 2 - Поколения:</strong>
|
||
<pre className="mt-1 text-xs">
|
||
{`{
|
||
"conditions": [{
|
||
"screenId": "birth-date",
|
||
"conditionType": "values",
|
||
"operator": "equals",
|
||
"values": ["millennials"] // Только миллениалы
|
||
}]
|
||
}`}
|
||
</pre>
|
||
</div>
|
||
|
||
<div className="bg-white p-2 rounded border">
|
||
<strong>Пример 3 - Комбинированные условия:</strong>
|
||
<pre className="mt-1 text-xs">
|
||
{`{
|
||
"conditions": [
|
||
{
|
||
"screenId": "birth-date",
|
||
"conditionType": "values",
|
||
"operator": "includesAny",
|
||
"values": ["aries", "leo", "sagittarius"] // Огненные знаки
|
||
},
|
||
{
|
||
"screenId": "birth-date",
|
||
"conditionType": "values",
|
||
"operator": "includesAny",
|
||
"values": ["22-25", "26-30"] // Молодые взрослые
|
||
}
|
||
]
|
||
}`}
|
||
</pre>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{/* 🚀 ВОЗМОЖНОСТИ СИСТЕМЫ */}
|
||
<div className="bg-green-50 border border-green-200 rounded-lg p-4 space-y-2">
|
||
<h3 className="text-sm font-semibold text-green-800">🚀 Автоматические значения из даты рождения:</h3>
|
||
<ul className="text-xs text-green-700 space-y-1">
|
||
<li>✅ <strong>Точный возраст:</strong> age-25, age-30, age-45</li>
|
||
<li>✅ <strong>Возрастные группы:</strong> 18-21, 22-25, 26-30, 31-35, 36-40, 41-45, 46-50, 51-60, 60+</li>
|
||
<li>✅ <strong>Поколения:</strong> gen-z, millennials, gen-x, boomers, silent</li>
|
||
<li>✅ <strong>Знаки зодиака:</strong> aries, taurus, gemini, cancer, leo, virgo, libra, scorpio, sagittarius, capricorn, aquarius, pisces</li>
|
||
<li>✅ <strong>Кастомные диапазоны:</strong> 25-35, 40+, любые пользовательские значения</li>
|
||
</ul>
|
||
</div>
|
||
|
||
{/* 📋 ТЕХНИЧЕСКИЕ ДЕТАЛИ */}
|
||
<div className="bg-gray-50 border border-gray-200 rounded-lg p-4 space-y-2">
|
||
<h3 className="text-sm font-semibold text-gray-800">📋 Как это работает технически:</h3>
|
||
<ul className="text-xs text-gray-700 space-y-1">
|
||
<li><strong>1. Пользователь вводит дату:</strong> [4, 8, 1987] в date экране</li>
|
||
<li><strong>2. Система рассчитывает:</strong> возраст = {calculateAgeFromArray([4, 8, 1987])} лет</li>
|
||
<li><strong>3. Определяет группу:</strong> {getAgeGroup(calculateAgeFromArray([4, 8, 1987]))?.name}</li>
|
||
<li><strong>4. Определяет поколение:</strong> {getGenerationFromArray([4, 8, 1987])?.name}</li>
|
||
<li><strong>5. Добавляет в ответы:</strong> все вычисленные значения автоматически</li>
|
||
<li><strong>6. Система навигации:</strong> использует эти значения для условий</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
);
|
||
}
|