import type { Metadata } from "next"; import { notFound, redirect } from "next/navigation"; import { cookies } from "next/headers"; import { authCookieHeader } from "@/lib/cookies"; import { getMeCached, getPublicSettingsCached } from "@/lib/serverData"; import { fetchChatRoom, fetchChatMessages, fetchChatRooms } from "@/lib/api"; import ChatShell from "../ChatShell"; import ChatRoomClient from "./ChatRoomClient"; import MessagesUnsupported from "@/components/MessagesUnsupported"; interface PageProps { params: Promise<{ id: string }>; } export async function generateMetadata({ params }: PageProps): Promise { const { id } = await params; if ((await getPublicSettingsCached()).allow_messages === false) { return { title: "本站不支持消息" }; } try { const { room } = await fetchChatRoom(id, authCookieHeader(await cookies())); const title = room.room_type === "direct" ? room.peer?.nickname || room.peer?.username || room.name || "私聊" : room.name; return { title: `消息 · ${title}` }; } catch { return { title: "会话不存在" }; } } export default async function ChatRoomPage({ params }: PageProps) { const { id } = await params; if ((await getPublicSettingsCached()).allow_messages === false) { return ; } const cookie = authCookieHeader(await cookies()); const me = await getMeCached(cookie || undefined); if (!me.user) { redirect(`/login?redirect=${encodeURIComponent(`/chat/${id}`)}`); } let rooms: Awaited>["rooms"] = []; try { const data = await fetchChatRooms(1, 50, "", cookie, "joined"); rooms = data.rooms || []; } catch { rooms = []; } let room: Awaited>["room"]; try { ({ room } = await fetchChatRoom(id, cookie)); } catch { notFound(); } let initialMessages: Awaited> = { messages: [], has_more: false, }; if (room.joined) { try { initialMessages = await fetchChatMessages(id, 0, 30, cookie); } catch { // 客户端兜底 } } const displayName = room.room_type === "direct" ? room.peer?.nickname || room.peer?.username || room.name || "私聊" : room.name; return ( ); }