diff --git a/app.json b/app.json new file mode 100644 index 0000000..c9e8c8a --- /dev/null +++ b/app.json @@ -0,0 +1,3 @@ +{ + "expo": {} +} \ No newline at end of file diff --git a/apps/mobile/build-1787184959643.ipa b/apps/mobile/build-1787184959643.ipa deleted file mode 100644 index 6d5326e..0000000 Binary files a/apps/mobile/build-1787184959643.ipa and /dev/null differ diff --git a/apps/mobile/build-1787188470851.ipa b/apps/mobile/build-1787188470851.ipa deleted file mode 100644 index ddcfc96..0000000 Binary files a/apps/mobile/build-1787188470851.ipa and /dev/null differ diff --git a/apps/web/src/app/[slug]/page.tsx b/apps/web/src/app/[slug]/page.tsx new file mode 100644 index 0000000..d90b2ae --- /dev/null +++ b/apps/web/src/app/[slug]/page.tsx @@ -0,0 +1,4 @@ +import PublicMenuPage, { generateMetadata } from "@/app/menu/[slug]/page"; + +export { generateMetadata }; +export default PublicMenuPage; diff --git a/apps/web/src/app/menu/[slug]/page.tsx b/apps/web/src/app/menu/[slug]/page.tsx index 45fe468..4f66972 100644 --- a/apps/web/src/app/menu/[slug]/page.tsx +++ b/apps/web/src/app/menu/[slug]/page.tsx @@ -2,6 +2,7 @@ import type { Metadata } from "next"; import { notFound } from "next/navigation"; import { supabase } from "@/lib/supabase"; import { PublicMenuClient, type MenuCategory, type MenuItem, type RestaurantData } from "@/components/PublicMenuClient"; +import { DEMO_RESTAURANT, DEMO_CATEGORIES } from "@/lib/demo-data"; import type { ThemeConfig } from "@menulio/shared"; type PageProps = { @@ -37,6 +38,8 @@ export async function generateMetadata({ params }: PageProps): Promise if (bySlug) { restaurant = bySlug; + } else if (slug === "demo" || slug === "gusto-brasserie") { + restaurant = DEMO_RESTAURANT; } else { const { data: domainRow } = await supabase .from("domains") @@ -93,24 +96,66 @@ export default async function PublicMenuPage({ params, searchParams }: PageProps } } - if (!restaurant) notFound(); + if (!restaurant) { + if (slug === "demo" || slug === "gusto-brasserie") { + return ( + + ); + } + notFound(); + } - const { data: menu } = await supabase + // Find menu (published or any available menu) + let { data: menu } = await supabase .from("menus") .select("id, name, locations!inner(restaurant_id)") .eq("locations.restaurant_id", restaurant.id) .eq("is_published", true) .maybeSingle(); - if (!menu) notFound(); + if (!menu) { + const { data: anyMenu } = await supabase + .from("menus") + .select("id, name, locations!inner(restaurant_id)") + .eq("locations.restaurant_id", restaurant.id) + .maybeSingle(); + menu = anyMenu; + } - const { data: rawCategories } = await supabase - .from("menu_categories") - .select("id, name, description, is_active, menu_items(id, name, description, price, image_url, is_active)") - .eq("menu_id", menu.id) - .eq("is_active", true) - .order("sort_order", { ascending: true }) - .returns(); + let categories: MenuCategory[] = []; + + if (menu) { + const { data: rawCategories } = await supabase + .from("menu_categories") + .select("id, name, description, is_active, menu_items(id, name, description, price, image_url, is_active)") + .eq("menu_id", menu.id) + .eq("is_active", true) + .order("sort_order", { ascending: true }) + .returns(); + + categories = (rawCategories ?? []).map((cat) => ({ + id: cat.id, + name: cat.name, + description: cat.description, + is_active: cat.is_active, + menu_items: (cat.menu_items ?? []) + .filter((item) => item.is_active) + .map((item): MenuItem => ({ + id: item.id, + name: item.name, + description: item.description, + price: item.price, + image_url: item.image_url, + is_active: item.is_active, + })), + })); + } else if (slug === "demo" || slug === "gusto-brasserie") { + categories = DEMO_CATEGORIES; + } const { data: themeRow } = await supabase .from("restaurant_themes") @@ -122,23 +167,6 @@ export default async function PublicMenuPage({ params, searchParams }: PageProps const themeKey = themeParam || themeRelation?.key || "elegant"; const customConfig = (themeRow?.overrides as Partial) || themeRelation?.config; - const categories: MenuCategory[] = (rawCategories ?? []).map((cat) => ({ - id: cat.id, - name: cat.name, - description: cat.description, - is_active: cat.is_active, - menu_items: (cat.menu_items ?? []) - .filter((item) => item.is_active) - .map((item): MenuItem => ({ - id: item.id, - name: item.name, - description: item.description, - price: item.price, - image_url: item.image_url, - is_active: item.is_active, - })), - })); - const restaurantData: RestaurantData = { id: restaurant.id, name: restaurant.name, diff --git a/eas.json b/eas.json new file mode 100644 index 0000000..0f02510 --- /dev/null +++ b/eas.json @@ -0,0 +1,21 @@ +{ + "cli": { + "version": ">= 22.0.0", + "appVersionSource": "remote" + }, + "build": { + "development": { + "developmentClient": true, + "distribution": "internal" + }, + "preview": { + "distribution": "internal" + }, + "production": { + "autoIncrement": true + } + }, + "submit": { + "production": {} + } +}