3644e081b1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
51 lines
2.0 KiB
TypeScript
51 lines
2.0 KiB
TypeScript
import { redirect } from "next/navigation";
|
||
import { Suspense } from "react";
|
||
import { AppHeader } from "@/components/layout/app-header";
|
||
import { AppShellFallback } from "@/components/layout/app-shell-fallback";
|
||
import { AppSidebar } from "@/components/layout/app-sidebar";
|
||
import { BottomNav } from "@/components/layout/bottom-nav";
|
||
import { QuickAddProvider } from "@/components/layout/quick-add";
|
||
import { SidebarInset, SidebarProvider } from "@/components/ui/sidebar";
|
||
import { hasHouseholdRole } from "@/features/households/roles";
|
||
import { getHouseholdContext } from "@/lib/dal";
|
||
import { APP_VERSION } from "@/lib/version";
|
||
|
||
/**
|
||
* Oturum gerektiren alan. Oturum okuması istek anında yapılır (Cache Components), bu yüzden
|
||
* kullanıcıya bağlı kabuk Suspense içinde render edilir. Her sayfa ayrıca kendi yetkisini
|
||
* DAL üzerinden kontrol eder (layout istemci gezinmesinde yeniden çalışmaz).
|
||
*/
|
||
export default function AppLayout({ children }: { children: React.ReactNode }) {
|
||
return (
|
||
<Suspense fallback={<AppShellFallback />}>
|
||
<AuthenticatedShell>{children}</AuthenticatedShell>
|
||
</Suspense>
|
||
);
|
||
}
|
||
|
||
async function AuthenticatedShell({ children }: { children: React.ReactNode }) {
|
||
const ctx = await getHouseholdContext();
|
||
if (!ctx) redirect("/login");
|
||
const { user, household, memberships } = ctx;
|
||
const canWrite = household ? hasHouseholdRole(household.role, "member") : false;
|
||
return (
|
||
<SidebarProvider>
|
||
<QuickAddProvider>
|
||
<AppSidebar isAdmin={user.role === "admin"} version={APP_VERSION} />
|
||
<SidebarInset>
|
||
<AppHeader
|
||
user={user}
|
||
households={memberships}
|
||
activeHouseholdId={household?.id}
|
||
canWrite={canWrite}
|
||
version={APP_VERSION}
|
||
/>
|
||
{/* Mobilde alt menü yüksekliği kadar boşluk */}
|
||
<div className="flex flex-1 flex-col gap-4 p-4 pb-24 md:p-6 md:pb-6">{children}</div>
|
||
</SidebarInset>
|
||
<BottomNav canWrite={canWrite} />
|
||
</QuickAddProvider>
|
||
</SidebarProvider>
|
||
);
|
||
}
|