Harmonise la liste des notes et l’éditeur (titres, dates, retour), rend la saisie rapide et les raccourcis de l’accueil utilisables sur téléphone, et conserve le panneau latéral repliable.
58 lines
2.2 KiB
TypeScript
58 lines
2.2 KiB
TypeScript
import { Suspense } from "react";
|
|
import { Sidebar } from "@/components/sidebar";
|
|
import { ProvidersWrapper } from "@/components/providers-wrapper";
|
|
import { auth } from "@/auth";
|
|
import { headers } from "next/headers";
|
|
import { detectUserLanguage, parseAcceptLanguage } from "@/lib/i18n/detect-user-language";
|
|
import { loadTranslations } from "@/lib/i18n/load-translations";
|
|
import { getAISettings } from "@/app/actions/ai-settings";
|
|
import { AIChatLayoutBridge } from "@/components/ai-chat-layout-bridge";
|
|
import { MobileNavigationBar } from "@/components/mobile-navigation-bar";
|
|
|
|
|
|
export default async function MainLayout({
|
|
children,
|
|
}: Readonly<{
|
|
children: React.ReactNode;
|
|
}>) {
|
|
const headersList = await headers();
|
|
const browserLang = parseAcceptLanguage(headersList.get("accept-language"));
|
|
|
|
const [session, initialLanguage] = await Promise.all([
|
|
auth(),
|
|
detectUserLanguage(browserLang),
|
|
]);
|
|
|
|
const initialTranslations = await loadTranslations(initialLanguage);
|
|
|
|
const aiSettings = session?.user?.id
|
|
? await getAISettings(session.user.id)
|
|
: null;
|
|
const showAIAssistant = aiSettings?.paragraphRefactor !== false;
|
|
|
|
return (
|
|
<ProvidersWrapper
|
|
initialLanguage={initialLanguage}
|
|
initialTranslations={initialTranslations}
|
|
initialAiProcessingConsent={aiSettings?.aiProcessingConsent === true}
|
|
>
|
|
{/* Fond via --background (suit .dark) — évite le flash beige/clair au changement de route */}
|
|
<div className="flex h-screen overflow-hidden bg-background">
|
|
<Suspense fallback={<div className="hidden w-80 md:w-[26rem] 2xl:w-[30rem] shrink-0 md:block h-full self-stretch bg-sidebar" />}>
|
|
<Sidebar user={session?.user} />
|
|
</Suspense>
|
|
|
|
<main className="flex min-h-0 flex-1 flex-col overflow-y-auto scroll-smooth bg-background" id="main-content">
|
|
<MobileNavigationBar />
|
|
<a href="#main-content" className="sr-only focus:not-sr-only focus:absolute focus:z-[9999] focus:top-2 focus:left-2 focus:bg-brand-accent focus:text-white focus:px-4 focus:py-2 focus:rounded-lg focus:text-sm focus:font-bold">
|
|
Skip to content
|
|
</a>
|
|
{children}
|
|
</main>
|
|
|
|
{showAIAssistant && <AIChatLayoutBridge />}
|
|
</div>
|
|
</ProvidersWrapper>
|
|
);
|
|
}
|