UNPKG

plazbot

Version:

Official Plazbot SDK for creating AI agents for WhatsApp, portals, and developers.

76 lines (75 loc) 2.77 kB
import { useState, useCallback, useRef } from 'react'; import { usePlazbotContext } from '../context/PlazbotContext'; import { useSession } from './useSession'; function generateId() { return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`; } export function useChat(options) { const { sdk, agentId } = usePlazbotContext(); const sessionId = useSession(); const [messages, setMessages] = useState([]); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const lastUserMessage = useRef(null); const sendMessage = useCallback(async (content, file) => { if (!content.trim() && !file) return; const userMsg = { id: generateId(), role: 'user', content: content.trim(), timestamp: new Date(), ...(file && { file: { name: 'archivo', url: file, type: 'unknown' } }), }; setMessages((prev) => [...prev, userMsg]); setIsLoading(true); setError(null); lastUserMessage.current = { content, file }; try { const response = await sdk.agent.onMessage({ agentId, question: content.trim(), sessionId, file, }); const agentMsg = { id: generateId(), role: 'agent', content: response.answer, timestamp: new Date(), sources: response.sources, actionsExecuted: response.actionsExecuted, }; setMessages((prev) => [...prev, agentMsg]); options?.onResponse?.(agentMsg); } catch (err) { const errorMsg = err instanceof Error ? err.message : 'Error desconocido'; setError(errorMsg); options?.onError?.(errorMsg); } finally { setIsLoading(false); } }, [sdk, agentId, sessionId, options]); const retry = useCallback(async () => { if (!lastUserMessage.current) return; // Eliminar el ultimo mensaje del usuario para re-enviarlo setMessages((prev) => { const lastIdx = prev.length - 1; if (lastIdx >= 0 && prev[lastIdx].role === 'user') { return prev.slice(0, -1); } return prev; }); const { content, file } = lastUserMessage.current; await sendMessage(content, file); }, [sendMessage]); const clearMessages = useCallback(() => { setMessages([]); setError(null); lastUserMessage.current = null; }, []); return { messages, isLoading, error, sendMessage, clearMessages, retry }; }