SPB Git forge

spb/rareindex

Public
54commits 1branches 0releases
7.1 MBsize
maindefault branch
10 days agolast push
TypeScript 61.9% HTML 37.2% SQL 0.7%
1.5 KB · 30 lines tsx
Raw Blame History
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