kite-menu-lang
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
import type { Metadata } from "next";
|
||||
import { Cormorant_Garamond, Plus_Jakarta_Sans } from "next/font/google";
|
||||
import Script from "next/script";
|
||||
import "../globals.css";
|
||||
|
||||
const cormorant = Cormorant_Garamond({
|
||||
variable: "--font-cormorant",
|
||||
subsets: ["latin"],
|
||||
weight: ["300", "400", "500", "600", "700"],
|
||||
style: ["normal", "italic"],
|
||||
display: "swap",
|
||||
});
|
||||
|
||||
const jakarta = Plus_Jakarta_Sans({
|
||||
variable: "--font-jakarta",
|
||||
subsets: ["latin"],
|
||||
weight: ["300", "400", "500", "600", "700"],
|
||||
display: "swap",
|
||||
});
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Kite Beach Akyaka | Menü",
|
||||
description: "Kite Beach Akyaka dijital menü.",
|
||||
};
|
||||
|
||||
export default async function RootLayout({
|
||||
children,
|
||||
params,
|
||||
}: Readonly<{
|
||||
children: React.ReactNode;
|
||||
params: Promise<{ lang: string }>;
|
||||
}>) {
|
||||
const { lang } = await params;
|
||||
|
||||
return (
|
||||
<html lang={lang} className={`${cormorant.variable} ${jakarta.variable} h-full`}>
|
||||
<body className="min-h-full flex flex-col antialiased" suppressHydrationWarning>
|
||||
{children}
|
||||
{/* VPS Panel Analytics */}
|
||||
<Script
|
||||
src="https://panel.ayris.tech/api/analytics/script"
|
||||
data-domain="https://menu.kitebeachakyaka.com.tr/"
|
||||
strategy="afterInteractive"
|
||||
/>
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
import prisma from "@/lib/prisma";
|
||||
import MenuClient from "../MenuClient";
|
||||
import { MenuCategory } from "@/data/menu";
|
||||
|
||||
async function getMenuData(lang: string): Promise<MenuCategory[]> {
|
||||
const dbCategories = await prisma.categories.findMany({
|
||||
where: { status: 1 },
|
||||
orderBy: { order_num: "asc" },
|
||||
});
|
||||
|
||||
const dbProducts = await prisma.products.findMany({
|
||||
where: { status: 1 },
|
||||
orderBy: [{ category_id: "asc" }, { id: "asc" }],
|
||||
});
|
||||
|
||||
return dbCategories.map((cat) => {
|
||||
const categoryProducts = dbProducts.filter((p) => p.category_id === cat.id);
|
||||
return {
|
||||
id: cat.slug,
|
||||
title: lang === "tr" ? cat.name_tr : cat.name,
|
||||
items: categoryProducts.map((p) => ({
|
||||
id: p.id.toString(),
|
||||
name: lang === "tr" ? p.name_tr : p.name,
|
||||
description: (lang === "tr" ? p.description_tr : p.description) || "",
|
||||
price: p.price.toString() + (lang === "tr" ? " ₺" : " ₺"), // Or maybe dynamic currency formatting
|
||||
image: p.image_url || '/default-product.png',
|
||||
})),
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
async function getSiteSettings() {
|
||||
const settingsData = await prisma.settings.findMany()
|
||||
const settings = settingsData.reduce((acc, curr) => {
|
||||
acc[curr.key] = curr.value
|
||||
return acc
|
||||
}, {} as Record<string, string>)
|
||||
|
||||
return {
|
||||
logoUrl: settings['logo_url'] || '/logo.png',
|
||||
location: settings['location'] || 'Akyaka · Muğla',
|
||||
restaurantName: settings['restaurant_name'] || 'Kite Beach',
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({
|
||||
params,
|
||||
}: {
|
||||
params: Promise<{ lang: string }>;
|
||||
}) {
|
||||
const { lang } = await params;
|
||||
|
||||
const [menuData, siteSettings] = await Promise.all([
|
||||
getMenuData(lang),
|
||||
getSiteSettings(),
|
||||
]);
|
||||
|
||||
return <MenuClient initialCategories={menuData} siteSettings={siteSettings} lang={lang} />;
|
||||
}
|
||||
Reference in New Issue
Block a user