AI Plan generation enhanced

This commit is contained in:
AG
2025-12-16 11:24:09 +02:00
parent 8d4eed77ea
commit cb0bd1a55d
4 changed files with 305 additions and 70 deletions

View File

@@ -181,7 +181,7 @@ const SortablePlanStep: React.FC<SortablePlanStepProps> = ({ step, index, toggle
const Plans: React.FC<PlansProps> = ({ lang }) => {
const { currentUser } = useAuth();
const userId = currentUser?.id || '';
const { plans, savePlan, deletePlan, refreshData } = useSession();
const { plans, sessions, savePlan, deletePlan, refreshData } = useSession();
const { startSession } = useActiveWorkout();
const [isEditing, setIsEditing] = useState(false);
@@ -226,7 +226,9 @@ const Plans: React.FC<PlansProps> = ({ lang }) => {
const [aiLoading, setAILoading] = useState(false);
const [aiError, setAIError] = useState<string | null>(null);
const [aiDuration, setAIDuration] = useState(60); // Default 1 hour in minutes
const [aiEquipment, setAIEquipment] = useState<'none' | 'essentials' | 'free_weights' | 'full_gym'>('full_gym');
const [aiEquipment, setAIEquipment] = useState<'none' | 'essentials' | 'free_weights' | 'full_gym'>('none');
const [aiLevel, setAILevel] = useState<'beginner' | 'intermediate' | 'advanced'>('intermediate');
const [aiIntensity, setAIIntensity] = useState<'low' | 'moderate' | 'high'>('moderate');
const [generatedPlanPreview, setGeneratedPlanPreview] = useState<{
name: string;
description: string;
@@ -417,7 +419,17 @@ const Plans: React.FC<PlansProps> = ({ lang }) => {
? aiPrompt
: (lang === 'ru' ? 'Создай план тренировки' : 'Create a workout plan');
const aiPlan = await generateWorkoutPlan(prompt, availableNames, lang, aiDuration, aiEquipment);
const aiPlan = await generateWorkoutPlan(
prompt,
availableNames,
lang,
aiDuration,
aiEquipment,
aiLevel,
aiIntensity,
sessions,
currentUser?.profile
);
setGeneratedPlanPreview(aiPlan);
} catch (err: any) {
console.error('AI plan generation error:', err);
@@ -488,7 +500,9 @@ const Plans: React.FC<PlansProps> = ({ lang }) => {
// Reset state and close
setAIPrompt('');
setAIDuration(60);
setAIEquipment('full_gym');
setAIEquipment('none');
setAILevel('intermediate');
setAIIntensity('moderate');
setGeneratedPlanPreview(null);
setShowAISheet(false);
setFabMenuOpen(false);
@@ -813,6 +827,46 @@ const Plans: React.FC<PlansProps> = ({ lang }) => {
</div>
</div>
{/* Level Selector */}
<div className="space-y-2">
<label className="text-sm font-medium text-on-surface">{t('level', lang)}</label>
<div className="flex gap-2">
{(['beginner', 'intermediate', 'advanced'] as const).map((lvl) => (
<button
key={lvl}
onClick={() => setAILevel(lvl)}
disabled={aiLoading}
className={`flex-1 p-2 rounded-xl text-sm font-medium transition-all ${aiLevel === lvl
? 'bg-primary text-on-primary'
: 'bg-surface-container-high text-on-surface hover:bg-surface-container-highest'
}`}
>
{t(`level_${lvl}` as any, lang)}
</button>
))}
</div>
</div>
{/* Intensity Selector */}
<div className="space-y-2">
<label className="text-sm font-medium text-on-surface">{t('intensity', lang)}</label>
<div className="flex gap-2">
{(['low', 'moderate', 'high'] as const).map((int) => (
<button
key={int}
onClick={() => setAIIntensity(int)}
disabled={aiLoading}
className={`flex-1 p-2 rounded-xl text-sm font-medium transition-all ${aiIntensity === int
? 'bg-primary text-on-primary'
: 'bg-surface-container-high text-on-surface hover:bg-surface-container-highest'
}`}
>
{t(`intensity_${int}` as any, lang)}
</button>
))}
</div>
</div>
{/* Additional Requirements */}
<div className="space-y-2">
<label className="text-sm font-medium text-on-surface">