Marketplace inversée (Next.js 16 App Router + Supabase Cloud) : auth, schéma + RLS, publication de besoins avec upload d'images, feed avec filtres, offres, acceptation via RPC, messagerie temps réel, dashboards, et Dockerfile pour déploiement Coolify.
45 lines
1.1 KiB
TypeScript
45 lines
1.1 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { Geist, Geist_Mono } from "next/font/google";
|
|
import "./globals.css";
|
|
import { getCurrentUser } from "@/lib/dal";
|
|
import { Navbar } from "@/components/layout/navbar";
|
|
import { Footer } from "@/components/layout/footer";
|
|
import { Toaster } from "@/components/ui/sonner";
|
|
|
|
const geistSans = Geist({
|
|
variable: "--font-geist-sans",
|
|
subsets: ["latin"],
|
|
});
|
|
|
|
const geistMono = Geist_Mono({
|
|
variable: "--font-geist-mono",
|
|
subsets: ["latin"],
|
|
});
|
|
|
|
export const metadata: Metadata = {
|
|
title: "WaMarket",
|
|
description: "Postez un besoin, recevez des offres de commerçants près de chez vous.",
|
|
};
|
|
|
|
export default async function RootLayout({
|
|
children,
|
|
}: Readonly<{
|
|
children: React.ReactNode;
|
|
}>) {
|
|
const user = await getCurrentUser();
|
|
|
|
return (
|
|
<html
|
|
lang="fr"
|
|
className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
|
|
>
|
|
<body className="flex min-h-full flex-col">
|
|
<Navbar user={user} />
|
|
<div className="flex-1">{children}</div>
|
|
<Footer />
|
|
<Toaster />
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|