From 796e6618089271c39c40b64f6b5ed811ae4f44a1 Mon Sep 17 00:00:00 2001 From: dwindown Date: Thu, 6 Nov 2025 23:22:18 +0700 Subject: [PATCH] fix: Remove top padding gap and add exit/logout to More page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed 2 issues: 1. Top Padding Gap (pt-16 → removed) Problem: Mobile fullscreen had pt-16 padding creating gap at top Cause: Redundant padding when header is hidden in fullscreen Solution: Removed pt-16 from mobile fullscreen layout Before:
After:
Result: No gap, submenu starts at top-0 ✓ 2. Exit/Logout Buttons in More Page Problem: No way to exit fullscreen or logout from mobile Solution: Added context-aware button to More page WP-Admin Mode: - Shows "Exit Fullscreen" button - Exits fullscreen mode (back to normal WP-admin) Standalone Mode (PWA): - Shows "Logout" button - Redirects to WP-admin login Implementation: - Created AppContext to provide isStandalone and exitFullscreen - Wrapped Shell with AppProvider - More page uses useApp() to get context - Conditional rendering based on mode Files Modified: - App.tsx: Removed pt-16, added AppProvider - AppContext.tsx: New context for app-level state - More/index.tsx: Added Exit/Logout button Result: ✅ No top gap in mobile fullscreen ✅ Exit fullscreen available in WP-admin mode ✅ Logout available in standalone mode ✅ Clean, functional mobile UX! 🎯 --- admin-spa/src/App.tsx | 8 ++++--- admin-spa/src/contexts/AppContext.tsx | 32 ++++++++++++++++++++++++++ admin-spa/src/routes/More/index.tsx | 33 ++++++++++++++++++++++++++- 3 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 admin-spa/src/contexts/AppContext.tsx diff --git a/admin-spa/src/App.tsx b/admin-spa/src/App.tsx index 528f2e7..2d03bec 100644 --- a/admin-spa/src/App.tsx +++ b/admin-spa/src/App.tsx @@ -31,6 +31,7 @@ import DashboardSubmenuBar from './components/nav/DashboardSubmenuBar'; import { DashboardProvider } from '@/contexts/DashboardContext'; import { PageHeaderProvider } from '@/contexts/PageHeaderContext'; import { FABProvider } from '@/contexts/FABContext'; +import { AppProvider } from '@/contexts/AppContext'; import { PageHeader } from '@/components/PageHeader'; import { BottomNav } from '@/components/nav/BottomNav'; import { FAB } from '@/components/FAB'; @@ -447,6 +448,7 @@ function Shell() { const { on, setOn } = useFullscreen(); const { main } = useActiveSection(); const toggle = () => setOn(v => !v); + const exitFullscreen = () => setOn(false); const isDesktop = useIsDesktop(); const location = useLocation(); const scrollContainerRef = React.useRef(null); @@ -463,7 +465,7 @@ function Shell() { const isMorePage = location.pathname === '/more'; return ( - <> + {!isStandalone && } {!isStandalone && }
@@ -485,7 +487,7 @@ function Shell() {
) : ( -
+
{!isMorePage && (isDashboardRoute ? ( @@ -518,7 +520,7 @@ function Shell() {
)}
- +
); } diff --git a/admin-spa/src/contexts/AppContext.tsx b/admin-spa/src/contexts/AppContext.tsx new file mode 100644 index 0000000..c1d18fe --- /dev/null +++ b/admin-spa/src/contexts/AppContext.tsx @@ -0,0 +1,32 @@ +import React, { createContext, useContext, ReactNode } from 'react'; + +interface AppContextType { + isStandalone: boolean; + exitFullscreen?: () => void; +} + +const AppContext = createContext(undefined); + +export function AppProvider({ + children, + isStandalone, + exitFullscreen +}: { + children: ReactNode; + isStandalone: boolean; + exitFullscreen?: () => void; +}) { + return ( + + {children} + + ); +} + +export function useApp() { + const context = useContext(AppContext); + if (context === undefined) { + throw new Error('useApp must be used within an AppProvider'); + } + return context; +} diff --git a/admin-spa/src/routes/More/index.tsx b/admin-spa/src/routes/More/index.tsx index 1412921..410e6cb 100644 --- a/admin-spa/src/routes/More/index.tsx +++ b/admin-spa/src/routes/More/index.tsx @@ -1,8 +1,10 @@ import React, { useEffect } from 'react'; import { useNavigate, Link } from 'react-router-dom'; -import { Tag, Settings as SettingsIcon, ChevronRight } from 'lucide-react'; +import { Tag, Settings as SettingsIcon, ChevronRight, Minimize2, LogOut } from 'lucide-react'; import { __ } from '@/lib/i18n'; import { usePageHeader } from '@/contexts/PageHeaderContext'; +import { useApp } from '@/contexts/AppContext'; +import { Button } from '@/components/ui/button'; interface MenuItem { icon: React.ReactNode; @@ -29,12 +31,18 @@ const menuItems: MenuItem[] = [ export default function MorePage() { const navigate = useNavigate(); const { setPageHeader, clearPageHeader } = usePageHeader(); + const { isStandalone, exitFullscreen } = useApp(); useEffect(() => { setPageHeader(__('More')); return () => clearPageHeader(); }, [setPageHeader, clearPageHeader]); + const handleLogout = () => { + // Clear auth and redirect to login + window.location.href = window.WNW_CONFIG?.wpAdminUrl || '/wp-admin'; + }; + return (
{/* Remove inline header - use PageHeader component instead */} @@ -65,6 +73,29 @@ export default function MorePage() { ))}
+ + {/* Exit Fullscreen / Logout */} +
+ {isStandalone ? ( + + ) : ( + + )} +
); }