CI / quality (push) Canceled after 0s
A template.tsx is re-created on every navigation, resetting AnimatePresence so neither enter nor exit ran. Move the transition into a PageTransition client component rendered in the persistent (site) layout, so AnimatePresence survives navigations and the old page animates out before the new one in.
61 lines
2.2 KiB
TypeScript
61 lines
2.2 KiB
TypeScript
import type { ReactNode } from "react";
|
|
import { unstable_noStore as noStore } from "next/cache";
|
|
import { getLocale } from "next-intl/server";
|
|
import { redirect } from "next/navigation";
|
|
|
|
import { SiteAmbientBackdrop } from "@/components/layout/site-ambient-backdrop";
|
|
import { PageTransition } from "@/components/layout/page-transition";
|
|
import { SiteDock } from "@/components/layout/site-dock";
|
|
import { SiteFooter } from "@/components/layout/site-footer";
|
|
import { ScrollSmootherProvider } from "@/components/scroll-smoother-provider";
|
|
import { isSuperAdmin } from "@/lib/admin-auth";
|
|
import { getMaintenanceMode, getSiteSettings } from "@/lib/app-config";
|
|
import { getLocalizedPath, resolveLocale } from "@/lib/locale";
|
|
|
|
type SiteLayoutProps = {
|
|
children: ReactNode;
|
|
params: Promise<{
|
|
locale: string;
|
|
}>;
|
|
};
|
|
|
|
export const dynamic = "force-dynamic";
|
|
export const revalidate = 0;
|
|
|
|
export default async function SiteLayout({ children, params }: SiteLayoutProps) {
|
|
noStore();
|
|
await params;
|
|
const [maintenanceEnabled, siteSettings] = await Promise.all([
|
|
getMaintenanceMode(),
|
|
getSiteSettings(),
|
|
]);
|
|
const localeKey = resolveLocale(await getLocale().catch(() => siteSettings.defaultLocale), siteSettings.defaultLocale);
|
|
// Server-side decision only. The header receives just this boolean and uses
|
|
// it purely to show/hide the Admin shortcut link — it grants no access by
|
|
// itself. Every admin page/action re-checks the session independently, so
|
|
// this value is not a security boundary, only a UI convenience.
|
|
const authenticated = await isSuperAdmin();
|
|
|
|
if (maintenanceEnabled && !authenticated) {
|
|
redirect(getLocalizedPath(localeKey, "/coming-soon", siteSettings.defaultLocale));
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<ScrollSmootherProvider />
|
|
<SiteAmbientBackdrop />
|
|
<SiteDock defaultLocale={siteSettings.defaultLocale} isSuperAdmin={authenticated} />
|
|
<div id="smooth-wrapper">
|
|
<div id="smooth-content">
|
|
<div className="site-content-frame flex min-h-screen flex-col">
|
|
<main className="flex-1">
|
|
<PageTransition>{children}</PageTransition>
|
|
</main>
|
|
<SiteFooter defaultLocale={siteSettings.defaultLocale} />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</>
|
|
);
|
|
}
|