68 lines
1.8 KiB
TypeScript
68 lines
1.8 KiB
TypeScript
import type React from "react";
|
|
import type { Metadata } from "next";
|
|
import { Geist, Geist_Mono } from "next/font/google";
|
|
import { notFound } from "next/navigation";
|
|
import { NextIntlClientProvider } from "next-intl";
|
|
import "./globals.css";
|
|
import Header from "@/components/layout/Header";
|
|
import MobileBottomNav from "@/components/layout/MobileBar";
|
|
import Footer from "@/components/layout/Footer";
|
|
import { Toaster } from "@/components/ui/sonner";
|
|
import { Providers } from "@/context/Provider";
|
|
import AuthWrapper from "@/context/AuthWrapper";
|
|
import localFont from 'next/font/local'
|
|
|
|
const geistSans = localFont({
|
|
src: '../../public/GeistVF.woff2',
|
|
variable: '--font-geist-sans',
|
|
})
|
|
|
|
export const metadata: Metadata = {
|
|
title: "SmartElectronics",
|
|
description: "E-commerce platform",
|
|
};
|
|
|
|
type Props = {
|
|
children: React.ReactNode;
|
|
params: Promise<{ locale: string }>;
|
|
};
|
|
|
|
const locales = ["ru", "tm"];
|
|
|
|
export function generateStaticParams() {
|
|
return locales.map((locale) => ({ locale }));
|
|
}
|
|
|
|
export default async function RootLayout({ children, params }: Props) {
|
|
const { locale } = await params;
|
|
|
|
if (!locales.includes(locale)) notFound();
|
|
|
|
let messages;
|
|
try {
|
|
messages = (await import(`../../i18n/messages/${locale}.json`)).default;
|
|
} catch {
|
|
messages = {};
|
|
}
|
|
|
|
return (
|
|
<html lang={locale} suppressHydrationWarning>
|
|
<body
|
|
className={`${geistSans.variable} antialiased`}
|
|
>
|
|
<Providers>
|
|
<NextIntlClientProvider locale={locale} messages={messages}>
|
|
<AuthWrapper locale={locale}>
|
|
<Header locale={locale} />
|
|
{children}
|
|
<Footer />
|
|
<MobileBottomNav locale={locale} />
|
|
<Toaster />
|
|
</AuthWrapper>
|
|
</NextIntlClientProvider>
|
|
</Providers>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|