Initial Commit
This commit is contained in:
72
src/layouts/AdminLayout.js
Normal file
72
src/layouts/AdminLayout.js
Normal file
@@ -0,0 +1,72 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user