feat(plans): menu watermark on Free (removed by paid feature)

Guest QR menu shows a "ساخته‌شده با میزی" watermark under the menu unless the café's
plan has the `watermark_removed` feature (Starter+).

- PublicMenuDto gains ShowWatermark; PublicService computes it from
  IsFeatureEnabledForCafeAsync("watermark_removed") for both slug and branch menus.
- Guest menu renders the watermark footer when showWatermark.
- NoOpPlatformCatalogService test double (all features on) for the PublicService
  ctor; QrMenuTests updated.

86 tests pass; dashboard tsc clean.
This commit is contained in:
soroush.asadi
2026-06-03 02:10:24 +03:30
parent 2487f9e30f
commit 7d06f149d3
6 changed files with 73 additions and 5 deletions
@@ -65,6 +65,7 @@ export function QrGuestMenu({ code }: QrGuestMenuProps) {
const [tableOrders, setTableOrders] = useState<GuestOrderRef[]>([]);
const [submitting, setSubmitting] = useState(false);
const [menuTheme, setMenuTheme] = useState<CafeTheme | null>(null);
const [showWatermark, setShowWatermark] = useState(false);
const [searchQuery, setSearchQuery] = useState("");
const [view3dItem, setView3dItem] = useState<QrPublicMenuItem | null>(null);
const [security, setSecurity] = useState<PublicSecurityConfig | null>(null);
@@ -111,6 +112,7 @@ export function QrGuestMenu({ code }: QrGuestMenuProps) {
const cats = menu.categories ?? [];
setCategories(cats);
setMenuTheme(normalizeCafeTheme(menu.theme ?? undefined));
setShowWatermark(menu.showWatermark ?? false);
setActiveCategory(QR_ALL_CATEGORY_ID);
if (cats.length === 0) {
setError(t("emptyMenu"));
@@ -565,6 +567,16 @@ export function QrGuestMenu({ code }: QrGuestMenuProps) {
view3d: t("view3d"),
}}
/>
{showWatermark ? (
<a
href="https://meezi.ir"
target="_blank"
rel="noopener noreferrer"
className="flex items-center justify-center gap-1 py-5 text-xs qr-muted opacity-70"
>
ساختهشده با <span className="font-bold">میزی</span>
</a>
) : null}
</div>
{totalItems > 0 ? (
<div className="pointer-events-none fixed inset-x-0 bottom-[3.25rem] z-40 mx-auto max-w-md px-3 pb-1">
+2
View File
@@ -53,6 +53,8 @@ export type QrPublicMenu = {
slug: string;
theme?: CafeTheme | null;
categories: QrPublicMenuCategory[];
/** Free plan shows the Meezi watermark under the menu; paid plans hide it. */
showWatermark?: boolean;
};
export type QrCartLine = {