test / src /hooks /useChatLogic.ts
aiioe's picture
Automated build & deploy
e454383 verified
Raw History Blame Contribute Delete
3.13 kB
import React, { useCallback, useRef, useState } from "react";
import { Chat, Message } from "@/lib/types";
import { useChatStore } from "@/stores/chatStore";
import { sendChat, getNameForNewChat } from "@/lib/api";
import { init_message, init_message_meeting_minutes } from "@/lib/prompts";
import { useToast } from "@/hooks/use-toast";
export const useChatLogic = (
selectedChat: Chat | null,
selectedChatId: string | null,
scrollToBottom: () => void
) => {
const [isLoading, setIsLoading] = useState<boolean>(false);
const { toast } = useToast();
const { sendMessage, removeMessage, loadChat, updateChatName } =
useChatStore();
const handleSubmit = useCallback(
async (inputValue: string) => {
const currentInput = inputValue.trim();
if (!currentInput || isLoading || !selectedChatId || !selectedChat)
return;
setIsLoading(true);
let userMessageId = "";
try {
const userMessage: Message = {
content: currentInput,
transcripts: [],
role: "user",
timestamp: new Date(),
id: crypto.randomUUID(),
};
// if (selectedChat.messages.length === 0) {
// // getting the initial message from the environment variable
// const initial_message =
// process.env.NEXT_PUBLIC_INITIAL_MESSAGE == "CLE"
// ? init_message_meeting_minutes
// : process.env.NEXT_PUBLIC_INITIAL_MESSAGE == "CSPE"
// ? init_message
// : init_message_meeting_minutes;
// await sendMessage(initial_message);
// }
userMessageId = 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);
scrollToBottom();
const chatLength = (await loadChat(selectedChatId)).messages.length;
if (chatLength === 3) {
const name = await getNameForNewChat(
userMessage.content,
aiMessage.content
);
if (name) updateChatName(selectedChatId, name);
}
} catch (error) {
console.error("Error in chat submission:", error);
removeMessage(userMessageId);
toast({
title: "Error",
description: "Failed to send message. Please try again.",
variant: "destructive",
});
} finally {
setIsLoading(false);
}
},
[
isLoading,
selectedChatId,
selectedChat,
sendMessage,
loadChat,
updateChatName,
removeMessage,
scrollToBottom,
toast,
]
);
return { isLoading, handleSubmit };
};