File size: 3,111 Bytes
9ac6946 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
// hooks/useChat.ts
import { useState, useCallback, useEffect } from 'react';
import { chatService, ChatMessage, ChatResponse } from '../services/chatService';
export interface UseChatReturn {
messages: ChatMessage[];
isLoading: boolean;
error: string | null;
sendMessage: (message: string) => Promise<void>;
clearChat: () => void;
isOnline: boolean;
maritacaAvailable: boolean;
}
export function useChat(): UseChatReturn {
const [messages, setMessages] = useState<ChatMessage[]>([]);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const [isOnline, setIsOnline] = useState(true);
const [maritacaAvailable, setMaritacaAvailable] = useState(false);
// Verifica status do serviço ao montar
useEffect(() => {
checkServiceStatus();
// Verifica a cada 30 segundos
const interval = setInterval(checkServiceStatus, 30000);
return () => clearInterval(interval);
}, []);
const checkServiceStatus = async () => {
const status = await chatService.checkStatus();
setIsOnline(status.online);
setMaritacaAvailable(status.maritacaAvailable);
};
const sendMessage = useCallback(async (content: string) => {
if (!content.trim()) return;
// Adiciona mensagem do usuário
const userMessage: ChatMessage = {
id: `user-${Date.now()}`,
role: 'user',
content,
timestamp: new Date(),
};
setMessages((prev) => [...prev, userMessage]);
setIsLoading(true);
setError(null);
try {
// Envia para o backend
const response: ChatResponse = await chatService.sendMessage(content);
// Adiciona resposta do Drummond/Maritaca
const assistantMessage: ChatMessage = {
id: `assistant-${Date.now()}`,
role: 'assistant',
content: response.message,
timestamp: new Date(),
agentName: response.agent_name,
confidence: response.confidence,
};
setMessages((prev) => [...prev, assistantMessage]);
// Se há ações sugeridas, podemos processá-las
if (response.suggested_actions?.length) {
console.log('Ações sugeridas:', response.suggested_actions);
// TODO: Implementar quick actions
}
} catch (err) {
console.error('Erro no chat:', err);
setError('Não foi possível enviar a mensagem. Tente novamente.');
// Adiciona mensagem de erro
const errorMessage: ChatMessage = {
id: `error-${Date.now()}`,
role: 'assistant',
content: 'Desculpe, ocorreu um erro ao processar sua mensagem. Por favor, tente novamente.',
timestamp: new Date(),
agentName: 'Sistema',
confidence: 0,
};
setMessages((prev) => [...prev, errorMessage]);
} finally {
setIsLoading(false);
}
}, []);
const clearChat = useCallback(() => {
setMessages([]);
setError(null);
chatService.clearSession();
}, []);
return {
messages,
isLoading,
error,
sendMessage,
clearChat,
isOnline,
maritacaAvailable,
};
} |