Files
membership-fe/src/layouts/AdminLayout.js
2025-12-05 16:40:33 +07:00

73 lines
1.8 KiB
JavaScript

import React, { useState, useEffect } from 'react';
import AdminSidebar from '../components/AdminSidebar';
const AdminLayout = ({ children }) => {
const [sidebarOpen, setSidebarOpen] = useState(true);
const [isMobile, setIsMobile] = useState(false);
// Initialize sidebar state from localStorage
useEffect(() => {
const savedState = localStorage.getItem('adminSidebarOpen');
if (savedState !== null) {
setSidebarOpen(JSON.parse(savedState));
}
}, []);
// Detect mobile viewport
useEffect(() => {
const checkMobile = () => {
setIsMobile(window.innerWidth < 768);
};
checkMobile();
window.addEventListener('resize', checkMobile);
return () => window.removeEventListener('resize', checkMobile);
}, []);
// Close sidebar by default on mobile
useEffect(() => {
if (isMobile) {
setSidebarOpen(false);
}
}, [isMobile]);
const toggleSidebar = () => {
const newState = !sidebarOpen;
setSidebarOpen(newState);
localStorage.setItem('adminSidebarOpen', JSON.stringify(newState));
};
const closeSidebar = () => {
setSidebarOpen(false);
localStorage.setItem('adminSidebarOpen', JSON.stringify(false));
};
return (
<div className="flex h-screen bg-[#FDFCF8]">
{/* Sidebar */}
<AdminSidebar
isOpen={sidebarOpen}
onToggle={toggleSidebar}
isMobile={isMobile}
/>
{/* Mobile Overlay */}
{isMobile && sidebarOpen && (
<div
className="fixed inset-0 bg-black/50 z-30 transition-opacity"
onClick={closeSidebar}
/>
)}
{/* Main Content Area */}
<main className="flex-1 overflow-y-auto">
<div className="max-w-7xl mx-auto px-6 py-8">
{children}
</div>
</main>
</div>
);
};
export default AdminLayout;