plazbot
Version:
Official Plazbot SDK for creating AI agents for WhatsApp, portals, and developers.
76 lines (75 loc) • 2.77 kB
JavaScript
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 };
}