import { redirect } from "next/navigation"; import { Query } from "node-appwrite"; import { getActiveContext } from "@/lib/appwrite/active-context"; import { getLogoUrl } from "@/lib/appwrite/storage"; import { createAdminClient, createSessionClient } from "@/lib/appwrite/server"; import { DATABASE_ID, TABLES } from "@/lib/appwrite/schema"; import type { ThemePrefs } from "@/lib/appwrite/theme-prefs-actions"; import { DashboardShell } from "./dashboard-shell"; export default async function DashboardLayout({ children, }: { children: React.ReactNode; }) { const ctx = await getActiveContext(); if (!ctx) redirect("/onboarding"); let pendingMatchCount = 0; try { const { tablesDB } = createAdminClient(); const res = await tablesDB.listRows({ databaseId: DATABASE_ID, tableId: TABLES.propertyMatches, queries: [Query.equal("tenantId", ctx.tenantId), Query.equal("notified", false), Query.limit(1)], }); pendingMatchCount = res.total; } catch { /* non-critical */ } let themePrefs: ThemePrefs = {}; try { const { account } = await createSessionClient(); const raw = await account.getPrefs(); // getPrefs returns an Appwrite prototype object — serialize to plain object // so Next.js can pass it from Server → Client Component themePrefs = JSON.parse(JSON.stringify(raw)) as ThemePrefs; } catch { // use defaults if prefs unavailable } const company = { id: ctx.tenantId, name: ctx.settings?.officeName ?? "Çalışma alanı", logoUrl: getLogoUrl(ctx.settings?.logo) ?? null, }; const user = { id: ctx.user.id, name: ctx.user.name || ctx.user.email, email: ctx.user.email, }; return ( {children} ); }