feat: hide all demo badges when demo mode is disabled
All checks were successful
Staging Build / build (push) Successful in 2m36s
All checks were successful
Staging Build / build (push) Successful in 2m36s
This commit is contained in:
@@ -3,6 +3,7 @@ import { LayoutDashboard, Package, Settings, Users, LogOut, LayoutGrid, Shopping
|
|||||||
import { redirect } from 'next/navigation'
|
import { redirect } from 'next/navigation'
|
||||||
import { createClient } from '@/lib/supabase/server'
|
import { createClient } from '@/lib/supabase/server'
|
||||||
import { AdminLogoutButton } from '@/components/admin/logout-menu-item'
|
import { AdminLogoutButton } from '@/components/admin/logout-menu-item'
|
||||||
|
import { DemoWrapper } from '@/components/DemoWrapper'
|
||||||
|
|
||||||
export default async function AdminLayout({
|
export default async function AdminLayout({
|
||||||
children,
|
children,
|
||||||
@@ -67,9 +68,11 @@ export default async function AdminLayout({
|
|||||||
<AdminLogoutButton />
|
<AdminLogoutButton />
|
||||||
<div className="px-3 pt-2 flex items-center gap-2 border-t border-white/5 opacity-60">
|
<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="font-bold text-sm tracking-tighter text-white">CASPOS Store</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">
|
<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
|
Demo
|
||||||
</span>
|
</span>
|
||||||
|
</DemoWrapper>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</aside>
|
</aside>
|
||||||
|
|||||||
34
shop/components/DemoWrapper.tsx
Normal file
34
shop/components/DemoWrapper.tsx
Normal 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}</>;
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { usePathname } from "next/navigation";
|
import { usePathname } from "next/navigation";
|
||||||
|
import { DemoWrapper } from "./DemoWrapper";
|
||||||
|
|
||||||
interface HeaderWrapperProps {
|
interface HeaderWrapperProps {
|
||||||
navbar: React.ReactNode;
|
navbar: React.ReactNode;
|
||||||
@@ -18,12 +19,14 @@ export function HeaderWrapper({ navbar, children }: HeaderWrapperProps) {
|
|||||||
return (
|
return (
|
||||||
<div className="flex flex-col min-h-screen bg-slate-50 text-slate-900 dark:bg-[#020617] dark:text-white">
|
<div className="flex flex-col min-h-screen bg-slate-50 text-slate-900 dark:bg-[#020617] dark:text-white">
|
||||||
{/* Demo Banner */}
|
{/* Demo Banner */}
|
||||||
|
<DemoWrapper>
|
||||||
<div
|
<div
|
||||||
id="demo-banner"
|
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"
|
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.
|
⚠️ Dies ist eine **Demo-Webseite (Dummy-Shop)**. Es werden keine echten Bestellungen verarbeitet oder Zahlungen abgewickelt.
|
||||||
</div>
|
</div>
|
||||||
|
</DemoWrapper>
|
||||||
|
|
||||||
{navbar}
|
{navbar}
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { Rocket, Menu, X, User as UserIcon, LogOut } from "lucide-react";
|
|||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { signOut } from "@/lib/actions/auth";
|
import { signOut } from "@/lib/actions/auth";
|
||||||
import { resolveSupabaseUrl } from "@/lib/utils";
|
import { resolveSupabaseUrl } from "@/lib/utils";
|
||||||
|
import { DemoWrapper } from "./DemoWrapper";
|
||||||
|
|
||||||
interface NavbarClientProps {
|
interface NavbarClientProps {
|
||||||
user: User | null;
|
user: User | null;
|
||||||
@@ -71,18 +72,6 @@ export function NavbarClient({ user, role = "partner" }: NavbarClientProps) {
|
|||||||
};
|
};
|
||||||
}, [supabase]);
|
}, [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 () => {
|
const handleSignOut = async () => {
|
||||||
try {
|
try {
|
||||||
await signOut();
|
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">
|
<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="/">
|
<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="font-bold text-xl tracking-tighter text-white">CASPOS Store</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">
|
<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
|
Demo
|
||||||
</span>
|
</span>
|
||||||
|
</DemoWrapper>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
{/* Desktop Navigation */}
|
{/* Desktop Navigation */}
|
||||||
|
|||||||
Reference in New Issue
Block a user