diff --git a/admin-spa/src/App.tsx b/admin-spa/src/App.tsx index ba02008..7c0f42f 100644 --- a/admin-spa/src/App.tsx +++ b/admin-spa/src/App.tsx @@ -264,6 +264,8 @@ function AddonRoute({ config }: { config: any }) { function Header({ onFullscreen, fullscreen, showToggle = true }: { onFullscreen: () => void; fullscreen: boolean; showToggle?: boolean }) { const [siteTitle, setSiteTitle] = React.useState((window as any).wnw?.siteTitle || 'WooNooW'); + const [isVisible, setIsVisible] = React.useState(true); + const [lastScrollY, setLastScrollY] = React.useState(0); const isStandalone = window.WNW_CONFIG?.standaloneMode ?? false; // Listen for store settings updates @@ -278,6 +280,35 @@ function Header({ onFullscreen, fullscreen, showToggle = true }: { onFullscreen: return () => window.removeEventListener('woonoow:store:updated' as any, handleStoreUpdate); }, []); + // Hide/show header on scroll (mobile only) + React.useEffect(() => { + const handleScroll = () => { + const currentScrollY = window.scrollY; + + // Only apply on mobile (check window width) + if (window.innerWidth >= 768) { + setIsVisible(true); + return; + } + + if (currentScrollY > lastScrollY && currentScrollY > 50) { + // Scrolling down & past threshold + setIsVisible(false); + } else if (currentScrollY < lastScrollY) { + // Scrolling up + setIsVisible(true); + } + + setLastScrollY(currentScrollY); + }; + + window.addEventListener('scroll', handleScroll, { passive: true }); + + return () => { + window.removeEventListener('scroll', handleScroll); + }; + }, [lastScrollY]); + const handleLogout = async () => { try { await fetch((window.WNW_CONFIG?.restUrl || '') + '/auth/logout', { @@ -291,7 +322,7 @@ function Header({ onFullscreen, fullscreen, showToggle = true }: { onFullscreen: }; return ( -
+
{siteTitle}
{window.WNW_API?.isDev ? 'Dev Server' : 'Production'}
diff --git a/admin-spa/src/components/nav/BottomNav.tsx b/admin-spa/src/components/nav/BottomNav.tsx index ebf31bd..d6978b8 100644 --- a/admin-spa/src/components/nav/BottomNav.tsx +++ b/admin-spa/src/components/nav/BottomNav.tsx @@ -63,7 +63,7 @@ export function BottomNav() { { + switch (page) { + case 'orders': + setFAB({ + icon: , + label: 'Create Order', + onClick: () => navigate('/orders/new'), + visible: true + }); + break; + + case 'products': + setFAB({ + icon: , + label: 'Add Product', + onClick: () => navigate('/products/new'), + visible: true + }); + break; + + case 'customers': + setFAB({ + icon: , + label: 'Add Customer', + onClick: () => navigate('/customers/new'), + visible: true + }); + break; + + case 'coupons': + setFAB({ + icon: , + label: 'Create Coupon', + onClick: () => navigate('/coupons/new'), + visible: true + }); + break; + + case 'dashboard': + // Dashboard could have a speed dial menu in the future + setFAB({ + icon: , + label: 'Quick Actions', + onClick: () => { + // TODO: Implement speed dial menu + console.log('Quick actions menu'); + }, + visible: true + }); + break; + + case 'none': + default: + clearFAB(); + break; + } + + return () => clearFAB(); + }, [page, navigate, setFAB, clearFAB]); +}