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