import React, { useState, useRef, useEffect } from 'react'; import { GoogleGenAI } from "@google/genai"; import { Message } from '../types'; import { SYSTEM_INSTRUCTION } from '../constants'; import { MessageSquare, X, Send, Loader2, Sparkles } from 'lucide-react'; const Assistant: React.FC = () => { const [isOpen, setIsOpen] = useState(false); const [messages, setMessages] = useState([ { role: 'model', text: '안녕하십니까! CodeBridgeX 영업 지원 AI입니다. CEO 설득을 위한 핵심 스크립트나 자료가 필요하신가요?' } ]); const [input, setInput] = useState(''); const [isLoading, setIsLoading] = useState(false); const messagesEndRef = useRef(null); // Auto-scroll to bottom useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages, isOpen]); const handleSend = async () => { if (!input.trim() || isLoading) return; const userMessage = input.trim(); setInput(''); setMessages(prev => [...prev, { role: 'user', text: userMessage }]); setIsLoading(true); try { const apiKey = process.env.API_KEY; if (!apiKey) { throw new Error("API Key is missing"); } const ai = new GoogleGenAI({ apiKey }); // Build history for context const history = messages.map(m => ({ role: m.role, parts: [{ text: m.text }] })); const chat = ai.chats.create({ model: 'gemini-2.5-flash', config: { systemInstruction: SYSTEM_INSTRUCTION, }, history: history }); const result = await chat.sendMessageStream({ message: userMessage }); let fullResponse = ''; setMessages(prev => [...prev, { role: 'model', text: '' }]); // Placeholder for await (const chunk of result) { const text = chunk.text; if (text) { fullResponse += text; setMessages(prev => { const newMsgs = [...prev]; newMsgs[newMsgs.length - 1].text = fullResponse; return newMsgs; }); } } } catch (error) { console.error("AI Error:", error); setMessages(prev => [...prev, { role: 'model', text: '죄송합니다. 일시적인 오류가 발생했습니다. 잠시 후 다시 시도해주세요.' }]); } finally { setIsLoading(false); } }; return ( <> {/* Floating Action Button */} {/* Chat Window */}
{/* Header */}

SAM Sales Assistant

Powered by Gemini 2.5 Flash

{/* Messages */}
{messages.map((msg, idx) => (
{msg.text}
))} {isLoading && (
)}
{/* Input Area */}
setInput(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleSend()} placeholder="제안 스크립트를 요청하세요..." className="flex-1 bg-transparent outline-none text-sm text-slate-800 placeholder:text-slate-400" disabled={isLoading} />
); }; export default Assistant;