'use client'; import { useState, useCallback } from 'react'; import { MessageList } from './MessageList'; import { ChatInput } from './ChatInput'; import { VoiceInput } from './VoiceInput'; import { ActionPreview } from './ActionPreview'; import { ChatHistory } from './ChatHistory'; import { sendChatMessage, executeAction, sendVoiceMessage, type ChatMessage, type ActionItem, } from '@/lib/copilot'; export function ChatInterface() { const [messages, setMessages] = useState([]); const [sessionId, setSessionId] = useState(undefined); const [pendingActions, setPendingActions] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [showHistory, setShowHistory] = useState(false); const handleSend = useCallback(async (text: string) => { if (!text.trim() || loading) return; setLoading(true); setError(null); const userMsg: ChatMessage = { id: `temp-${Date.now()}`, session_id: sessionId || '', role: 'user', content: text, created_at: new Date().toISOString(), }; setMessages((prev) => [...prev, userMsg]); try { const result = await sendChatMessage(text, sessionId); setSessionId(result.session_id); const assistantMsg: ChatMessage = { id: result.message_id, session_id: result.session_id, role: 'assistant', content: result.response, actions: result.actions, created_at: new Date().toISOString(), }; setMessages((prev) => [...prev, assistantMsg]); if (result.actions && result.actions.length > 0) { setPendingActions(result.actions); } } catch (err) { setError(err instanceof Error ? err.message : 'Ein Fehler ist aufgetreten'); } finally { setLoading(false); } }, [sessionId, loading]); const handleVoice = useCallback(async (audioBase64: string, mimeType: string) => { if (loading) return; setLoading(true); setError(null); try { const result = await sendVoiceMessage(audioBase64, mimeType, sessionId); setSessionId(result.session_id); const userMsg: ChatMessage = { id: `voice-${Date.now()}`, session_id: result.session_id, role: 'user', content: `🎤 ${result.transcription}`, created_at: new Date().toISOString(), }; const assistantMsg: ChatMessage = { id: result.message_id, session_id: result.session_id, role: 'assistant', content: result.response, actions: result.actions, created_at: new Date().toISOString(), }; setMessages((prev) => [...prev, userMsg, assistantMsg]); if (result.actions && result.actions.length > 0) { setPendingActions(result.actions); } } catch (err) { setError(err instanceof Error ? err.message : 'Spracherkennung fehlgeschlagen'); } finally { setLoading(false); } }, [sessionId, loading]); const handleConfirmAction = useCallback(async (action: ActionItem) => { setLoading(true); setError(null); try { const result = await executeAction(action.type, action.params, sessionId); const resultMsg: ChatMessage = { id: `action-${Date.now()}`, session_id: sessionId || '', role: 'assistant', content: `Aktion "${result.action}" ausgefuehrt. ${result.success ? 'Erfolgreich.' : 'Fehlgeschlagen.'}`, created_at: new Date().toISOString(), }; setMessages((prev) => [...prev, resultMsg]); setPendingActions((prev) => prev.filter((a) => a !== action)); } catch (err) { setError(err instanceof Error ? err.message : 'Aktion fehlgeschlagen'); } finally { setLoading(false); } }, [sessionId]); const handleDismissAction = useCallback((action: ActionItem) => { setPendingActions((prev) => prev.filter((a) => a !== action)); }, []); const handleSelectSession = useCallback((selectedSessionId: string) => { setSessionId(selectedSessionId); setMessages([]); setPendingActions([]); setShowHistory(false); }, []); return (
{showHistory && ( setShowHistory(false)} /> )}
{error && (
{error}
)} {pendingActions.length > 0 && ( )}
); }