import { count, eq, inArray } from "drizzle-orm"; import Image from "next/image"; import type { Session } from "next-auth"; import { signOutAndRevokeTicket } from "@/actions/sessions"; import { HeaderUserIdentity } from "@/components/header-user-identity"; import Link from "@/components/link"; import { LiveOnlineCount } from "@/components/live-online-count"; import { RoomQuickEntry } from "@/components/room-quick-entry"; import { UserAvatarThumbnail } from "@/components/shared/user-avatar-thumbnail"; import { cached } from "@/lib/cache"; import { db, MessengerFriendrequests, MessengerOffline, User, UsersCurrency, } from "@/lib/db"; import { resolveHotelName } from "@/lib/hotel-name"; import { canAccess, getApiAdminContext, PERMS } from "@/lib/permissions"; function Currency({ icon, amount, label, }: { icon: string; amount: number; label: string; }) { const textColor = "var(--color-navbar-text-readable, var(--color-navbar-text))"; const valueColor = "var(--color-navbar-text-readable, var(--color-navbar-text, var(--color-text)))"; return (
{amount.toLocaleString()} {" "} {label}
); } export async function TopHeader({ session }: { session: Session | null }) { if (!session?.user?.id) return null; const id = Number(session.user.id); let credits = 0; let duckets = 0; let diamonds = 0; let look = ""; try { const [[user], currencies] = await Promise.all([ db .select({ credits: User.credits, look: User.look }) .from(User) .where(eq(User.id, id)) .limit(1), db .select({ type: UsersCurrency.type, amount: UsersCurrency.amount }) .from(UsersCurrency) .where(eq(UsersCurrency.userId, id)), ]); credits = user?.credits ?? 0; look = user?.look ?? ""; for (const c of currencies) { if (c.type === 0) duckets = c.amount; if (c.type === 5) diamonds = c.amount; } } catch {} let showAdmin = false; let showMod = false; const ctx = await getApiAdminContext(); if (ctx) { showAdmin = canAccess( ctx.permissions, PERMS.ADMIN_DASHBOARD, ctx.session.user.rank, ); showMod = canAccess(ctx.permissions, PERMS.MOD_DASHBOARD, ctx.session.user.rank) || canAccess( ctx.permissions, PERMS.MODERATION_VIEW, ctx.session.user.rank, ) || canAccess(ctx.permissions, PERMS.MOD_CFH_VIEW, ctx.session.user.rank) || canAccess(ctx.permissions, PERMS.MOD_ACTIONS, ctx.session.user.rank); } const textColor = "var(--color-navbar-text-readable, var(--color-navbar-text, var(--color-text)))"; const hotelName = await resolveHotelName(); let online: number; try { online = 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 { online = 0; } let unreadMessages = 0; let pendingFriendRequests = 0; try { const [unreadRows, pendingRows] = await Promise.all([ db .select({ total: count() }) .from(MessengerOffline) .where(eq(MessengerOffline.userId, id)), db .select({ total: count() }) .from(MessengerFriendrequests) .where(eq(MessengerFriendrequests.userToId, id)), ]); unreadMessages = unreadRows[0]?.total ?? 0; pendingFriendRequests = pendingRows[0]?.total ?? 0; } catch {} const friendRequests = await db .select({ userFromId: MessengerFriendrequests.userFromId }) .from(MessengerFriendrequests) .where(eq(MessengerFriendrequests.userToId, id)) .catch(() => [] as { userFromId: number }[]); const friendRequestUsers = friendRequests.length ? await db .select({ id: User.id, username: User.username, look: User.look, }) .from(User) .where( inArray( User.id, friendRequests.map((r) => r.userFromId), ), ) .catch(() => [] as { id: number; username: string; look: string }[]) : []; const totalNotifications = unreadMessages + pendingFriendRequests; return (
Enter
{totalNotifications > 0 && ( {totalNotifications > 99 ? "99+" : totalNotifications} )} {showAdmin || showMod ? (
Staff Staff
{showMod ? ( Mod panel ) : null} {showAdmin ? ( <> Admin panel Commandocentrum Logs ) : null} Logo generator
) : null}
My dashboard My profile User settings Two-factor Login activity {pendingFriendRequests > 0 && ( <>

Friend requests ({pendingFriendRequests})

{friendRequestUsers.slice(0, 3).map((u) => ( {u.username} ))} {friendRequestUsers.length > 3 && (

+{friendRequestUsers.length - 3} more

)}
)}
); }