Remove the per-route 'export const instant = false' opt-outs now that the root layout carries the single Cache Components opt-out. Child pages inherit the opt-out, so admin/mod/radio leaf pages that only access cached or DB data stay instant while runtime-dependent pages remain dynamic. Update the staff-smoke contract test to assert the root-layout contract.
43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
import { count, eq } from "drizzle-orm";
|
|
import { headers } from "next/headers";
|
|
import { redirect } from "next/navigation";
|
|
import { auth } from "@/lib/auth";
|
|
import { issueSsoTicket } from "@/lib/auth/sso-ticket";
|
|
import { cached } from "@/lib/cache";
|
|
import { db, User } from "@/lib/db";
|
|
import { resolveHotelName } from "@/lib/hotel-name";
|
|
import { siteSettings } from "@/lib/services/site-settings";
|
|
import { ClientView } from "./client-view";
|
|
|
|
export default async function ClientPage() {
|
|
const session = await auth();
|
|
if (!session?.user?.id) redirect("/login");
|
|
|
|
const userId = Number(session.user.id);
|
|
|
|
const [hotelName, clientUrl] = await Promise.all([
|
|
resolveHotelName(),
|
|
siteSettings.get("nitro_client_url", ""),
|
|
]);
|
|
|
|
const ip = (await headers()).get("x-real-client-ip") ?? "0.0.0.0";
|
|
const ticket = await issueSsoTicket(userId, hotelName, ip);
|
|
|
|
const onlineCount = await cached("online_count", 10_000, async () => {
|
|
const [row] = await db
|
|
.select({ total: count() })
|
|
.from(User)
|
|
.where(eq(User.online, "1"));
|
|
return row?.total ?? 0;
|
|
}).catch(() => 0);
|
|
|
|
return (
|
|
<ClientView
|
|
ticket={ticket}
|
|
clientUrl={clientUrl || "/nitro-client/"}
|
|
hotelName={hotelName}
|
|
initialOnline={onlineCount}
|
|
/>
|
|
);
|
|
}
|