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,
  };
}