feat: hide all demo badges when demo mode is disabled
All checks were successful
Staging Build / build (push) Successful in 2m36s

This commit is contained in:
DanielS
2026-06-24 13:19:00 +02:00
parent 3c60889e2a
commit fe1d15090a
4 changed files with 55 additions and 24 deletions

View File

@@ -3,6 +3,7 @@ import { LayoutDashboard, Package, Settings, Users, LogOut, LayoutGrid, Shopping
import { redirect } from 'next/navigation'
import { createClient } from '@/lib/supabase/server'
import { AdminLogoutButton } from '@/components/admin/logout-menu-item'
import { DemoWrapper } from '@/components/DemoWrapper'
export default async function AdminLayout({
children,
@@ -67,9 +68,11 @@ export default async function AdminLayout({
<AdminLogoutButton />
<div className="px-3 pt-2 flex items-center gap-2 border-t border-white/5 opacity-60">
<span className="font-bold text-sm tracking-tighter text-white">CASPOS Store</span>
<span className="text-[10px] bg-amber-500/20 text-amber-400 px-2 py-0.5 rounded-full font-semibold uppercase tracking-wider border border-amber-500/30">
Demo
</span>
<DemoWrapper>
<span className="text-[10px] bg-amber-500/20 text-amber-400 px-2 py-0.5 rounded-full font-semibold uppercase tracking-wider border border-amber-500/30">
Demo
</span>
</DemoWrapper>
</div>
</div>
</aside>

View File

@@ -0,0 +1,34 @@
"use client";
import { useEffect, useState } from "react";
interface DemoWrapperProps {
children: React.ReactNode;
}
export function DemoWrapper({ children }: DemoWrapperProps) {
const [showDemo, setShowDemo] = useState<boolean>(true);
const [isMounted, setIsMounted] = useState<boolean>(false);
useEffect(() => {
setIsMounted(true);
const checkDemo = () => {
const disabled = localStorage.getItem('demo_banner_disabled') === 'true';
setShowDemo(!disabled);
};
checkDemo();
window.addEventListener('storage_demo_changed', checkDemo);
return () => window.removeEventListener('storage_demo_changed', checkDemo);
}, []);
if (!isMounted) {
return <>{children}</>;
}
if (!showDemo) {
return null;
}
return <>{children}</>;
}

View File

@@ -1,6 +1,7 @@
"use client";
import { usePathname } from "next/navigation";
import { DemoWrapper } from "./DemoWrapper";
interface HeaderWrapperProps {
navbar: React.ReactNode;
@@ -18,12 +19,14 @@ export function HeaderWrapper({ navbar, children }: HeaderWrapperProps) {
return (
<div className="flex flex-col min-h-screen bg-slate-50 text-slate-900 dark:bg-[#020617] dark:text-white">
{/* Demo Banner */}
<div
id="demo-banner"
className="bg-amber-500/10 border-b border-amber-500/20 py-2 px-4 text-center text-xs text-amber-600 dark:text-amber-400 font-medium tracking-wide z-50"
>
Dies ist eine **Demo-Webseite (Dummy-Shop)**. Es werden keine echten Bestellungen verarbeitet oder Zahlungen abgewickelt.
</div>
<DemoWrapper>
<div
id="demo-banner"
className="bg-amber-500/10 border-b border-amber-500/20 py-2 px-4 text-center text-xs text-amber-600 dark:text-amber-400 font-medium tracking-wide z-50"
>
Dies ist eine **Demo-Webseite (Dummy-Shop)**. Es werden keine echten Bestellungen verarbeitet oder Zahlungen abgewickelt.
</div>
</DemoWrapper>
{navbar}

View File

@@ -9,6 +9,7 @@ import { Rocket, Menu, X, User as UserIcon, LogOut } from "lucide-react";
import { Button } from "@/components/ui/button";
import { signOut } from "@/lib/actions/auth";
import { resolveSupabaseUrl } from "@/lib/utils";
import { DemoWrapper } from "./DemoWrapper";
interface NavbarClientProps {
user: User | null;
@@ -71,18 +72,6 @@ export function NavbarClient({ user, role = "partner" }: NavbarClientProps) {
};
}, [supabase]);
useEffect(() => {
const checkBanner = () => {
const disabled = localStorage.getItem('demo_banner_disabled') === 'true';
const banner = document.getElementById('demo-banner');
if (banner) banner.style.display = disabled ? 'none' : 'block';
};
checkBanner();
window.addEventListener('storage_demo_changed', checkBanner);
return () => window.removeEventListener('storage_demo_changed', checkBanner);
}, []);
const handleSignOut = async () => {
try {
await signOut();
@@ -101,9 +90,11 @@ export function NavbarClient({ user, role = "partner" }: NavbarClientProps) {
<header className="px-4 lg:px-6 h-16 flex items-center justify-between border-b border-white/5 backdrop-blur-md sticky top-0 z-50 bg-[#020617]/85">
<Link className="flex items-center justify-center gap-2 group" href="/">
<span className="font-bold text-xl tracking-tighter text-white">CASPOS Store</span>
<span className="text-[10px] bg-amber-500/20 text-amber-400 px-2 py-0.5 rounded-full font-semibold uppercase tracking-wider border border-amber-500/30">
Demo
</span>
<DemoWrapper>
<span className="text-[10px] bg-amber-500/20 text-amber-400 px-2 py-0.5 rounded-full font-semibold uppercase tracking-wider border border-amber-500/30">
Demo
</span>
</DemoWrapper>
</Link>
{/* Desktop Navigation */}