TypeScript 61.9%
HTML 37.2%
SQL 0.7%
1import type { ReactNode } from 'react';2import { headers } from 'next/headers';3import { and, count, eq, isNull } from '@/lib/db';4import { db, notifications } from '@/lib/db';5import { requireUser } from '@/lib/auth/session';6import { AccountNav } from '@/components/account/account-nav';78export default async function AccountLayout({ children }: { children: ReactNode }) {9 const h = await headers();10 const path = h.get('x-invoke-path') ?? h.get('next-url') ?? undefined;11 const user = await requireUser(path);12 const rows = await db().select({ n: count() }).from(notifications).where(and(eq(notifications.userId, user.id), isNull(notifications.readAt)));13 const n = rows[0]?.n ?? 0;14 return (15 <div className="grid grid-cols-[minmax(0,1fr)] gap-6 lg:grid-cols-[200px_minmax(0,1fr)]">16 <aside className="min-w-0 lg:sticky lg:top-[calc(var(--ri-header-h,52px)+16px)] lg:self-start">17 <div className="mb-3 hidden items-center gap-2 px-2 lg:flex">18 <span className="inline-flex h-7 w-7 items-center justify-center rounded-full bg-accent text-[11px] font-semibold text-accent-fg">{(user.name ?? user.email).slice(0, 1).toUpperCase()}</span>19 <div className="min-w-0">20 <p className="truncate text-[13px] font-medium">{user.name ?? 'Collector'}</p>21 <p className="truncate text-[11px] text-subtle">{user.email}</p>22 </div>23 </div>24 <AccountNav unread={Number(n)} handle={user.handle} />25 </aside>26 <div className="min-w-0">{children}</div>27 </div>28 );29}30