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