Spaces:
Runtime error
Runtime error
"use client"; | |
import React from "react"; | |
import { ChatRequestOptions } from "ai"; | |
import { useChat } from "ai/react"; | |
import { toast } from "sonner"; | |
import useLocalStorageState from "use-local-storage-state"; | |
import { v4 as uuidv4 } from "uuid"; | |
import { ChatLayout } from "@/components/chat/chat-layout"; | |
import { ChatOptions } from "@/components/chat/chat-options"; | |
import { basePath } from "@/lib/utils"; | |
interface ChatPageProps { | |
chatId: string; | |
setChatId: React.Dispatch<React.SetStateAction<string>>; | |
} | |
export default function ChatPage({ chatId, setChatId }: ChatPageProps) { | |
const { | |
messages, | |
input, | |
handleInputChange, | |
handleSubmit, | |
isLoading, | |
error, | |
stop, | |
setMessages, | |
} = useChat({ | |
api: basePath + "/api/chat", | |
streamMode: "text", | |
onError: (error) => { | |
toast.error("Something went wrong: " + error); | |
}, | |
}); | |
const [chatOptions, setChatOptions] = useLocalStorageState<ChatOptions>( | |
"chatOptions", | |
{ | |
defaultValue: { | |
selectedModel: "", | |
systemPrompt: "", | |
temperature: 0.9, | |
}, | |
} | |
); | |
React.useEffect(() => { | |
if (chatId) { | |
const item = localStorage.getItem(`chat_${chatId}`); | |
if (item) { | |
setMessages(JSON.parse(item)); | |
} | |
} else { | |
setMessages([]); | |
} | |
}, [setMessages, chatId]); | |
React.useEffect(() => { | |
if (!isLoading && !error && chatId && messages.length > 0) { | |
// Save messages to local storage | |
localStorage.setItem(`chat_${chatId}`, JSON.stringify(messages)); | |
// Trigger the storage event to update the sidebar component | |
window.dispatchEvent(new Event("storage")); | |
} | |
}, [messages, chatId, isLoading, error]); | |
const onSubmit = (e: React.FormEvent<HTMLFormElement>) => { | |
e.preventDefault(); | |
if (messages.length === 0) { | |
// Generate a random id for the chat | |
const id = uuidv4(); | |
setChatId(id); | |
} | |
setMessages([...messages]); | |
// Prepare the options object with additional body data, to pass the model. | |
const requestOptions: ChatRequestOptions = { | |
options: { | |
body: { | |
chatOptions: chatOptions, | |
}, | |
}, | |
}; | |
// Call the handleSubmit function with the options | |
handleSubmit(e, requestOptions); | |
}; | |
return ( | |
<main className="flex h-[calc(100dvh)] flex-col items-center "> | |
<ChatLayout | |
chatId={chatId} | |
setChatId={setChatId} | |
chatOptions={chatOptions} | |
setChatOptions={setChatOptions} | |
messages={messages} | |
input={input} | |
handleInputChange={handleInputChange} | |
handleSubmit={onSubmit} | |
isLoading={isLoading} | |
error={error} | |
stop={stop} | |
navCollapsedSize={10} | |
defaultLayout={[30, 160]} | |
/> | |
</main> | |
); | |
} | |