import React, { useState, useRef, useEffect } from 'react'; import { Send, Bot, User, Loader2, AlertTriangle } from 'lucide-react'; import { createFitnessChat } from '../services/geminiService'; import { WorkoutSession, Language, UserProfile, WorkoutPlan } from '../types'; import { Chat, GenerateContentResponse } from '@google/genai'; import { t } from '../services/i18n'; interface AICoachProps { history: WorkoutSession[]; userProfile?: UserProfile; plans?: WorkoutPlan[]; lang: Language; } interface Message { id: string; role: 'user' | 'model'; text: string; } const AICoach: React.FC = ({ history, userProfile, plans, lang }) => { const [messages, setMessages] = useState([ { id: 'intro', role: 'model', text: t('ai_intro', lang) } ]); const [input, setInput] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const chatSessionRef = useRef(null); const messagesEndRef = useRef(null); useEffect(() => { try { const chat = createFitnessChat(history, lang, userProfile, plans); if (chat) { chatSessionRef.current = chat; } else { setError(t('ai_error', lang)); } } catch (err) { setError("Failed to initialize AI"); } }, [history, lang, userProfile, plans]); const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); }; useEffect(() => { scrollToBottom(); }, [messages]); const handleSend = async () => { if (!input.trim() || !chatSessionRef.current || loading) return; const userMsg: Message = { id: crypto.randomUUID(), role: 'user', text: input }; setMessages(prev => [...prev, userMsg]); setInput(''); setLoading(true); try { const result: GenerateContentResponse = await chatSessionRef.current.sendMessage(userMsg.text); const text = result.text; const aiMsg: Message = { id: crypto.randomUUID(), role: 'model', text: text || "Error generating response." }; setMessages(prev => [...prev, aiMsg]); } catch (err) { console.error(err); let errorText = 'Connection error.'; if (err instanceof Error) { try { const json = JSON.parse(err.message); if (json.error) errorText = json.error; else errorText = err.message; } catch { errorText = err.message; } } setMessages(prev => [...prev, { id: crypto.randomUUID(), role: 'model', text: errorText }]); } finally { setLoading(false); } }; if (error) { return (

{error}

) } return (
{/* Header */}

{t('ai_expert', lang)}

{/* Messages */}
{messages.map((msg) => (
{msg.text}
))} {loading && (
{t('ai_typing', lang)}
)}
{/* Input */}
setInput(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleSend()} />
); }; export default AICoach;