Files

101 lines
3.1 KiB
TypeScript

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<Metadata> {
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 <MessagesUnsupported />;
}
const cookie = authCookieHeader(await cookies());
const me = await getMeCached(cookie || undefined);
if (!me.user) {
redirect(`/login?redirect=${encodeURIComponent(`/chat/${id}`)}`);
}
let rooms: Awaited<ReturnType<typeof fetchChatRooms>>["rooms"] = [];
try {
const data = await fetchChatRooms(1, 50, "", cookie, "joined");
rooms = data.rooms || [];
} catch {
rooms = [];
}
let room: Awaited<ReturnType<typeof fetchChatRoom>>["room"];
try {
({ room } = await fetchChatRoom(id, cookie));
} catch {
notFound();
}
let initialMessages: Awaited<ReturnType<typeof fetchChatMessages>> = {
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 (
<ChatShell meId={me.user.id} initialRooms={rooms} activeRoomId={room.id}>
<ChatRoomClient
roomId={room.id}
roomName={displayName}
roomDescription={room.description}
ownerId={room.owner_id}
memberCount={room.member_count}
myRole={room.my_role}
joined={room.joined}
isPrivate={room.is_private}
isDefault={room.is_default}
roomType={room.room_type || "group"}
peer={room.peer || null}
meId={me.user.id}
meRole={me.user.role}
canManageMessages={!!me.user.can_manage_messages}
meName={me.user.nickname || me.user.username}
meAvatar={me.user.avatar || ""}
initialMessages={initialMessages.messages}
initialHasMore={initialMessages.has_more}
embedded
/>
</ChatShell>
);
}