File size: 2,032 Bytes
e454383
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { useState } from 'react';
import { useSelectedChat } from '@/providers/selected-chat-provider';
import { Message } from '@/lib/types';
import { init_message } from '@/lib/prompts';
import { getNameForNewChat, sendChat } from '@/lib/api';

export function useChat() {
  const [isLoading, setIsLoading] = useState(false);
  const [error, setError] = useState<Error | null>(null);
  
  const {
    selectedChat,
    sendMessage,
    selectedChatId,
    loadChat,
    updateChatName,
  } = useSelectedChat();

  const sendUserMessage = async (content: string) => {
    if (!selectedChatId || !selectedChat) return;
    
    setIsLoading(true);
    setError(null);

    try {
      const userMessage: Message = {
        content,
        transcripts: [],
        role: "user",
        timestamp: new Date(),
        id: crypto.randomUUID(),
      };

      if (selectedChat.messages.length === 0) {
        await sendMessage(init_message);
      }

      await sendMessage(userMessage);
      const chat = await loadChat(selectedChatId);
      const aiResponse = await sendChat(chat.messages, userMessage);

      if (!aiResponse?.ok) {
        throw new Error("Failed to send message");
      }

      const aiResponseData = await aiResponse.json();
      const aiMessage: Message = {
        content: aiResponseData.response,
        transcripts: aiResponseData.timestamps,
        role: "assistant",
        timestamp: new Date(),
        id: crypto.randomUUID(),
      };

      await sendMessage(aiMessage);

      const chatLength = (await loadChat(selectedChatId)).messages.length;
      if (chatLength === 3) {
        const name = await getNameForNewChat(userMessage.content, aiMessage.content);
        if (name) updateChatName(selectedChatId, name);
      }
    } catch (err) {
      setError(err instanceof Error ? err : new Error('Failed to send message'));
    } finally {
      setIsLoading(false);
    }
  };

  return {
    selectedChat,
    selectedChatId,
    isLoading,
    error,
    sendUserMessage,
  };
}