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