chatbot-template/app/chat/[id]/page.tsx

57 lines
1.4 KiB
TypeScript
Raw Normal View History

2023-05-19 12:33:56 -04:00
import { Sidebar } from "@/app/sidebar";
2023-05-22 10:16:09 -04:00
import { auth } from "@/auth";
2023-06-02 15:15:35 -04:00
import { type Metadata } from "next";
2023-06-02 11:57:44 -04:00
import { Chat } from "@/app/chat";
2023-06-02 15:15:35 -04:00
import { type Chat as ChatType } from "@/lib/types";
import { kv } from "@vercel/kv";
2023-06-02 11:57:44 -04:00
import { Message } from "ai-connector";
2023-06-02 13:29:54 -04:00
export const runtime = "edge";
export const preferredRegion = "home";
2023-05-19 12:33:56 -04:00
export interface ChatPageProps {
params: {
id: string;
};
}
export async function generateMetadata({
params,
}: ChatPageProps): Promise<Metadata> {
2023-06-02 15:15:35 -04:00
const session = await auth();
const chat = await getChat(params.id, session?.user?.email ?? "");
2023-05-19 12:33:56 -04:00
return {
title: chat?.title.slice(0, 50) ?? "Chat",
};
}
export default async function ChatPage({ params }: ChatPageProps) {
2023-05-22 10:16:09 -04:00
const session = await auth();
2023-06-02 15:15:35 -04:00
const chat = await getChat(params.id, session?.user?.email ?? "");
2023-05-19 12:33:56 -04:00
return (
<div className="relative flex h-full w-full overflow-hidden">
<Sidebar session={session} />
<div className="flex h-full min-w-0 flex-1 flex-col">
2023-06-02 11:57:44 -04:00
<Chat id={chat.id} initialMessages={chat.messages as Message[]} />
2023-05-19 12:33:56 -04:00
</div>
</div>
);
}
ChatPage.displayName = "ChatPage";
2023-06-02 15:15:35 -04:00
async function getChat(id: string, userId: string) {
const chat = await kv.hgetall<ChatType>(`chat:${id}`);
if (!chat) {
throw new Error("Not found");
}
if (userId && chat.userId !== userId) {
throw new Error("Unauthorized");
}
return chat;
}